JAMES-2098 Optimize most flags updates while moving messages with JMAP It avoids reading messages before updating them to identity
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1d1eff41 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1d1eff41 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1d1eff41 Branch: refs/heads/master Commit: 1d1eff4152a33e2624b6439e9ea5ac6ba0e31440 Parents: dbfc04c Author: benwa <[email protected]> Authored: Tue Jul 25 00:19:45 2017 +0700 Committer: benwa <[email protected]> Committed: Wed Jul 26 13:55:26 2017 +0700 ---------------------------------------------------------------------- .../methods/SetMessagesUpdateProcessor.java | 6 ++-- .../james/jmap/model/UpdateMessagePatch.java | 6 ++++ .../jmap/model/UpdateMessagePatchTest.java | 35 +++++++++++++++++++- 3 files changed, 44 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/1d1eff41/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java index 85a9668..53d58d4 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java @@ -117,8 +117,10 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor { private Stream<MailboxException> updateFlags(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, MessageResult messageResult) { try { - Flags newState = updateMessagePatch.applyToState(messageResult.getFlags()); - messageIdManager.setFlags(newState, MessageManager.FlagsUpdateMode.REPLACE, messageId, ImmutableList.of(messageResult.getMailboxId()), mailboxSession); + if (!updateMessagePatch.isFlagsIdentity()) { + Flags newState = updateMessagePatch.applyToState(messageResult.getFlags()); + messageIdManager.setFlags(newState, MessageManager.FlagsUpdateMode.REPLACE, messageId, ImmutableList.of(messageResult.getMailboxId()), mailboxSession); + } return Stream.of(); } catch (MailboxException e) { return Stream.of(e); http://git-wip-us.apache.org/repos/asf/james-project/blob/1d1eff41/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java index cc0e184..32e3fe2 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java @@ -122,6 +122,12 @@ public class UpdateMessagePatch { return isAnswered; } + public boolean isFlagsIdentity() { + return !isAnswered.isPresent() + && !isFlagged.isPresent() + && !isUnread.isPresent(); + } + public ImmutableList<ValidationResult> getValidationErrors() { return validationErrors; } http://git-wip-us.apache.org/repos/asf/james-project/blob/1d1eff41/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java index 0b60699..e97c49c 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java @@ -19,7 +19,6 @@ package org.apache.james.jmap.model; - import static org.assertj.core.api.Assertions.assertThat; import java.util.Arrays; @@ -80,4 +79,38 @@ public class UpdateMessagePatchTest { assertThat(updatedFlags).containsExactly(Flags.Flag.SEEN); } + @Test + public void isIdentityShouldReturnTrueWhenNoFlags() { + UpdateMessagePatch messagePatch = UpdateMessagePatch.builder().build(); + + assertThat(messagePatch.isFlagsIdentity()).isTrue(); + } + + @Test + public void isIdentityShouldReturnFalseWhenFlagsAnsweredUpdated() { + UpdateMessagePatch messagePatch = UpdateMessagePatch.builder() + .isAnswered(true) + .build(); + + assertThat(messagePatch.isFlagsIdentity()).isFalse(); + } + + @Test + public void isIdentityShouldReturnFalseWhenFlagsUnreadUpdated() { + UpdateMessagePatch messagePatch = UpdateMessagePatch.builder() + .isUnread(true) + .build(); + + assertThat(messagePatch.isFlagsIdentity()).isFalse(); + } + + @Test + public void isIdentityShouldReturnFalseWhenFlagsFlaggedUpdated() { + UpdateMessagePatch messagePatch = UpdateMessagePatch.builder() + .isFlagged(true) + .build(); + + assertThat(messagePatch.isFlagsIdentity()).isFalse(); + } + } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
