/** * Get aggregated {@link LabelCounter} stats for each label in the list of * messages. Results aggregated by label ID. * * @return */ public LabelMap aggregateCountersByLabel() { LabelMap labels = new LabelMap(); // get all labels of all messages, including label "all" for (UUID messageId : this.messages.keySet()) { Set<Integer> messageLabels = this.messages.get(messageId).getLabels(); for (int labelId : messageLabels) { if (!labels.containsId(labelId)) { Label label = new Label(labelId). setCounters(this.messages.get(messageId).getLabelCounters()); labels.put(label); } else { labels.get(labelId).getCounters().add( this.messages.get(messageId).getLabelCounters()); } } } return labels; }
@Override public Map<Integer, String> getAll(final Mailbox mailbox) { return AccountPersistence.getLabels(mailbox.getId()).getNameMap(); }
@Override public String toString() { return toJson().toString(); } }
@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; }
@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(); }
LabelIndexPersistence.remove(mutator, mailbox.getId(), validMessageIds, labels.getIds()); for (Integer labelId : labels.getIds()) { LabelCounterPersistence.subtract(mutator, mailbox.getId(), labelId, labels.get(labelId).getCounters()); LabelIndexPersistence.remove(mutator, mailbox.getId(), invalidMessageIds, allLabels.getIds());
@Override public int add(Mailbox mailbox, Label label) { // get all existing labels LabelMap existingLabels = AccountPersistence.getLabels(mailbox.getId()); LabelUtils.validateLabelName(label.getName(), existingLabels); try { // generate new label id int labelId = LabelUtils.getNewLabelId(existingLabels.getIds()); label.setId(labelId); } catch (IllegalLabelException ile) { // log and rethrow logger.warn("{} reached max random label id attempts with {} labels", mailbox, existingLabels.size()); throw ile; } // begin batch operation Mutator<String> mutator = createMutator(keyspace, strSe); // add new label AccountPersistence.putLabel(mutator, mailbox.getId(), label); // commit batch operation mutator.execute(); return label.getId(); }
@Override public void update(Mailbox mailbox, Label label) throws IOException { // get all existing labels LabelMap existingLabels = AccountPersistence.getLabels(mailbox.getId()); // validate only if name is changed (skips letter case changes) if (label.getName() != null && !existingLabels.containsName(label.getName())) { LabelUtils.validateLabelName(label.getName(), existingLabels); } // check if label id reserved if (ReservedLabels.contains(label.getId())) { throw new ExistingLabelException("This is reserved label and can't be modified"); } // check if label id exists if (!existingLabels.containsId(label.getId())) { throw new IllegalLabelException("Label does not exist"); } // begin batch operation Mutator<String> mutator = createMutator(keyspace, strSe); // set new name AccountPersistence.putLabel(mutator, mailbox.getId(), label); // commit batch operation mutator.execute(); }
if (existingLabels.containsName(labelName)) { throw new ExistingLabelException("Label with this name already exists");
/** * Delete all indexes * * @param mutator * @param mailbox */ public static void deleteIndexes(Mutator<String> mutator, final String mailbox) { // get all labels LabelMap labels = AccountPersistence.getLabels(mailbox); for (Integer labelId : labels.getIds()) { deleteIndex(mutator, mailbox, labelId); } // delete purge index String key = getLabelKey(mailbox, PurgeIndexPersistence.PURGE_LABEL_ID); mutator.addDeletion(key, CF_LABEL_INDEX, null, strSe); }
LabelMap labels = new LabelMap(); String labelName = (String) a.getValue(); if (labels.containsId(labelId)) { labels.get(labelId).setName(labelName); } else { Label label = new Label(labelId, labelName); labels.put(label); String attrValue = (String) a.getValue(); if (labels.containsId(labelId)) { labels.get(labelId).addAttribute(attrName, attrValue); } else { Label label = new Label(labelId); label.addAttribute(attrName, attrValue); labels.put(label); labels.put(label);
@Override public LabelMap scrub(final Mailbox mailbox, final boolean rebuildIndex) LabelMap labels = new LabelMap(); Map<UUID, Message> messages; Set<UUID> purgePendingMessages = new HashSet<UUID>(); if (!labels.containsId(labelId)) { Label label = new Label(labelId).setCounters(message.getLabelCounters()); labels.put(label); } else { labels.get(labelId).incrementCounters(message.getLabelCounters()); logger.debug("Counters state after message {} is {}", messageId, labels.toString());