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