final long user = r.getUserId();
final long item = r.getItemId();
final Preference p = r.getPreference();
// get the item -> index map for this user
Long2IntMap imap = uiIndexes.get(user);
if (imap == null) {
imap = new Long2IntOpenHashMap();
imap.defaultReturnValue(-1);
uiIndexes.put(user, imap);
}
// have we seen the item?
final int index = imap.get(item);
if (index < 0) { // we've never seen (user,item) before
// if this is not an unrate (a no-op), add the pref
if (p != null) {
int idx = bld.add(p);
imap.put(item, idx);
}
} else { // we have seen this rating before
if (p == null) {
// free the entry, no rating here
bld.release(index);
imap.put(item, -1);
} else {
// just overwrite the previous value
bld.set(index, p);
}
}