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