public static void add(Mutator<String> mutator, final String mailbox, final Integer labelId, final LabelCounters labelCounters) { Set<Integer> labelIds = new HashSet<Integer>(1); labelIds.add(labelId); add(mutator, mailbox, labelIds, labelCounters); }
/** * Delete all label counters * * @param mailbox */ public static void deleteAll(Mutator<String> mutator, final String mailbox) { // reset all counters (since delete won't work in most cases) // see: http://cassandra-user-incubator-apache-org.3065146.n2.nabble.com/possible-coming-back-to-life-bug-with-counters-tp6464338p6475427.html Map<Integer, LabelCounters> counters = getAll(mailbox); for (Integer labelId : counters.keySet()) { LabelCounters labelCounters = counters.get(labelId); subtract(mutator, mailbox, labelId, labelCounters); } // delete all label counters mutator.delete(mailbox, CF_COUNTERS, null, strSe); }
@Override public void setCounters(Mailbox mailbox, LabelMap newCounters) { Map<Integer, LabelCounters> existingCounters = LabelCounterPersistence.getAll(mailbox.getId()); // begin batch operation Mutator<String> m = createMutator(keyspace, strSe); // update with the new counter values for (Label label : newCounters.values()) { int labelId = label.getId(); LabelCounters diff = new LabelCounters(label.getCounters()); if (existingCounters.containsKey(labelId)) { diff.add(existingCounters.get(labelId).getInverse()); } logger.debug( "Recalculated counters for label {}:\n\tCurrent: {}\n\tCalculated: {}\n\tDiff: {}", new Object[] { labelId, existingCounters.get(labelId), label.getCounters(), diff }); LabelCounterPersistence.add(m, mailbox.getId(), labelId, diff); } // reset non-existing counters for (int labelId : existingCounters.keySet()) { if (!newCounters.containsId(labelId)) { LabelCounterPersistence.subtract( m, mailbox.getId(), labelId, existingCounters.get(labelId)); } } m.execute(); }
LabelCounters labelCounters = get(mailbox, labelId); subtract(mutator, mailbox, labelId, labelCounters); c = countersToCompositeColumn(labelId, CN_SUBTYPE_MESSAGES, labelCounters.getTotalMessages()); mutator.addDeletion(mailbox, CF_COUNTERS, c.getName(), new CompositeSerializer()); c = countersToCompositeColumn(labelId, CN_SUBTYPE_UNREAD, labelCounters.getTotalMessages()); mutator.addDeletion(mailbox, CF_COUNTERS, c.getName(), new CompositeSerializer()); c = countersToCompositeColumn(labelId, CN_SUBTYPE_BYTES, labelCounters.getTotalMessages()); mutator.addDeletion(mailbox, CF_COUNTERS, c.getName(), new CompositeSerializer());
LabelCounterPersistence.add(mutator, mailbox.getId(), labelId, message.getLabelCounters()); LabelCounterPersistence.subtract(mutator, mailbox.getId(), labelId, message.getLabelCounters()); LabelCounterPersistence.subtract(mutator, mailbox.getId(), message.getLabels(), labelCounters); LabelCounterPersistence.add(mutator, mailbox.getId(), message.getLabels(), labelCounters);
public static void subtract(Mutator<String> mutator, final String mailbox, final Integer labelId, final LabelCounters labelCounters) { Set<Integer> labelIds = new HashSet<Integer>(1); labelIds.add(labelId); subtract(mutator, mailbox, labelIds, labelCounters); }
/** * Get counters for the specified label in the given mailbox * * @param mailbox * @param labelId * @return */ public static LabelCounters get(final String mailbox, final Integer labelId) { Composite startRange = new Composite(); startRange.addComponent(0, CN_TYPE_LABEL, Composite.ComponentEquality.EQUAL); startRange.addComponent(1, labelId.toString(), Composite.ComponentEquality.EQUAL); Composite endRange = new Composite(); endRange.addComponent(0, CN_TYPE_LABEL, Composite.ComponentEquality.EQUAL); endRange.addComponent(1, labelId.toString(), Composite.ComponentEquality.GREATER_THAN_EQUAL); SliceCounterQuery<String, Composite> sliceQuery = createCounterSliceQuery(CassandraDAOFactory.getKeyspace(), strSe, new CompositeSerializer()); sliceQuery.setColumnFamily(CF_COUNTERS); sliceQuery.setKey(mailbox); sliceQuery.setRange(startRange, endRange, false, 5); QueryResult<CounterSlice<Composite>> r = sliceQuery.execute(); Map<Integer, LabelCounters> counters = compositeColumnsToCounters(mailbox, r.get().getColumns()); LabelCounters labelCounters = counters.containsKey(labelId) ? counters.get(labelId) : new LabelCounters(); logger.debug("Fetched counters for single label {} with {}", labelId, labelCounters); return labelCounters; }
@Override public LabelMap getAllWithMetadata(final Mailbox mailbox) throws IOException { // get labels LabelMap labels = AccountPersistence.getLabels(mailbox.getId()); // set labels' counters Map<Integer, LabelCounters> counters = LabelCounterPersistence.getAll(mailbox.getId()); for (int labelId : counters.keySet()) { if (labels.containsId(labelId) && counters.containsKey(labelId)) { labels.get(labelId).setCounters(counters.get(labelId)); } else if (labels.containsId(labelId) && !counters.containsKey(labelId)) { // assume zeros for all counters if not yet initialised labels.get(labelId).setCounters(new LabelCounters()); } else if (!labels.containsId(labelId) && counters.containsKey(labelId)) { logger.warn("Found counters for label {}/{}, but label does not exist.", mailbox.getId(), labelId); } } return labels; }
HCounterColumn<Composite> col = countersToCompositeColumn( labelId, CN_SUBTYPE_BYTES, labelCounters.getTotalBytes()); mutator.addCounter(mailbox, CF_COUNTERS, col); HCounterColumn<Composite> col = countersToCompositeColumn( labelId, CN_SUBTYPE_MESSAGES, labelCounters.getTotalMessages()); mutator.addCounter(mailbox, CF_COUNTERS, col); HCounterColumn<Composite> col = countersToCompositeColumn( labelId, CN_SUBTYPE_UNREAD, labelCounters.getUnreadMessages()); mutator.addCounter(mailbox, CF_COUNTERS, col);
LabelCounterPersistence.deleteAll(m, mailbox.getId());
LabelCounterPersistence.delete(m, mailbox.getId(), labelId);
LabelCounterPersistence.subtract(mutator, mailbox.getId(), labelId, labels.get(labelId).getCounters());
/** * Get counters for all label in the given mailbox * * @param mailbox * @return */ public static Map<Integer, LabelCounters> getAll(final String mailbox) { Composite startRange = new Composite(); startRange.addComponent(0, CN_TYPE_LABEL, Composite.ComponentEquality.EQUAL); Composite endRange = new Composite(); endRange.addComponent(0, CN_TYPE_LABEL, Composite.ComponentEquality.GREATER_THAN_EQUAL); SliceCounterQuery<String, Composite> sliceQuery = createCounterSliceQuery(CassandraDAOFactory.getKeyspace(), strSe, new CompositeSerializer()); sliceQuery.setColumnFamily(CF_COUNTERS); sliceQuery.setKey(mailbox); sliceQuery.setRange(startRange, endRange, false, LabelConstants.MAX_LABEL_ID); QueryResult<CounterSlice<Composite>> r = sliceQuery.execute(); return compositeColumnsToCounters(mailbox, r.get().getColumns()); }
public static void subtract(Mutator<String> mutator, final String mailbox, final Set<Integer> labelIds, final LabelCounters labelCounters) { // perform addition of inverse (i.e. subtraction) add(mutator, mailbox, labelIds, labelCounters.getInverse()); }