You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/06/21 09:16:28 UTC

[james-project] 05/12: JAMES-3202 implement `retrieveIndexedFlags` in ElasticSearchListeningMessageSearchIndex

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 cc8848f9ed3ad006f050d701e3ebb4c96482c24e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Jun 11 11:03:06 2020 +0700

    JAMES-3202 implement `retrieveIndexedFlags` in ElasticSearchListeningMessageSearchIndex
---
 .../org/apache/james/mailbox/FlagsBuilder.java     |  42 +++++++++
 .../ElasticSearchListeningMessageSearchIndex.java  |  47 +++++++++-
 ...asticSearchListeningMessageSearchIndexTest.java | 101 +++++++++++++++++++++
 3 files changed, 187 insertions(+), 3 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java b/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java
index 81f41fd..f891e5c 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java
@@ -62,6 +62,48 @@ public class FlagsBuilder {
         return this;
     }
 
+    public FlagsBuilder isAnswered(boolean isAnswered) {
+        if (isAnswered) {
+            internalFlags.add(Flags.Flag.ANSWERED);
+        }
+        return this;
+    }
+
+    public FlagsBuilder isDraft(boolean isDraft) {
+        if (isDraft) {
+            internalFlags.add(Flags.Flag.DRAFT);
+        }
+        return this;
+    }
+
+    public FlagsBuilder isDeleted(boolean isDeleted) {
+        if (isDeleted) {
+            internalFlags.add(Flags.Flag.DELETED);
+        }
+        return this;
+    }
+
+    public FlagsBuilder isFlagged(boolean isFlagged) {
+        if (isFlagged) {
+            internalFlags.add(Flags.Flag.FLAGGED);
+        }
+        return this;
+    }
+
+    public FlagsBuilder isRecent(boolean isRecent) {
+        if (isRecent) {
+            internalFlags.add(Flags.Flag.RECENT);
+        }
+        return this;
+    }
+
+    public FlagsBuilder isSeen(boolean isSeen) {
+        if (isSeen) {
+            internalFlags.add(Flags.Flag.SEEN);
+        }
+        return this;
+    }
+
     public Flags build() {
         return new Flags(internalFlags);
     }
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index 20caacb..e23882c 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -18,12 +18,20 @@
  ****************************************************************/
 package org.apache.james.mailbox.elasticsearch.events;
 
+import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.IS_ANSWERED;
+import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.IS_DELETED;
+import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.IS_DRAFT;
+import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.IS_FLAGGED;
+import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.IS_RECENT;
+import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.IS_UNREAD;
+import static org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants.MAILBOX_ID;
 import static org.apache.james.util.ReactorUtils.publishIfPresent;
 import static org.elasticsearch.index.query.QueryBuilders.termQuery;
 
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -35,13 +43,13 @@ import org.apache.james.backends.es.DocumentId;
 import org.apache.james.backends.es.ElasticSearchIndexer;
 import org.apache.james.backends.es.RoutingKey;
 import org.apache.james.backends.es.UpdatedRepresentation;
+import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxManager.MessageCapabilities;
 import org.apache.james.mailbox.MailboxManager.SearchCapabilities;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.elasticsearch.MailboxElasticSearchConstants;
-import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson;
 import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher;
 import org.apache.james.mailbox.events.Group;
@@ -53,6 +61,8 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
+import org.elasticsearch.action.get.GetResponse;
+import org.elasticsearch.index.IndexNotFoundException;
 import org.elasticsearch.index.query.TermQueryBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -178,7 +188,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     @Override
     public Mono<Void> deleteAll(MailboxSession session, MailboxId mailboxId) {
         TermQueryBuilder queryBuilder = termQuery(
-            JsonMessageConstants.MAILBOX_ID,
+            MAILBOX_ID,
             mailboxId.serialize());
 
         return elasticSearchIndexer
@@ -217,6 +227,37 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
 
     @Override
     public Mono<Flags> retrieveIndexedFlags(Mailbox mailbox, MessageUid uid) {
-        return Mono.empty();
+        RoutingKey routingKey = routingKeyFactory.from(mailbox.getMailboxId());
+
+        return elasticSearchIndexer.get(indexIdFor(mailbox, uid), routingKey)
+            .filter(GetResponse::isExists)
+            .map(GetResponse::getSourceAsMap)
+            .map(this::extractFlags)
+            .switchIfEmpty(Mono.error(new IndexNotFoundException(
+                String.format("Index for message %s in mailbox %s not found", uid.toString(), mailbox.getMailboxId().serialize()))));
+    }
+
+    private Flags extractFlags(Map<String, Object> source) {
+        FlagsBuilder flagsBuilder = FlagsBuilder.builder()
+            .isAnswered(extractFlag(source, IS_ANSWERED))
+            .isDeleted(extractFlag(source, IS_DELETED))
+            .isDraft(extractFlag(source, IS_DRAFT))
+            .isFlagged(extractFlag(source, IS_FLAGGED))
+            .isRecent(extractFlag(source, IS_RECENT))
+            .isSeen(!extractFlag(source, IS_UNREAD));
+
+        for (String userFlag : extractUserFlags(source)) {
+            flagsBuilder.add(userFlag);
+        }
+
+        return flagsBuilder.build();
+    }
+
+    private boolean extractFlag(Map<String, Object> source, String flag) {
+        return (Boolean) source.get(flag);
+    }
+
+    private List<String> extractUserFlags(Map<String, Object> source) {
+        return (List<String>) source.get("userFlags");
     }
 }
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
index b5a5359..4f80bb0 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
@@ -37,6 +37,7 @@ import org.apache.james.backends.es.ReactorElasticSearchClient;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.Authorizator;
 import org.apache.james.mailbox.DefaultMailboxes;
