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 2020/06/11 15:25:52 UTC
[james-project] 15/17: JAMES-3204 Demonstrate
CassandraMessageMapper partially applies limit
This is an automated email from the ASF dual-hosted git repository.
rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 3781196f9684961c843fabb9058d08e2aa1872cb
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 8 17:40:36 2020 +0700
JAMES-3204 Demonstrate CassandraMessageMapper partially applies limit
This class ends up doing reads to messageV2 for entries that are later
on discarded by the soft limit.
---
.../cassandra/mail/CassandraMessageMapperTest.java | 44 ++++++++++++++++++----
1 file changed, 37 insertions(+), 7 deletions(-)
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
index 7898cb4..97f86ef 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
@@ -22,21 +22,28 @@ package org.apache.james.mailbox.cassandra.mail;
import static org.apache.james.backends.cassandra.Scenario.Builder.fail;
import static org.assertj.core.api.Assertions.assertThat;
+import java.util.Iterator;
import java.util.Optional;
import org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.StatementRecorder;
import org.apache.james.mailbox.cassandra.ids.CassandraId;
import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
import org.apache.james.mailbox.store.mail.model.MapperProvider;
import org.apache.james.mailbox.store.mail.model.MessageMapperTest;
import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
+import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
+import com.datastax.driver.core.BoundStatement;
import com.github.fge.lambdas.Throwing;
class CassandraMessageMapperTest extends MessageMapperTest {
@@ -48,6 +55,29 @@ class CassandraMessageMapperTest extends MessageMapperTest {
return new CassandraMapperProvider(cassandraCluster.getCassandraCluster());
}
+ @Disabled("Currently generates a read to messageV2 per stored message despite the limit")
+ @Test
+ void findInMailboxLimitShouldLimitProjectionReadCassandraQueries(CassandraCluster cassandra) throws MailboxException {
+ saveMessages();
+
+ StatementRecorder statementRecorder = new StatementRecorder();
+ cassandra.getConf().recordStatements(statementRecorder);
+
+ int limit = 2;
+ consume(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Full, limit));
+
+ assertThat(statementRecorder.listExecutedStatements())
+ .filteredOn(statement -> statement instanceof BoundStatement)
+ .extracting(BoundStatement.class::cast)
+ .extracting(statement -> statement.preparedStatement().getQueryString())
+ .filteredOn(statementString -> statementString.equals("SELECT messageId,internalDate,bodyStartOctet,fullContentOctets,bodyOctets,bodyContent,headerContent,textualLineCount,properties,attachments FROM messageV2 WHERE messageId=:messageId;"))
+ .hasSize(limit);
+ }
+
+ private void consume(Iterator<MailboxMessage> inMailbox) {
+ ImmutableList.copyOf(inMailbox);
+ }
+
@Nested
class FailureTesting {
@Test
@@ -65,7 +95,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
- softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+ softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
.toIterable()
.isEmpty();
softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
@@ -88,7 +118,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
- softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+ softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
.toIterable()
.isEmpty();
softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
@@ -111,7 +141,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
- softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+ softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
.toIterable()
.isEmpty();
softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
@@ -134,7 +164,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
- softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+ softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
.toIterable()
.isEmpty();
softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
@@ -158,7 +188,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(cassandra.getConf(), new CassandraMessageId.Factory());
SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
- softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+ softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
.toIterable()
.isEmpty();
softly.assertThat(imapUidDAO.retrieve((CassandraMessageId) message1.getMessageId(), Optional.empty()).collectList().block())
@@ -175,7 +205,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
messageMapper.add(benwaInboxMailbox, message1);
- assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+ assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
.toIterable()
.hasSize(1);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org