JAMES-1951 CassandraApplicableFlagsDAO should not care about system Flags as they are already always added to the answer
Limiting updates on this table will furthermore have benefits for read and compaction. Tables modification are certified retro-compatible: - Use old diff, and plan Gatling tests to populate Cassandra - Run the same Gatling test with new code without purging Cassandra to ensure retro-compatibility. And transform CassandraApplicableFlagDAO to only manage user flags Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/d356b483 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/d356b483 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/d356b483 Branch: refs/heads/master Commit: d356b483c0436754d39f3b24e4061af1cdf4b93d Parents: e56bb6a Author: benwa <btell...@linagora.com> Authored: Fri May 26 09:41:19 2017 +0700 Committer: Antoine Duprat <adup...@linagora.com> Committed: Fri Jun 9 21:56:01 2017 +0200 ---------------------------------------------------------------------- .../org/apache/james/mailbox/FlagsBuilder.java | 10 ++- .../mail/CassandraApplicableFlagDAO.java | 40 +++------ .../mail/CassandraIndexTableHandler.java | 6 +- .../mailbox/cassandra/mail/FlagsExtractor.java | 5 -- .../modules/CassandraApplicableFlagsModule.java | 6 -- .../table/CassandraApplicableFlagTable.java | 2 +- .../mail/CassandraApplicableFlagDAOTest.java | 94 +++++--------------- .../mail/CassandraIndexTableHandlerTest.java | 29 +++--- 8 files changed, 59 insertions(+), 133 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/d356b483/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java ---------------------------------------------------------------------- diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java b/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java index 1414cbf..25a64dd 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java @@ -34,21 +34,23 @@ public class FlagsBuilder { } public FlagsBuilder add(Flags.Flag... flags) { - for(Flags.Flag flag : flags) { + for (Flags.Flag flag : flags) { internalFlags.add(flag); } return this; } public FlagsBuilder add(String... flags) { - for(String userFlag : flags) { + for (String userFlag : flags) { internalFlags.add(userFlag); } return this; } - public FlagsBuilder add(Flags flags) { - internalFlags.add(flags); + public FlagsBuilder add(Flags... flagsArray) { + for (Flags flags: flagsArray) { + internalFlags.add(flags); + } return this; } http://git-wip-us.apache.org/repos/asf/james-project/blob/d356b483/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java index 4d5756e..71ea774 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java @@ -23,34 +23,30 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.add; import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.select; -import static com.datastax.driver.core.querybuilder.QueryBuilder.set; import static com.datastax.driver.core.querybuilder.QueryBuilder.update; import static org.apache.james.mailbox.cassandra.table.CassandraApplicableFlagTable.FIELDS; import static org.apache.james.mailbox.cassandra.table.CassandraApplicableFlagTable.MAILBOX_ID; import static org.apache.james.mailbox.cassandra.table.CassandraApplicableFlagTable.TABLE_NAME; -import static org.apache.james.mailbox.cassandra.table.Flag.FLAG_TO_STRING_MAP; import static org.apache.james.mailbox.cassandra.table.Flag.USER_FLAGS; -import java.util.Arrays; import java.util.Optional; +import java.util.Set; import java.util.concurrent.CompletableFuture; import javax.inject.Inject; import javax.mail.Flags; -import javax.mail.Flags.Flag; import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; -import org.apache.james.mailbox.FlagsBuilder; import org.apache.james.mailbox.cassandra.CassandraId; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; import com.datastax.driver.core.querybuilder.Update; import com.datastax.driver.core.querybuilder.Update.Assignments; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; public class CassandraApplicableFlagDAO { - private static final Flags.Flag[] ALL_APPLICABLE_FLAGS = {Flags.Flag.ANSWERED, Flags.Flag.DELETED, Flags.Flag.DRAFT, Flags.Flag.SEEN, Flags.Flag.FLAGGED }; - private static final Flags EMPTY_FLAGS = new Flags(); private final CassandraAsyncExecutor cassandraAsyncExecutor; private final PreparedStatement select; @@ -75,36 +71,22 @@ public class CassandraApplicableFlagDAO { rowOptional.map(row -> new FlagsExtractor(row).getApplicableFlags())); } - public CompletableFuture<Void> updateApplicableFlags(CassandraId cassandraId, Flags flags) { - Flags newFlags = new FlagsBuilder().add(flags).build(); - newFlags.remove(Flag.RECENT); - newFlags.remove(Flag.USER); - - if (newFlags.equals(EMPTY_FLAGS)) { + public CompletableFuture<Void> updateApplicableFlags(CassandraId cassandraId, Set<String> toBeAdded) { + if (toBeAdded.isEmpty()) { return CompletableFuture.completedFuture(null); } - return cassandraAsyncExecutor.executeVoid(updateQuery(cassandraId, newFlags)); + return cassandraAsyncExecutor.executeVoid(updateQuery(cassandraId, toBeAdded)); } - private Update.Where updateQuery(CassandraId cassandraId, Flags flags) { - return addSystemFlagsToQuery(flags, - addUserFlagsToQuery(flags, - update(TABLE_NAME).with())) + private Update.Where updateQuery(CassandraId cassandraId, Set<String> userFlags) { + return addUserFlagsToQuery(userFlags, + update(TABLE_NAME).with()) .where(eq(MAILBOX_ID, cassandraId.asUuid())); } - private Assignments addUserFlagsToQuery(Flags flags, Assignments updateQuery) { - if (flags.getUserFlags() != null && flags.getUserFlags().length > 0) { - Arrays.stream(flags.getUserFlags()) - .forEach(userFlag -> updateQuery.and(add(USER_FLAGS, userFlag))); - } + private Assignments addUserFlagsToQuery(Set<String> userFlags, Assignments updateQuery) { + userFlags.forEach(userFlag -> updateQuery.and(add(USER_FLAGS, userFlag))); return updateQuery; } - private Assignments addSystemFlagsToQuery(Flags flags, Assignments updateQuery) { - Arrays.stream(ALL_APPLICABLE_FLAGS) - .filter(flags::contains) - .forEach(flag -> updateQuery.and(set(FLAG_TO_STRING_MAP.get(flag), true))); - return updateQuery; - } } http://git-wip-us.apache.org/repos/asf/james-project/blob/d356b483/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java ---------------------------------------------------------------------- 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 b99e91d..c173c7b 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 @@ -30,6 +30,8 @@ import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData; import org.apache.james.mailbox.model.UpdatedFlags; import org.apache.james.mailbox.store.mail.model.MailboxMessage; +import com.google.common.collect.ImmutableSet; + public class CassandraIndexTableHandler { private final CassandraMailboxRecentsDAO mailboxRecentDAO; @@ -70,14 +72,14 @@ public class CassandraIndexTableHandler { addRecentOnSave(mailboxId, message), incrementUnseenOnSave(mailboxId, flags), mailboxCounterDAO.incrementCount(mailboxId), - applicableFlagDAO.updateApplicableFlags(mailboxId, flags)); + applicableFlagDAO.updateApplicableFlags(mailboxId, ImmutableSet.copyOf(flags.getUserFlags()))); } public CompletableFuture<Void> updateIndexOnFlagsUpdate(CassandraId mailboxId, UpdatedFlags updatedFlags) { return CompletableFuture.allOf(manageUnseenMessageCountsOnFlagsUpdate(mailboxId, updatedFlags), manageRecentOnFlagsUpdate(mailboxId, updatedFlags), updateFirstUnseenOnFlagsUpdate(mailboxId, updatedFlags), - applicableFlagDAO.updateApplicableFlags(mailboxId, updatedFlags.getNewFlags()), + applicableFlagDAO.updateApplicableFlags(mailboxId, ImmutableSet.copyOf(updatedFlags.userFlagIterator())), updateDeletedOnFlagsUpdate(mailboxId, updatedFlags)); } http://git-wip-us.apache.org/repos/asf/james-project/blob/d356b483/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java index 7124495..d1b33b5 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java @@ -47,11 +47,6 @@ public class FlagsExtractor { public Flags getApplicableFlags() { Flags flags = new Flags(); - for (String flag : Flag.ALL_APPLICABLE_FLAG) { - if (row.getBool(flag)) { - flags.add(Flag.JAVAX_MAIL_FLAG.get(flag)); - } - } row.getSet(Flag.USER_FLAGS, String.class) .stream() .forEach(flags::add); http://git-wip-us.apache.org/repos/asf/james-project/blob/d356b483/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java index 5d1c183..35de1b4 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java @@ -19,7 +19,6 @@ package org.apache.james.mailbox.cassandra.modules; -import static com.datastax.driver.core.DataType.cboolean; import static com.datastax.driver.core.DataType.set; import static com.datastax.driver.core.DataType.text; import static com.datastax.driver.core.DataType.timeuuid; @@ -46,11 +45,6 @@ public class CassandraApplicableFlagsModule implements CassandraModule { SchemaBuilder.createTable(CassandraApplicableFlagTable.TABLE_NAME) .ifNotExists() .addPartitionKey(CassandraApplicableFlagTable.MAILBOX_ID, timeuuid()) - .addColumn(Flag.ANSWERED, cboolean()) - .addColumn(Flag.DELETED, cboolean()) - .addColumn(Flag.DRAFT, cboolean()) - .addColumn(Flag.FLAGGED, cboolean()) - .addColumn(Flag.SEEN, cboolean()) .addColumn(Flag.USER_FLAGS, set(text())) .withOptions() .compactionOptions(SchemaBuilder.leveledStrategy()) http://git-wip-us.apache.org/repos/asf/james-project/blob/d356b483/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java index a7eb74c..cb97028 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java @@ -24,5 +24,5 @@ public interface CassandraApplicableFlagTable { String TABLE_NAME = "applicableFlag"; String MAILBOX_ID = "mailboxId"; - String[] FIELDS = { MAILBOX_ID, Flag.ANSWERED, Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN, Flag.USER_FLAGS }; + String[] FIELDS = { MAILBOX_ID, Flag.USER_FLAGS }; } http://git-wip-us.apache.org/repos/asf/james-project/blob/d356b483/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java index f37ca92..8d5450d 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java @@ -24,7 +24,6 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Optional; import javax.mail.Flags; -import javax.mail.Flags.Flag; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.mailbox.FlagsBuilder; @@ -34,6 +33,8 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import com.google.common.collect.ImmutableSet; + public class CassandraApplicableFlagDAOTest { public static final String USER_FLAG = "User Flag"; @@ -64,111 +65,60 @@ public class CassandraApplicableFlagDAOTest { } @Test - public void updateApplicableFlagsShouldSupportEmptyFlags() throws Exception { - testee.updateApplicableFlags(CASSANDRA_ID, new Flags()).join(); - - Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); - assertThat(actual.isPresent()).isFalse(); - } - - @Test - public void updateApplicableFlagsShouldIgnoreRecentFlags() throws Exception { - testee.updateApplicableFlags(CASSANDRA_ID, new Flags(Flag.RECENT)).join(); + public void updateApplicableFlagsShouldSupportEmptyUserFlags() throws Exception { + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of()).join(); Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); assertThat(actual.isPresent()).isFalse(); } @Test - public void updateApplicableFlagsShouldUpdateMultiFlags() throws Exception { - Flags flags = new FlagsBuilder().add(Flag.ANSWERED, Flag.DELETED).build(); - testee.updateApplicableFlags(CASSANDRA_ID, flags).join(); - - Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); - assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(flags); - } - - @Test - public void updateApplicableFlagsShouldAddAnsweredFlag() throws Exception { - Flags flags = new Flags(Flag.ANSWERED); - testee.updateApplicableFlags(CASSANDRA_ID, flags).join(); - - Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); - assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(flags); - } - - @Test - public void updateApplicableFlagsShouldAddDeletedFlag() throws Exception { - Flags flags = new Flags(Flag.DELETED); - testee.updateApplicableFlags(CASSANDRA_ID, flags).join(); - - Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); - assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(flags); - } - - @Test - public void updateApplicableFlagsShouldAddDraftFlag() throws Exception { - Flags flags = new Flags(Flag.DRAFT); - testee.updateApplicableFlags(CASSANDRA_ID, flags).join(); - - Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); - assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(flags); - } - - @Test - public void updateApplicableFlagsShouldAddFlaggedFlag() throws Exception { - Flags flags = new Flags(Flag.FLAGGED); - testee.updateApplicableFlags(CASSANDRA_ID, flags).join(); + public void updateApplicableFlagsShouldUpdateUserFlag() throws Exception { + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join(); Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(flags); + assertThat(actual.get()).isEqualTo(new Flags(USER_FLAG)); } @Test - public void updateApplicableFlagsShouldAddSeenFlag() throws Exception { - Flags flags = new Flags(Flag.SEEN); - testee.updateApplicableFlags(CASSANDRA_ID, flags).join(); + public void updateApplicableFlagsShouldUnionUserFlags() throws Exception { + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join(); + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG2)).join(); Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(flags); + assertThat(actual.get()).isEqualTo(FlagsBuilder.builder().add(USER_FLAG, USER_FLAG2).build()); } @Test - public void updateApplicableFlagsShouldUnionSystemFlags() throws Exception { - testee.updateApplicableFlags(CASSANDRA_ID, new Flags(Flag.ANSWERED)).join(); - testee.updateApplicableFlags(CASSANDRA_ID, new Flags(Flag.SEEN)).join(); + public void updateApplicableFlagsShouldBeIdempotent() throws Exception { + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join(); + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join(); Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(new FlagsBuilder().add(Flag.ANSWERED, Flag.SEEN).build()); + assertThat(actual.get()).isEqualTo(new Flags(USER_FLAG)); } @Test - public void updateApplicableFlagsShouldUpdateUserFlag() throws Exception { - Flags flags = new FlagsBuilder().add(Flag.ANSWERED).add(USER_FLAG).build(); + public void updateApplicableFlagsShouldSkipAlreadyStoredFlagsWhenAddingFlag() throws Exception { + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).join(); + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG, USER_FLAG2)).join(); - testee.updateApplicableFlags(CASSANDRA_ID, flags).join(); Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(flags); + assertThat(actual.get()).isEqualTo(FlagsBuilder.builder().add(USER_FLAG, USER_FLAG2).build()); } @Test - public void updateApplicableFlagsShouldUnionUserFlags() throws Exception { - testee.updateApplicableFlags(CASSANDRA_ID, new Flags(USER_FLAG)).join(); - - testee.updateApplicableFlags(CASSANDRA_ID, new Flags(USER_FLAG2)).join(); + public void updateApplicableFlagsShouldUpdateMultiFlags() throws Exception { + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG, USER_FLAG2)).join(); Optional<Flags> actual = testee.retrieveApplicableFlag(CASSANDRA_ID).join(); assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(new FlagsBuilder().add(USER_FLAG, USER_FLAG2).build()); + assertThat(actual.get()).isEqualTo(FlagsBuilder.builder().add(USER_FLAG, USER_FLAG2).build()); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/d356b483/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java index e1b9f34..184e114 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java @@ -26,9 +26,7 @@ import static org.mockito.Mockito.when; import java.util.Optional; import javax.mail.Flags; -import javax.mail.Flags.Flag; -import com.github.steveash.guavate.Guavate; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.init.CassandraModuleComposite; import org.apache.james.mailbox.FlagsBuilder; @@ -52,6 +50,8 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import com.github.steveash.guavate.Guavate; + public class CassandraIndexTableHandlerTest { public static final CassandraId MAILBOX_ID = CassandraId.timeBased(); @@ -650,42 +650,43 @@ public class CassandraIndexTableHandlerTest { @Test public void updateIndexOnAddShouldUpdateApplicableFlag() throws Exception { - Flags answeredFlag = new Flags(Flag.ANSWERED); + Flags customFlags = new Flags("custom"); MailboxMessage message = mock(MailboxMessage.class); - when(message.createFlags()).thenReturn(answeredFlag); + when(message.createFlags()).thenReturn(customFlags); when(message.getUid()).thenReturn(MESSAGE_UID); testee.updateIndexOnAdd(message, MAILBOX_ID).join(); Flags applicableFlag = applicableFlagDAO.retrieveApplicableFlag(MAILBOX_ID).join().get(); - assertThat(applicableFlag).isEqualTo(answeredFlag); + assertThat(applicableFlag).isEqualTo(customFlags); } @Test public void updateIndexOnFlagsUpdateShouldUnionApplicableFlag() throws Exception { - Flags answeredFlag = new Flags(Flag.ANSWERED); + Flags customFlag = new Flags("custom"); MailboxMessage message = mock(MailboxMessage.class); - when(message.createFlags()).thenReturn(answeredFlag); + when(message.createFlags()).thenReturn(customFlag); when(message.getUid()).thenReturn(MESSAGE_UID); testee.updateIndexOnAdd(message, MAILBOX_ID).join(); + Flags customBis = new Flags("customBis"); testee.updateIndexOnFlagsUpdate(MAILBOX_ID, UpdatedFlags.builder() .uid(MESSAGE_UID) - .newFlags(new Flags(Flag.DELETED)) - .oldFlags(answeredFlag) + .newFlags(customBis) + .oldFlags(customFlag) .modSeq(MODSEQ) .build()).join(); Flags applicableFlag = applicableFlagDAO.retrieveApplicableFlag(MAILBOX_ID).join().get(); - assertThat(applicableFlag).isEqualTo(new FlagsBuilder().add(Flag.ANSWERED, Flag.DELETED).build()); + assertThat(applicableFlag).isEqualTo(new FlagsBuilder().add(customFlag, customBis).build()); } @Test public void applicableFlagShouldKeepAllFlagsEvenTheMessageRemovesFlag() throws Exception { - Flags messageFlags = new Flags(Flag.ANSWERED); - messageFlags.add(Flag.DELETED); - messageFlags.add(Flag.DRAFT); + Flags messageFlags = FlagsBuilder.builder() + .add("custom1", "custom2", "custom3") + .build(); MailboxMessage message = mock(MailboxMessage.class); when(message.createFlags()).thenReturn(messageFlags); @@ -701,6 +702,6 @@ public class CassandraIndexTableHandlerTest { .build()).join(); Flags applicableFlag = applicableFlagDAO.retrieveApplicableFlag(MAILBOX_ID).join().get(); - assertThat(applicableFlag).isEqualTo(new FlagsBuilder().add(Flag.ANSWERED, Flag.DRAFT, Flag.DELETED).build()); + assertThat(applicableFlag).isEqualTo(messageFlags); } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org