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 2022/11/22 07:11:50 UTC

[james-project] 05/12: JAMES-3858 Add support by search by MessageId

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 3c02c67d0a642db83db427307ca5a31137c866b5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 17 22:21:45 2022 +0700

    JAMES-3858 Add support by search by MessageId
---
 .../apache/james/mailbox/model/SearchQuery.java    | 39 ++++++++++++++++++++++
 .../lucene/search/LuceneMessageSearchIndex.java    |  3 ++
 .../opensearch/query/CriterionConverter.java       |  5 +++
 .../mailbox/store/search/MessageSearches.java      |  2 ++
 .../search/AbstractMessageSearchIndexTest.java     |  8 +++++
 5 files changed, 57 insertions(+)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index c568b7a6a3..9d937ab291 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -264,6 +264,10 @@ public class SearchQuery {
         return new ModSeqCriterion(new NumericOperator(value, NumericComparator.EQUALS));
     }
 
+    public static Criterion hasMessageId(MessageId messageId) {
+        return new MessageIdCriterion(messageId);
+    }
+
     /**
      * Creates a filter matching messages with internal date after the given
      * date.
@@ -1566,6 +1570,41 @@ public class SearchQuery {
         }
     }
 
+    public static class MessageIdCriterion extends Criterion {
+        private final MessageId messageId;
+
+        public MessageIdCriterion(MessageId messageId) {
+            this.messageId = messageId;
+        }
+
+        public MessageId getMessageId() {
+            return messageId;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hashCode(messageId);
+        }
+
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof MessageIdCriterion) {
+                MessageIdCriterion that = (MessageIdCriterion) obj;
+
+                return Objects.equal(this.messageId, that.messageId);
+            }
+            return false;
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("messageId", messageId)
+                .toString();
+        }
+    }
+
     /**
      * Search operator.
      */
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index 9c16fbedd4..6cf4b194b4 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -1143,6 +1143,9 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         } else if (criterion instanceof SearchQuery.SizeCriterion) {
             SearchQuery.SizeCriterion crit = (SearchQuery.SizeCriterion) criterion;
             return createSizeQuery(crit);
+        }  else if (criterion instanceof SearchQuery.MessageIdCriterion) {
+            SearchQuery.MessageIdCriterion crit = (SearchQuery.MessageIdCriterion) criterion;
+            return createTermQuery(MESSAGE_ID_FIELD, crit.getMessageId().serialize());
         } else if (criterion instanceof SearchQuery.HeaderCriterion) {
             HeaderCriterion crit = (HeaderCriterion) criterion;
             return createHeaderQuery(crit);
diff --git a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/CriterionConverter.java b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/CriterionConverter.java
index 76320a7a8a..3a0d3a5743 100644
--- a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/CriterionConverter.java
+++ b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/CriterionConverter.java
@@ -65,6 +65,7 @@ public class CriterionConverter {
     private void registerCriterionConverters() {
         registerCriterionConverter(SearchQuery.FlagCriterion.class, this::convertFlag);
         registerCriterionConverter(SearchQuery.UidCriterion.class, this::convertUid);
+        registerCriterionConverter(SearchQuery.MessageIdCriterion.class, this::convertMessageId);
         registerCriterionConverter(SearchQuery.ConjunctionCriterion.class, this::convertConjunction);
         registerCriterionConverter(SearchQuery.HeaderCriterion.class, this::convertHeader);
         registerCriterionConverter(SearchQuery.TextCriterion.class, this::convertTextCriterion);
@@ -258,6 +259,10 @@ public class CriterionConverter {
                     .map(this::uidRangeFilter), BoolQueryBuilder::should));
     }
 
+    private QueryBuilder convertMessageId(SearchQuery.MessageIdCriterion messageIdCriterion) {
+        return termQuery(JsonMessageConstants.MESSAGE_ID, messageIdCriterion.getMessageId().serialize());
+    }
+
     private QueryBuilder uidRangeFilter(SearchQuery.UidRange numericRange) {
         return rangeQuery(JsonMessageConstants.UID)
                 .lte(numericRange.getHighValue().asLong())
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index cb6a17d008..f840856f59 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -169,6 +169,8 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
             }
         } else if (criterion instanceof SearchQuery.UidCriterion) {
             return matches((SearchQuery.UidCriterion) criterion, message);
+        } else if (criterion instanceof SearchQuery.MessageIdCriterion) {
+            return ((SearchQuery.MessageIdCriterion) criterion).getMessageId().equals(message.getMessageId());
         } else if (criterion instanceof SearchQuery.FlagCriterion) {
             return matches((SearchQuery.FlagCriterion) criterion, message, recentMessageUids);
         } else if (criterion instanceof SearchQuery.CustomFlagCriterion) {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index 6da72da71a..497da02e09 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -419,6 +419,14 @@ public abstract class AbstractMessageSearchIndexTest {
             .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid());
     }
 
+    @Test
+    void searchShouldReturnCorrectResultWhenByMessageId() throws MailboxException {
+        SearchQuery searchQuery = SearchQuery.of(SearchQuery.hasMessageId(m4.getMessageId()));
+
+        assertThat(messageSearchIndex.search(session, mailbox, searchQuery).toStream())
+            .containsOnly(m4.getUid());
+    }
+
     @Test
     void allShouldReturnAllUids() throws MailboxException {
         SearchQuery searchQuery = SearchQuery.of(SearchQuery.all());


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