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