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 2023/04/27 10:55:17 UTC
[james-project] 03/03: [PERF] IMAP ESEARCH: working with uids is not needed
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 315f30114cbdbe9b99015436e7a1028c5b46eb20
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Apr 26 17:38:49 2023 +0700
[PERF] IMAP ESEARCH: working with uids is not needed
The untyped idSet represent the exact same data
---
.../james/imap/encode/ESearchResponseEncoder.java | 8 +-------
.../james/imap/message/response/ESearchResponse.java | 9 +--------
.../apache/james/imap/processor/SearchProcessor.java | 20 +++-----------------
3 files changed, 5 insertions(+), 32 deletions(-)
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
index 819090fa9d..212758f1d5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
@@ -24,7 +24,6 @@ import java.util.List;
import org.apache.james.imap.api.ImapConstants;
import org.apache.james.imap.api.Tag;
import org.apache.james.imap.api.message.IdRange;
-import org.apache.james.imap.api.message.UidRange;
import org.apache.james.imap.api.message.request.SearchResultOption;
import org.apache.james.imap.message.response.ESearchResponse;
import org.apache.james.mailbox.ModSeq;
@@ -45,7 +44,6 @@ public class ESearchResponseEncoder implements ImapResponseEncoder<ESearchRespon
long max = response.getMaxUid();
long count = response.getCount();
IdRange[] all = response.getAll();
- UidRange[] allUids = response.getAllUids();
boolean useUid = response.getUseUid();
ModSeq highestModSeq = response.getHighestModSeq();
List<SearchResultOption> options = response.getSearchResultOptions();
@@ -63,14 +61,10 @@ public class ESearchResponseEncoder implements ImapResponseEncoder<ESearchRespon
if (options.contains(SearchResultOption.COUNT)) {
composer.message(SearchResultOption.COUNT.name()).message(count);
}
- if (!useUid && all != null && all.length > 0 && options.contains(SearchResultOption.ALL)) {
+ if (all != null && all.length > 0 && options.contains(SearchResultOption.ALL)) {
composer.message(SearchResultOption.ALL.name());
composer.sequenceSet(all);
}
- if (useUid && allUids != null && allUids.length > 0 && options.contains(SearchResultOption.ALL)) {
- composer.message(SearchResultOption.ALL.name());
- composer.sequenceSet(allUids);
- }
// Add the MODSEQ to the response if needed.
//
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
index 89e0437fdb..b21ad10f82 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
@@ -23,7 +23,6 @@ import java.util.List;
import org.apache.james.imap.api.Tag;
import org.apache.james.imap.api.message.IdRange;
-import org.apache.james.imap.api.message.UidRange;
import org.apache.james.imap.api.message.request.SearchResultOption;
import org.apache.james.imap.api.message.response.ImapResponseMessage;
import org.apache.james.mailbox.ModSeq;
@@ -37,16 +36,14 @@ public class ESearchResponse implements ImapResponseMessage {
private final boolean useUid;
private final List<SearchResultOption> options;
private final ModSeq highestModSeq;
- private UidRange[] allUids;
- public ESearchResponse(long minUid, long maxUid, long count, IdRange[] all, UidRange[] allUids, ModSeq highestModSeq, Tag tag, boolean useUid, List<SearchResultOption> options) {
+ public ESearchResponse(long minUid, long maxUid, long count, IdRange[] all, ModSeq highestModSeq, Tag tag, boolean useUid, List<SearchResultOption> options) {
this.options = options;
this.minUid = minUid;
this.maxUid = maxUid;
this.count = count;
this.all = all;
this.tag = tag;
- this.allUids = allUids;
this.useUid = useUid;
this.highestModSeq = highestModSeq;
}
@@ -66,10 +63,6 @@ public class ESearchResponse implements ImapResponseMessage {
public IdRange[] getAll() {
return all;
}
-
- public UidRange[] getAllUids() {
- return allUids;
- }
public Tag getTag() {
return tag;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
index 499047dd94..3b33d0abc9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.processor;
import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
@@ -76,7 +75,6 @@ import com.google.common.collect.ImmutableList;
import it.unimi.dsi.fastutil.longs.LongArrayList;
import it.unimi.dsi.fastutil.longs.LongComparators;
-import it.unimi.dsi.fastutil.longs.LongConsumer;
import it.unimi.dsi.fastutil.longs.LongList;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -161,11 +159,11 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
if (resultOptions == null || resultOptions.isEmpty()) {
return new SearchResponse(ids, highestModSeq.orElse(null));
} else {
- return handleResultOptions(request, session, uids, highestModSeq.orElse(null), ids);
+ return handleResultOptions(request, session, highestModSeq.orElse(null), ids);
}
}
- private ImapResponseMessage handleResultOptions(SearchRequest request, ImapSession session, Collection<MessageUid> uids, ModSeq highestModSeq, LongList ids) {
+ private ImapResponseMessage handleResultOptions(SearchRequest request, ImapSession session, ModSeq highestModSeq, LongList ids) {
List<SearchResultOption> resultOptions = request.getSearchOperation().getResultOptions();
IdRange[] idRanges = asRanges(ids);
@@ -206,8 +204,7 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
SearchResUtil.saveSequenceSet(session, savedRanges.toArray(IdRange[]::new));
}
}
- UidRange[] uidRanges = uidRangeIfNeeded(request, resultOptions, uids);
- return new ESearchResponse(min, max, count, idRanges, uidRanges, highestModSeq, request.getTag(), request.isUseUids(), resultOptions);
+ return new ESearchResponse(min, max, count, idRanges, highestModSeq, request.getTag(), request.isUseUids(), resultOptions);
} else {
// Just save the returned sequence-set as this is not SEARCHRES + ESEARCH
SearchResUtil.saveSequenceSet(session, idRanges);
@@ -215,17 +212,6 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
}
}
- private UidRange[] uidRangeIfNeeded(SearchRequest request, List<SearchResultOption> resultOptions, Collection<MessageUid> uids) {
- if (resultOptions.contains(SearchResultOption.ALL) && request.isUseUids()) {
- List<UidRange> uidsAsRanges = new ArrayList<>();
- for (MessageUid uid: uids) {
- uidsAsRanges.add(new UidRange(uid));
- }
- return UidRange.mergeRanges(uidsAsRanges).toArray(UidRange[]::new);
- }
- return null;
- }
-
/**
* Optimization of IdRange.mergeRanges(idsAsRanges) for list of long
*/
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org