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]

Reply via email to