+import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
@@ -76,6 +77,7 @@ import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.awaitility.Duration;
+import org.elasticsearch.index.IndexNotFoundException;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -443,4 +445,103 @@ class ElasticSearchListeningMessageSearchIndexTest {
         assertThatCode(() -> testee.deleteAll(session, mailbox.getMailboxId()).block())
             .doesNotThrowAnyException();
     }
+
+    @Test
+    void retrieveIndexedFlagsShouldRetrieveSystemFlags() {
+        Flags flags = FlagsBuilder.builder()
+            .add(Flags.Flag.RECENT)
+            .add(Flags.Flag.DRAFT)
+            .build();
+
+        SimpleMailboxMessage message = MESSAGE_BUILDER.messageId(MESSAGE_ID_4)
+            .uid(MESSAGE_UID_4)
+            .flags(flags)
+            .build();
+
+        testee.add(session, mailbox, message).block();
+
+        assertThat(testee.retrieveIndexedFlags(mailbox, MESSAGE_UID_4).block())
+            .isEqualTo(flags);
+    }
+
+    @Test
+    void retrieveIndexedFlagsShouldReturnEmptyFlagsWhenNoFlags() {
+        Flags flags = new Flags();
+
+        SimpleMailboxMessage message = MESSAGE_BUILDER.messageId(MESSAGE_ID_4)
+            .uid(MESSAGE_UID_4)
+            .flags(flags)
+            .build();
+
+        testee.add(session, mailbox, message).block();
+
+        assertThat(testee.retrieveIndexedFlags(mailbox, MESSAGE_UID_4).block())
+            .isEqualTo(flags);
+    }
+
+    @Test
+    void retrieveIndexedFlagsShouldReturnAllSystemFlagsWhenAllFlagsSet() {
+        Flags flags = FlagsBuilder.builder()
+            .add(Flags.Flag.ANSWERED)
+            .add(Flags.Flag.DELETED)
+            .add(Flags.Flag.RECENT)
+            .add(Flags.Flag.DRAFT)
+            .add(Flags.Flag.FLAGGED)
+            .add(Flags.Flag.SEEN)
+            .build();
+
+        SimpleMailboxMessage message = MESSAGE_BUILDER.messageId(MESSAGE_ID_4)
+            .uid(MESSAGE_UID_4)
+            .flags(flags)
+            .build();
+
+        testee.add(session, mailbox, message).block();
+
+        assertThat(testee.retrieveIndexedFlags(mailbox, MESSAGE_UID_4).block())
+            .isEqualTo(flags);
+    }
+
+    @Test
+    void retrieveIndexedFlagsShouldReturnUserFlags() {
+        Flags flags = FlagsBuilder.builder()
+            .add("flag1")
+            .add("flag2")
+            .build();
+
+        SimpleMailboxMessage message = MESSAGE_BUILDER.messageId(MESSAGE_ID_4)
+            .uid(MESSAGE_UID_4)
+            .flags(flags)
+            .build();
+
+        testee.add(session, mailbox, message).block();
+
+        assertThat(testee.retrieveIndexedFlags(mailbox, MESSAGE_UID_4).block())
+            .isEqualTo(flags);
+    }
+
+    @Test
+    void retrieveIndexedFlagsShouldReturnUserAndSystemFlags() {
+        Flags flags = FlagsBuilder.builder()
+            .add(Flags.Flag.ANSWERED)
+            .add(Flags.Flag.DELETED)
+            .add("flag1")
+            .add("flag2")
+            .build();
+
+        SimpleMailboxMessage message = MESSAGE_BUILDER.messageId(MESSAGE_ID_4)
+            .uid(MESSAGE_UID_4)
+            .flags(flags)
+            .build();
+
+        testee.add(session, mailbox, message).block();
+
+        assertThat(testee.retrieveIndexedFlags(mailbox, MESSAGE_UID_4).block())
+            .isEqualTo(flags);
+    }
+
+    @Test
+    void retrieveIndexedFlagsShouldPropagateExceptionWhenNotFound() {
+        assertThatThrownBy(() -> testee.retrieveIndexedFlags(mailbox, MESSAGE_UID_4).block())
+            .isInstanceOf(IndexNotFoundException.class);
+    }
 }
\ No newline at end of file


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