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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
