JAMES-2362 MimeMessageID search in mailbox-api implementations

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c9c1250c
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c9c1250c
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c9c1250c

Branch: refs/heads/master
Commit: c9c1250c7f740772b982e6bc61038dbd06988aa3
Parents: 93f1d3e
Author: benwa <btell...@linagora.com>
Authored: Tue Mar 27 09:52:45 2018 +0700
Committer: benwa <btell...@linagora.com>
Committed: Tue Mar 27 15:16:32 2018 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/mailbox/model/SearchQuery.java  |  4 ++++
 .../mailbox/elasticsearch/query/CriterionConverter.java   |  5 +++++
 .../mailbox/lucene/search/LuceneMessageSearchIndex.java   |  6 +++---
 .../james/mailbox/store/search/MessageSearches.java       |  3 +++
 .../store/search/AbstractMessageSearchIndexTest.java      | 10 ++++++++++
 5 files changed, 25 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c9c1250c/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
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 cd42a5a..fedab42 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
@@ -1176,6 +1176,10 @@ public class SearchQuery implements Serializable {
             return messageID;
         }
 
+        public HeaderCriterion asHeaderCriterion() {
+            return new HeaderCriterion("Message-ID", new 
ContainsOperator(messageID));
+        }
+
         @Override
         public final boolean equals(Object o) {
             if (o instanceof MimeMessageIDCriterion) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/c9c1250c/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
----------------------------------------------------------------------
diff --git 
a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
 
b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
index ab1cf0d..71ab35b 100644
--- 
a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
+++ 
b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
@@ -83,6 +83,7 @@ public class CriterionConverter {
             criterion -> dateRangeFilter(JsonMessageConstants.DATE, 
criterion.getOperator()));
 
         registerCriterionConverter(SearchQuery.AttachmentCriterion.class, 
this::convertAttachmentCriterion);
+        registerCriterionConverter(SearchQuery.MimeMessageIDCriterion.class, 
this::convertMimeMessageIDCriterion);
     }
     
     @SuppressWarnings("unchecked")
@@ -124,6 +125,10 @@ public class CriterionConverter {
         return termQuery(JsonMessageConstants.HAS_ATTACHMENT, 
criterion.getOperator().isSet());
     }
 
+    private QueryBuilder 
convertMimeMessageIDCriterion(SearchQuery.MimeMessageIDCriterion criterion) {
+        return termQuery(JsonMessageConstants.MIME_MESSAGE_ID, 
criterion.getMessageID());
+    }
+
     private QueryBuilder 
convertCustomFlagCriterion(SearchQuery.CustomFlagCriterion criterion) {
         QueryBuilder termQueryBuilder = 
termQuery(JsonMessageConstants.USER_FLAGS, criterion.getFlag());
         if (criterion.getOperator().isSet()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/c9c1250c/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
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 557ebcb..887b05a 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
@@ -1240,13 +1240,13 @@ public class LuceneMessageSearchIndex extends 
ListeningMessageSearchIndex {
             return createConjunctionQuery(crit, inMailboxes, recentUids);
         } else if (criterion instanceof SearchQuery.ModSeqCriterion) {
             return createModSeqQuery((SearchQuery.ModSeqCriterion) criterion);
+        } else if (criterion instanceof SearchQuery.MimeMessageIDCriterion) {
+            SearchQuery.MimeMessageIDCriterion mimeMessageIDCriterion = 
(SearchQuery.MimeMessageIDCriterion) criterion;
+            return 
createHeaderQuery(mimeMessageIDCriterion.asHeaderCriterion());
         }
         throw new UnsupportedSearchException();
-
     }
 
-    
-
     @Override
     public void add(MailboxSession session, Mailbox mailbox, MailboxMessage 
membership) throws MailboxException {
         Document doc = createMessageDocument(session, membership);

http://git-wip-us.apache.org/repos/asf/james-project/blob/c9c1250c/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
----------------------------------------------------------------------
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 d1f1647..b8907df 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
@@ -184,6 +184,9 @@ public class MessageSearches implements 
Iterable<SimpleMessageSearchIndex.Search
             return matches((SearchQuery.AttachmentCriterion) criterion, 
message);
         } else if (criterion instanceof SearchQuery.ModSeqCriterion) {
             return matches((SearchQuery.ModSeqCriterion) criterion, message);
+        } else if (criterion instanceof SearchQuery.MimeMessageIDCriterion) {
+            SearchQuery.MimeMessageIDCriterion mimeMessageIDCriterion = 
(SearchQuery.MimeMessageIDCriterion) criterion;
+            return isMatch(mimeMessageIDCriterion.asHeaderCriterion(), 
message, recentMessageUids);
         } else {
             throw new UnsupportedSearchException();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c9c1250c/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
----------------------------------------------------------------------
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 f4e891e..f953319 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
@@ -1428,4 +1428,14 @@ public abstract class AbstractMessageSearchIndexTest {
                 message1.getUid(),
                 message3.getUid());
     }
+
+    @Test
+    public void searchShouldRetrieveExactlyMatchingMimeMessageID() throws 
Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        
searchQuery.andCriteria(SearchQuery.mimeMessageID("<jira.12781874.1426269127000.9353.1433410057...@atlassian.jira>"));
+        // Correspond to mail.eml
+
+        assertThat(messageSearchIndex.search(session, mailbox, searchQuery))
+            .containsOnly(m3.getUid());
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to