You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/06/26 05:06:21 UTC

[james-project] 03/06: [PERFORMANCE] Optimise GetMessagesMethod::messagesNotFound

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 3ef0eb4d0275759cad1b6300ffbe255c25729d3d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 21 14:41:06 2021 +0700

    [PERFORMANCE] Optimise GetMessagesMethod::messagesNotFound
    
    The nominal case (messages are all to be found) can be checked faster.
---
 .../jmap/draft/methods/GetMessagesMethod.java      |  6 ++--
 .../jmap/draft/model/GetMessagesResponse.java      | 39 ++++++++++++----------
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
index 9368b42..fd98cdf 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
@@ -21,7 +21,6 @@ package org.apache.james.jmap.draft.methods;
 
 import static org.apache.james.util.ReactorUtils.context;
 
-import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -47,6 +46,7 @@ import org.apache.james.util.MDCBuilder;
 
 import com.fasterxml.jackson.databind.ser.PropertyFilter;
 import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
+import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
@@ -127,8 +127,8 @@ public class GetMessagesMethod implements Method {
 
         MessageProperties.ReadProfile readProfile = getMessagesRequest.getProperties().computeReadLevel();
         MessageViewFactory<? extends MessageView> factory = messageViewFactory.getFactory(readProfile);
-        Mono<? extends List<? extends MessageView>> messageViewsMono = factory.fromMessageIds(getMessagesRequest.getIds(), mailboxSession)
-            .collectList();
+        Mono<? extends Set<? extends MessageView>> messageViewsMono = factory.fromMessageIds(getMessagesRequest.getIds(), mailboxSession)
+            .collect(Guavate.toImmutableSet());
 
         return messageViewsMono.map(messageViews ->
             GetMessagesResponse.builder()
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMessagesResponse.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMessagesResponse.java
index 53ddd60..1c84742 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMessagesResponse.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMessagesResponse.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.jmap.draft.model;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -31,7 +32,8 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 
 @JsonDeserialize(builder = GetMessagesResponse.Builder.class)
 public class GetMessagesResponse implements Method.Response {
@@ -42,26 +44,26 @@ public class GetMessagesResponse implements Method.Response {
     
     @JsonPOJOBuilder(withPrefix = "")
     public static class Builder {
-        private ImmutableList<MessageView> messages;
-        private List<MessageId> expectedMessageIds;
+        private ImmutableSet<MessageView> messages;
+        private Set<MessageId> expectedMessageIds;
 
         private Builder() {
-            this.messages = ImmutableList.of();
+            this.messages = ImmutableSet.of();
         }
 
         @JsonIgnore
         public Builder message(MessageView message) {
-            this.messages = ImmutableList.of(message);
+            this.messages = ImmutableSet.of(message);
             return this;
         }
 
-        public Builder messages(List<? extends MessageView> messages) {
-            this.messages = ImmutableList.copyOf(messages);
+        public Builder messages(Collection<? extends MessageView> messages) {
+            this.messages = ImmutableSet.copyOf(messages);
             return this;
         }
 
         public Builder expectedMessageIds(List<MessageId> expectedMessageIds) {
-            this.expectedMessageIds = ImmutableList.copyOf(expectedMessageIds);
+            this.expectedMessageIds = ImmutableSet.copyOf(expectedMessageIds);
             return this;
         }
         
@@ -71,31 +73,32 @@ public class GetMessagesResponse implements Method.Response {
         }
         
 
-        private List<MessageId> messagesNotFound() {
-            Set<MessageId> foundMessageIds = messages.stream().map(MessageView::getId).collect(Collectors.toSet());
-            return ImmutableList.copyOf(expectedMessageIds.stream()
-                .filter(id -> !foundMessageIds.contains(id))
-                .collect(Collectors.toList()));
+        private Set<MessageId> messagesNotFound() {
+            if (expectedMessageIds.size() == messages.size()) {
+                return ImmutableSet.of();
+            }
+            return Sets.difference(expectedMessageIds,
+                messages.stream().map(MessageView::getId).collect(Collectors.toSet()));
         }
     }
     
     
     
-    private final List<MessageView> messages;
-    private final List<MessageId> messagesNotFound;
+    private final Set<MessageView> messages;
+    private final Set<MessageId> messagesNotFound;
 
-    private GetMessagesResponse(List<MessageView> messages, List<MessageId> messagesNotFound) {
+    private GetMessagesResponse(Set<MessageView> messages, Set<MessageId> messagesNotFound) {
         this.messages = messages;
         this.messagesNotFound = messagesNotFound;
     }
 
     @JsonSerialize
-    public List<MessageView> list() {
+    public Set<MessageView> list() {
         return messages;
     }
     
     @JsonSerialize
-    public List<MessageId> notFound() {
+    public Set<MessageId> notFound() {
         return messagesNotFound;
     }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org