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/02/27 03:32:10 UTC

[james-project] 03/08: JAMES-3058 Add CassandraMailboxPathV2DAO::listAll

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 ff3bfac67c14ea96fddc844ab52f928a89bf626a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Feb 13 13:17:50 2020 +0700

    JAMES-3058 Add CassandraMailboxPathV2DAO::listAll
    
    This will be required for iterating DAO entries while looking for
    inconsistencies
---
 .../cassandra/mail/CassandraMailboxPathV2DAO.java  | 19 ++++++++--
 .../mail/CassandraMailboxPathDAOImplTest.java      |  4 +--
 .../mail/CassandraMailboxPathDAOTest.java          |  6 ++--
 .../mail/CassandraMailboxPathV2DAOTest.java        | 41 ++++++++++++++++++++--
 4 files changed, 61 insertions(+), 9 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
index 38a0448..8b4c05d 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
@@ -58,6 +58,7 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
     private final PreparedStatement delete;
     private final PreparedStatement insert;
     private final PreparedStatement select;
+    private final PreparedStatement selectUser;
     private final PreparedStatement selectAll;
 
     @Inject
@@ -67,6 +68,7 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
         this.insert = prepareInsert(session);
         this.delete = prepareDelete(session);
         this.select = prepareSelect(session);
+        this.selectUser = prepareSelectUser(session);
         this.selectAll = prepareSelectAll(session);
     }
 
@@ -96,13 +98,18 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
             .and(eq(MAILBOX_NAME, bindMarker(MAILBOX_NAME))));
     }
 
-    private PreparedStatement prepareSelectAll(Session session) {
+    private PreparedStatement prepareSelectUser(Session session) {
         return session.prepare(select(FIELDS)
             .from(TABLE_NAME)
             .where(eq(NAMESPACE, bindMarker(NAMESPACE)))
             .and(eq(USER, bindMarker(USER))));
     }
 
+    private PreparedStatement prepareSelectAll(Session session) {
+        return session.prepare(select(FIELDS)
+            .from(TABLE_NAME));
+    }
+
     @Override
     public Mono<CassandraIdAndPath> retrieveId(MailboxPath mailboxPath) {
         return cassandraAsyncExecutor.executeSingleRow(
@@ -118,7 +125,7 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
     @Override
     public Flux<CassandraIdAndPath> listUserMailboxes(String namespace, Username user) {
         return cassandraAsyncExecutor.execute(
-            selectAll.bind()
+            selectUser.bind()
                 .setString(NAMESPACE, namespace)
                 .setString(USER, sanitizeUser(user)))
             .flatMapMany(resultSet -> cassandraUtils.convertToFlux(resultSet)
@@ -126,6 +133,14 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
                 .map(FunctionalUtils.toFunction(this::logReadSuccess)));
     }
 
+    public Flux<CassandraIdAndPath> listAll() {
+        return cassandraAsyncExecutor.execute(
+            selectAll.bind())
+            .flatMapMany(resultSet -> cassandraUtils.convertToFlux(resultSet)
+                .map(this::fromRowToCassandraIdAndPath)
+                .map(FunctionalUtils.toFunction(this::logReadSuccess)));
+    }
+
     /**
      * See https://issues.apache.org/jira/browse/MAILBOX-322 to read about the Ghost mailbox bug.
      *
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
index 3a40381..c310d71 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
@@ -24,10 +24,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.junit.jupiter.api.Test;
 
-class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest {
+class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest<CassandraMailboxPathDAOImpl> {
 
     @Override
-    CassandraMailboxPathDAO testee(CassandraCluster cassandra) {
+    CassandraMailboxPathDAOImpl testee(CassandraCluster cassandra) {
         return new CassandraMailboxPathDAOImpl(cassandra.getConf(), cassandra.getTypesProvider());
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
index 62c4026..fc00da1 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
@@ -37,7 +37,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public abstract class CassandraMailboxPathDAOTest {
+public abstract class CassandraMailboxPathDAOTest<T extends CassandraMailboxPathDAO> {
     private static final Username USER = Username.of("user");
     private static final Username OTHER_USER = Username.of("other");
 
@@ -53,9 +53,9 @@ public abstract class CassandraMailboxPathDAOTest {
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
         CassandraMailboxModule.MODULE, CassandraSchemaVersionModule.MODULE));
 
-    protected CassandraMailboxPathDAO testee;
+    protected T testee;
 
-    abstract CassandraMailboxPathDAO testee(CassandraCluster cassandra);
+    abstract T testee(CassandraCluster cassandra);
 
     @BeforeEach
     void setUp(CassandraCluster cassandra) {
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
index 1bfcffc..4e6e40f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
@@ -19,12 +19,49 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.junit.jupiter.api.Test;
 
-class CassandraMailboxPathV2DAOTest extends CassandraMailboxPathDAOTest {
+class CassandraMailboxPathV2DAOTest extends CassandraMailboxPathDAOTest<CassandraMailboxPathV2DAO> {
     @Override
-    CassandraMailboxPathDAO testee(CassandraCluster cassandra) {
+    CassandraMailboxPathV2DAO testee(CassandraCluster cassandra) {
         return new CassandraMailboxPathV2DAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
     }
+
+    @Test
+    void listAllShouldBeEmptyByDefault() {
+        assertThat(testee.listAll().collectList().block()).isEmpty();
+    }
+
+    @Test
+    void listAllShouldContainAddedEntry() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+
+        assertThat(testee.listAll().collectList().block())
+            .containsExactlyInAnyOrder(INBOX_ID_AND_PATH);
+    }
+
+    @Test
+    void listAllShouldNotContainDeletedEntry() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+
+        testee.delete(USER_INBOX_MAILBOXPATH).block();
+
+        assertThat(testee.listAll().collectList().block())
+            .isEmpty();
+    }
+
+    @Test
+    void listAllShouldContainAddedEntries() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+        testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).block();
+
+        assertThat(testee.listAll().collectList().block())
+            .containsExactlyInAnyOrder(
+                INBOX_ID_AND_PATH,
+                new CassandraIdAndPath(otherMailboxId, OTHER_USER_MAILBOXPATH));
+    }
 }
\ 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