This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit f51aa1df9443e05bd0d45a56a31853a72be06e71 Author: Benoit Tellier <[email protected]> AuthorDate: Fri Mar 13 21:40:09 2020 +0700 JAMES-3116 Single insert on mailbox counters upon add and remove message --- .../cassandra/mail/CassandraIndexTableHandler.java | 18 ++++---- .../cassandra/mail/CassandraMailboxCounterDAO.java | 18 ++++++++ .../mail/CassandraMailboxCounterDAOTest.java | 51 ++++++++++++++++++++++ .../task/RecomputeMailboxCountersServiceTest.java | 10 ++--- 4 files changed, 82 insertions(+), 15 deletions(-) diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java index 2232234..8fc3d91 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java @@ -61,9 +61,8 @@ public class CassandraIndexTableHandler { return Flux.mergeDelayError(Queues.XS_BUFFER_SIZE, updateFirstUnseenOnDelete(mailboxId, composedMessageIdWithMetaData.getFlags(), composedMessageIdWithMetaData.getComposedMessageId().getUid()), mailboxRecentDAO.removeFromRecent(mailboxId, composedMessageIdWithMetaData.getComposedMessageId().getUid()), - mailboxCounterDAO.decrementCount(mailboxId), deletedMessageDAO.removeDeleted(mailboxId, uid), - decrementUnseenOnDelete(mailboxId, composedMessageIdWithMetaData.getFlags())) + decrementCountersOnDelete(mailboxId, composedMessageIdWithMetaData.getFlags())) .then(); } @@ -74,8 +73,7 @@ public class CassandraIndexTableHandler { checkDeletedOnAdd(mailboxId, message.createFlags(), message.getUid()), updateFirstUnseenOnAdd(mailboxId, message.createFlags(), message.getUid()), addRecentOnSave(mailboxId, message), - incrementUnseenOnSave(mailboxId, flags), - mailboxCounterDAO.incrementCount(mailboxId), + incrementCountersOnSave(mailboxId, flags), applicableFlagDAO.updateApplicableFlags(mailboxId, ImmutableSet.copyOf(flags.getUserFlags()))) .then(); } @@ -100,18 +98,18 @@ public class CassandraIndexTableHandler { } } - private Mono<Void> decrementUnseenOnDelete(CassandraId mailboxId, Flags flags) { + private Mono<Void> decrementCountersOnDelete(CassandraId mailboxId, Flags flags) { if (flags.contains(Flags.Flag.SEEN)) { - return Mono.empty(); + return mailboxCounterDAO.decrementCount(mailboxId); } - return mailboxCounterDAO.decrementUnseen(mailboxId); + return mailboxCounterDAO.decrementUnseenAndCount(mailboxId); } - private Mono<Void> incrementUnseenOnSave(CassandraId mailboxId, Flags flags) { + private Mono<Void> incrementCountersOnSave(CassandraId mailboxId, Flags flags) { if (flags.contains(Flags.Flag.SEEN)) { - return Mono.empty(); + return mailboxCounterDAO.incrementCount(mailboxId); } - return mailboxCounterDAO.incrementUnseen(mailboxId); + return mailboxCounterDAO.incrementUnseenAndCount(mailboxId); } private Mono<Void> addRecentOnSave(CassandraId mailboxId, MailboxMessage message) { diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java index 01f2564..02db4a7 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java @@ -54,6 +54,8 @@ public class CassandraMailboxCounterDAO { private final PreparedStatement removeToCounters; private final PreparedStatement decrementUnseenCountStatement; private final PreparedStatement decrementMessageCountStatement; + private final PreparedStatement incrementUnseenAndCountStatement; + private final PreparedStatement decrementUnseenAndCountStatement; @Inject public CassandraMailboxCounterDAO(Session session) { @@ -71,6 +73,14 @@ public class CassandraMailboxCounterDAO { .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))); decrementMessageCountStatement = updateMailboxStatement(session, decr(COUNT)); decrementUnseenCountStatement = updateMailboxStatement(session, decr(UNSEEN)); + incrementUnseenAndCountStatement = session.prepare(update(TABLE_NAME) + .with(incr(COUNT)) + .and(incr(UNSEEN)) + .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))); + decrementUnseenAndCountStatement = session.prepare(update(TABLE_NAME) + .with(decr(COUNT)) + .and(decr(UNSEEN)) + .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))); } private PreparedStatement createReadStatement(Session session) { @@ -168,6 +178,14 @@ public class CassandraMailboxCounterDAO { return cassandraAsyncExecutor.executeVoid(bindWithMailbox(mailboxId, incrementUnseenCountStatement)); } + public Mono<Void> decrementUnseenAndCount(CassandraId mailboxId) { + return cassandraAsyncExecutor.executeVoid(bindWithMailbox(mailboxId, decrementUnseenAndCountStatement)); + } + + public Mono<Void> incrementUnseenAndCount(CassandraId mailboxId) { + return cassandraAsyncExecutor.executeVoid(bindWithMailbox(mailboxId, incrementUnseenAndCountStatement)); + } + private BoundStatement bindWithMailbox(CassandraId mailboxId, PreparedStatement statement) { return statement.bind() .setUUID(MAILBOX_ID, mailboxId.asUuid()); diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java index 46451c0..7bc43dc 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java @@ -74,6 +74,31 @@ class CassandraMailboxCounterDAOTest { } @Test + void incrementUnseenAndCountShouldAddOneWhenAbsent() { + testee.incrementUnseenAndCount(MAILBOX_ID).block(); + + assertThat(testee.retrieveMailboxCounters(MAILBOX_ID).block()) + .isEqualTo(MailboxCounters.builder() + .mailboxId(MAILBOX_ID) + .count(1) + .unseen(1) + .build()); + } + + @Test + void incrementUnseenAndCountShouldBeApplicableSeveralTimes() { + testee.incrementUnseenAndCount(MAILBOX_ID).block(); + testee.incrementUnseenAndCount(MAILBOX_ID).block(); + + assertThat(testee.retrieveMailboxCounters(MAILBOX_ID).block()) + .isEqualTo(MailboxCounters.builder() + .mailboxId(MAILBOX_ID) + .count(2) + .unseen(2) + .build()); + } + + @Test void incrementUnseenShouldAddOneWhenAbsent() { testee.incrementUnseen(MAILBOX_ID).block(); @@ -182,6 +207,32 @@ class CassandraMailboxCounterDAOTest { } @Test + void decrementUnseenAndCountCanLeadToNegativeValue() { + testee.decrementUnseenAndCount(MAILBOX_ID).block(); + + assertThat(testee.retrieveMailboxCounters(MAILBOX_ID).block()) + .isEqualTo(MailboxCounters.builder() + .mailboxId(MAILBOX_ID) + .count(-1) + .unseen(-1) + .build()); + } + + @Test + void decrementUnseenAndCountShouldRevertIncrementUnseenAndCount() { + testee.incrementUnseenAndCount(MAILBOX_ID).block(); + + testee.decrementUnseenAndCount(MAILBOX_ID).block(); + + assertThat(testee.retrieveMailboxCounters(MAILBOX_ID).block()) + .isEqualTo(MailboxCounters.builder() + .mailboxId(MAILBOX_ID) + .count(0) + .unseen(0) + .build()); + } + + @Test void decrementUnseenCanLeadToNegativeValue() { testee.decrementUnseen(MAILBOX_ID).block(); diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersServiceTest.java index 79b9c94..683e1f7 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersServiceTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersServiceTest.java @@ -108,7 +108,7 @@ class RecomputeMailboxCountersServiceTest { mailboxDAO.save(MAILBOX).block(); imapUidToMessageIdDAO.insert(METADATA_UNSEEN).block(); messageIdToImapUidDAO.insert(METADATA_UNSEEN).block(); - counterDAO.incrementUnseen(CASSANDRA_ID_1).block(); + counterDAO.incrementUnseenAndCount(CASSANDRA_ID_1).block(); counterDAO.incrementCount(CASSANDRA_ID_1).block(); testee.recomputeMailboxCounters(new Context()).block(); @@ -122,7 +122,7 @@ class RecomputeMailboxCountersServiceTest { mailboxDAO.save(MAILBOX).block(); imapUidToMessageIdDAO.insert(METADATA_UNSEEN).block(); messageIdToImapUidDAO.insert(METADATA_SEEN).block(); - counterDAO.incrementUnseen(CASSANDRA_ID_1).block(); + counterDAO.incrementUnseenAndCount(CASSANDRA_ID_1).block(); counterDAO.incrementCount(CASSANDRA_ID_1).block(); testee.recomputeMailboxCounters(new Context()).block(); @@ -147,7 +147,7 @@ class RecomputeMailboxCountersServiceTest { void recomputeMailboxCountersShouldReturnCompletedWhenOrphanMailboxRegistration() { mailboxDAO.save(MAILBOX).block(); imapUidToMessageIdDAO.insert(METADATA_UNSEEN).block(); - counterDAO.incrementUnseen(CASSANDRA_ID_1).block(); + counterDAO.incrementUnseenAndCount(CASSANDRA_ID_1).block(); counterDAO.incrementCount(CASSANDRA_ID_1).block(); testee.recomputeMailboxCounters(new Context()).block(); @@ -160,7 +160,7 @@ class RecomputeMailboxCountersServiceTest { void recomputeMailboxCountersShouldReturnCompletedWhenMailboxListReferenceIsMissing() { mailboxDAO.save(MAILBOX).block(); messageIdToImapUidDAO.insert(METADATA_UNSEEN).block(); - counterDAO.incrementUnseen(CASSANDRA_ID_1).block(); + counterDAO.incrementUnseenAndCount(CASSANDRA_ID_1).block(); counterDAO.incrementCount(CASSANDRA_ID_1).block(); testee.recomputeMailboxCounters(new Context()).block(); @@ -184,7 +184,7 @@ class RecomputeMailboxCountersServiceTest { mailboxDAO.save(MAILBOX).block(); imapUidToMessageIdDAO.insert(METADATA_UNSEEN).block(); messageIdToImapUidDAO.insert(METADATA_UNSEEN).block(); - counterDAO.incrementUnseen(CASSANDRA_ID_1).block(); + counterDAO.incrementUnseenAndCount(CASSANDRA_ID_1).block(); counterDAO.incrementCount(CASSANDRA_ID_1).block(); testee.recomputeMailboxCounters(new Context()).block(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
