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 ro...@apache.org on 2016/12/19 10:38:33 UTC

[3/9] james-project git commit: JAMES-1888 MessageDAO should take care of retrieving the mailbox the message is IN

JAMES-1888 MessageDAO should take care of retrieving the mailbox the message is IN

And not return always the first one.
Also try to limit duplicate MessageId retrieval


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

Branch: refs/heads/master
Commit: a3bcb78c21da6f53cb04b428a865850a67997497
Parents: f78cc58
Author: Benoit Tellier <bt...@linagora.com>
Authored: Fri Dec 16 11:02:51 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Dec 19 16:36:17 2016 +0700

----------------------------------------------------------------------
 .../cassandra/mail/CassandraMessageDAO.java     | 61 +++++++++-----------
 1 file changed, 28 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a3bcb78c/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
index a581bfc..510ef33 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
@@ -87,11 +87,12 @@ import com.datastax.driver.core.UDTValue;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.datastax.driver.core.querybuilder.Select;
 import com.datastax.driver.core.querybuilder.Select.Where;
+import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
-import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableListMultimap;
 import com.google.common.io.ByteStreams;
 import com.google.common.primitives.Bytes;
 
@@ -182,16 +183,22 @@ public class CassandraMessageDAO {
 
     public CompletableFuture<Stream<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Optional<Integer> limit) {
         return retrieveRows(messageIds, fetchType, limit)
-                .thenApply(resultSet -> CassandraUtils.convertToStream(resultSet)
-                        .map(row -> message(row, messageIds, fetchType)));
+                .thenApply(resultSet -> toMessagesWithoutAttachements(messageIds, fetchType, resultSet));
+    }
+
+    private Stream<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>> toMessagesWithoutAttachements(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, ResultSet resultSet) {
+        ImmutableListMultimap<MessageId, Row> messagesById = CassandraUtils.convertToStream(resultSet)
+            .collect(Guavate.toImmutableListMultimap(row -> messageIdFactory.of(row.getUUID(MESSAGE_ID)), row -> row));
+        return messageIds.stream()
+            .filter(composedId -> !messagesById.get(composedId.getComposedMessageId().getMessageId()).isEmpty())
+            .map(composedId -> message(messagesById.get(composedId.getComposedMessageId().getMessageId()).get(0), composedId, fetchType));
     }
 
     private CompletableFuture<ResultSet> retrieveRows(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Optional<Integer> limit) {
         return cassandraAsyncExecutor.execute(
                 buildSelectQueryWithLimit(
                         buildQuery(messageIds, fetchType),
-                        limit)
-                );
+                        limit));
     }
     
     private Where buildQuery(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType) {
@@ -205,27 +212,22 @@ public class CassandraMessageDAO {
                         .collect(Collectors.toList())));
     }
 
-    private Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> message(Row row, List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType) {
-        try {
-            ComposedMessageIdWithMetaData messageIdWithMetaData = retrieveComposedMessageId(messageIdFactory.of(row.getUUID(MESSAGE_ID)), messageIds);
-            ComposedMessageId messageId = messageIdWithMetaData.getComposedMessageId();
-
-            MessageWithoutAttachment messageWithoutAttachment =
-                new MessageWithoutAttachment(
-                    messageId.getMessageId(),
-                    row.getDate(INTERNAL_DATE),
-                    row.getLong(FULL_CONTENT_OCTETS),
-                    row.getInt(BODY_START_OCTET),
-                    buildContent(row, fetchType),
-                    messageIdWithMetaData.getFlags(),
-                    getPropertyBuilder(row),
-                    messageId.getMailboxId(),
-                    messageId.getUid(),
-                    messageIdWithMetaData.getModSeq());
-            return Pair.of(messageWithoutAttachment, getAttachments(row, fetchType));
-        } catch (MailboxException e) {
-            throw Throwables.propagate(e);
-        }
+    private Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> message(Row row,ComposedMessageIdWithMetaData messageIdWithMetaData, FetchType fetchType) {
+        ComposedMessageId messageId = messageIdWithMetaData.getComposedMessageId();
+
+        MessageWithoutAttachment messageWithoutAttachment =
+            new MessageWithoutAttachment(
+                messageId.getMessageId(),
+                row.getDate(INTERNAL_DATE),
+                row.getLong(FULL_CONTENT_OCTETS),
+                row.getInt(BODY_START_OCTET),
+                buildContent(row, fetchType),
+                messageIdWithMetaData.getFlags(),
+                getPropertyBuilder(row),
+                messageId.getMailboxId(),
+                messageId.getUid(),
+                messageIdWithMetaData.getModSeq());
+        return Pair.of(messageWithoutAttachment, getAttachments(row, fetchType));
     }
 
     private PropertyBuilder getPropertyBuilder(Row row) {
@@ -263,13 +265,6 @@ public class CassandraMessageDAO {
                 .build();
     }
 
-    private ComposedMessageIdWithMetaData retrieveComposedMessageId(CassandraMessageId messageId, List<ComposedMessageIdWithMetaData> messageIds) throws MailboxException {
-        return messageIds.stream()
-            .filter(composedMessage -> composedMessage.isMatching(messageId))
-            .findFirst()
-            .orElseThrow(() -> new MailboxException("Message not found: " + messageId));
-    }
-
     private String[] retrieveFields(FetchType fetchType) {
         switch (fetchType) {
             case Body:


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