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