@Override
 public Long2ObjectMap<List<Event>> get() {
   Long2ObjectMap<ImmutableList.Builder<Event>> table =
       new Long2ObjectOpenHashMap<ImmutableList.Builder<Event>>();
   Cursor<Event> events = eventDAO.streamEvents();
   try {
     for (Event evt : events) {
       final long iid = evt.getItemId();
       ImmutableList.Builder<Event> list = table.get(iid);
       if (list == null) {
         list = new ImmutableList.Builder<Event>();
         table.put(iid, list);
       }
       list.add(evt);
     }
   } finally {
     events.close();
   }
   Long2ObjectMap<List<Event>> result = new Long2ObjectOpenHashMap<List<Event>>(table.size());
   for (Long2ObjectMap.Entry<ImmutableList.Builder<Event>> evt : table.long2ObjectEntrySet()) {
     result.put(evt.getLongKey(), evt.getValue().build());
     evt.setValue(null);
   }
   return result;
 }
 @Override
 public Long2ObjectMap<UserHistory<Event>> get() {
   Long2ObjectMap<List<Event>> table = new Long2ObjectOpenHashMap<List<Event>>();
   Cursor<Event> events = eventDAO.streamEvents();
   try {
     for (Event evt : events) {
       final long iid = evt.getUserId();
       List<Event> list = table.get(iid);
       if (list == null) {
         list = Lists.newArrayList();
         table.put(iid, list);
       }
       list.add(evt);
     }
   } finally {
     events.close();
   }
   Long2ObjectMap<UserHistory<Event>> result =
       new Long2ObjectOpenHashMap<UserHistory<Event>>(table.size());
   for (Long2ObjectMap.Entry<List<Event>> evt : table.long2ObjectEntrySet()) {
     long user = evt.getLongKey();
     result.put(user, History.forUser(user, evt.getValue()));
     evt.setValue(null);
   }
   return result;
 }
 private void ensureTagCache() {
   if (tagCache == null) {
     synchronized (this) {
       if (tagCache == null) {
         tagCache = new Long2ObjectOpenHashMap<List<String>>();
         ImmutableSet.Builder<String> vocabBuilder = ImmutableSet.builder();
         Cursor<String[]> lines = null;
         try {
           lines = new DelimitedTextCursor(tagFile, ",");
         } catch (FileNotFoundException e) {
           throw new DataAccessException("cannot open file", e);
         }
         try {
           for (String[] line : lines) {
             long mid = Long.parseLong(line[0]);
             List<String> tags = tagCache.get(mid);
             if (tags == null) {
               tags = new ArrayList<String>();
               tagCache.put(mid, tags);
             }
             tags.add(line[1]);
             vocabBuilder.add(line[1]);
           }
         } finally {
           lines.close();
         }
         vocabCache = vocabBuilder.build();
       }
     }
   }
 }
 @Override
 public LongSet get() {
   LongSet us = new LongOpenHashSet();
   Cursor<Event> events = eventDAO.streamEvents();
   try {
     for (Event e : events.fast()) {
       us.add(e.getUserId());
     }
   } finally {
     events.close();
   }
   return us;
 }
 private Long2ObjectMap<String> loadTitleCache() {
   Long2ObjectMap<String> cache = new Long2ObjectOpenHashMap<String>();
   Cursor<String[]> lines = null;
   try {
     lines = new DelimitedTextCursor(titleFile, ",");
   } catch (FileNotFoundException e) {
     throw new DataAccessException("cannot open file", e);
   }
   try {
     for (String[] line : lines) {
       long mid = Long.parseLong(line[0]);
       cache.put(mid, line[1]);
     }
   } finally {
     lines.close();
   }
   return cache;
 }