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 eb4633e51ee4fb205b24ccfb55ff87ed4274c0ef
Author: Benoit Tellier <[email protected]>
AuthorDate: Sun Apr 12 21:04:07 2020 +0700

    JAMES-3148 Cleanup Mailbox recents DAO
---
 .../CassandraMailboxSessionMapperFactory.java      |  2 +-
 .../mailbox/cassandra/DeleteMessageListener.java   |  6 +++-
 .../cassandra/mail/CassandraMailboxRecentsDAO.java | 18 ++++++++++--
 .../cassandra/CassandraMailboxManagerTest.java     | 32 ++++++++++++++++++++++
 .../mail/CassandraMailboxRecentDAOTest.java        | 19 +++++++++++++
 5 files changed, 73 insertions(+), 4 deletions(-)

diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index 3631d52..def8f71 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -206,6 +206,6 @@ public class CassandraMailboxSessionMapperFactory extends 
MailboxSessionMapperFa
     public DeleteMessageListener deleteMessageListener() {
         return new DeleteMessageListener(imapUidDAO, messageIdDAO, messageDAO, 
attachmentDAOV2, ownerDAO,
             attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, 
applicableFlagDAO, firstUnseenDAO, deletedMessageDAO,
-            mailboxCounterDAO);
+            mailboxCounterDAO, mailboxRecentsDAO);
     }
 }
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
index ed70a9a..521a59a 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
@@ -36,6 +36,7 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -73,13 +74,14 @@ public class DeleteMessageListener implements 
MailboxListener.GroupMailboxListen
     private final CassandraFirstUnseenDAO firstUnseenDAO;
     private final CassandraDeletedMessageDAO deletedMessageDAO;
     private final CassandraMailboxCounterDAO counterDAO;
+    private final CassandraMailboxRecentsDAO recentsDAO;
 
     @Inject
     public DeleteMessageListener(CassandraMessageIdToImapUidDAO imapUidDAO, 
CassandraMessageIdDAO messageIdDAO, CassandraMessageDAO messageDAO,
                                  CassandraAttachmentDAOV2 attachmentDAO, 
CassandraAttachmentOwnerDAO ownerDAO,
                                  CassandraAttachmentMessageIdDAO 
attachmentMessageIdDAO, CassandraACLMapper aclMapper,
                                  CassandraUserMailboxRightsDAO rightsDAO, 
CassandraApplicableFlagDAO applicableFlagDAO,
-                                 CassandraFirstUnseenDAO firstUnseenDAO, 
CassandraDeletedMessageDAO deletedMessageDAO, CassandraMailboxCounterDAO 
counterDAO) {
+                                 CassandraFirstUnseenDAO firstUnseenDAO, 
CassandraDeletedMessageDAO deletedMessageDAO, CassandraMailboxCounterDAO 
counterDAO, CassandraMailboxRecentsDAO recentsDAO) {
         this.imapUidDAO = imapUidDAO;
         this.messageIdDAO = messageIdDAO;
         this.messageDAO = messageDAO;
@@ -92,6 +94,7 @@ public class DeleteMessageListener implements 
MailboxListener.GroupMailboxListen
         this.firstUnseenDAO = firstUnseenDAO;
         this.deletedMessageDAO = deletedMessageDAO;
         this.counterDAO = counterDAO;
+        this.recentsDAO = recentsDAO;
     }
 
     @Override
@@ -132,6 +135,7 @@ public class DeleteMessageListener implements 
MailboxListener.GroupMailboxListen
                 .then(firstUnseenDAO.removeAll(mailboxId))
                 .then(deletedMessageDAO.removeAll(mailboxId))
                 .then(counterDAO.delete(mailboxId))
+                .then(recentsDAO.delete(mailboxId))
                 .block();
         }
     }
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
index 3d91975..ed96abd 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.delete;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
@@ -36,6 +35,7 @@ import 
org.apache.james.mailbox.cassandra.table.CassandraMailboxRecentsTable;
 import com.datastax.driver.core.BoundStatement;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.google.common.annotations.VisibleForTesting;
 
 import reactor.core.publisher.Flux;
@@ -46,6 +46,7 @@ public class CassandraMailboxRecentsDAO {
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final PreparedStatement readStatement;
     private final PreparedStatement deleteStatement;
+    private final PreparedStatement deleteAllStatement;
     private final PreparedStatement addStatement;
     private CassandraUtils cassandraUtils;
 
@@ -54,6 +55,7 @@ public class CassandraMailboxRecentsDAO {
         cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
         readStatement = createReadStatement(session);
         deleteStatement = createDeleteStatement(session);
+        deleteAllStatement = createDeleteAllStatement(session);
         addStatement = createAddStatement(session);
         this.cassandraUtils = cassandraUtils;
     }
@@ -72,12 +74,19 @@ public class CassandraMailboxRecentsDAO {
 
     private PreparedStatement createDeleteStatement(Session session) {
         return session.prepare(
-            delete()
+            QueryBuilder.delete()
                 .from(CassandraMailboxRecentsTable.TABLE_NAME)
                 .where(eq(CassandraMailboxRecentsTable.MAILBOX_ID, 
bindMarker(CassandraMailboxRecentsTable.MAILBOX_ID)))
                 .and(eq(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID, 
bindMarker(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID))));
     }
 
+    private PreparedStatement createDeleteAllStatement(Session session) {
+        return session.prepare(
+            QueryBuilder.delete()
+                .from(CassandraMailboxRecentsTable.TABLE_NAME)
+                .where(eq(CassandraMailboxRecentsTable.MAILBOX_ID, 
bindMarker(CassandraMailboxRecentsTable.MAILBOX_ID))));
+    }
+
     private PreparedStatement createAddStatement(Session session) {
         return session.prepare(
             insertInto(CassandraMailboxRecentsTable.TABLE_NAME)
@@ -103,6 +112,11 @@ public class CassandraMailboxRecentsDAO {
             .setLong(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID, 
messageUid.asLong()));
     }
 
+    public Mono<Void> delete(CassandraId mailboxId) {
+        return cassandraAsyncExecutor.executeVoid(deleteAllStatement.bind()
+            .setUUID(CassandraMailboxRecentsTable.MAILBOX_ID, 
mailboxId.asUuid()));
+    }
+
     public Mono<Void> addToRecent(CassandraId mailboxId, MessageUid 
messageUid) {
         return cassandraAsyncExecutor.executeVoid(addStatement.bind()
             .setUUID(CassandraMailboxRecentsTable.MAILBOX_ID, 
mailboxId.asUuid())
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index 36ca5d8..0865d83 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -48,6 +48,7 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -702,6 +703,37 @@ public class CassandraMailboxManagerTest extends 
MailboxManagerTest<CassandraMai
                 .isEmpty();
         }
 
+        @Test
+        void deleteMailboxShouldCleanUpRecent(CassandraCluster 
cassandraCluster) throws Exception {
+            inboxManager.appendMessage(MessageManager.AppendCommand.builder()
+                .withFlags(new Flags(Flags.Flag.RECENT))
+                
.build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")),
 session);
+
+            mailboxManager.deleteMailbox(inbox, session);
+
+            assertThat(new 
CassandraMailboxRecentsDAO(cassandraCluster.getConf()).getRecentMessageUidsInMailbox((CassandraId)
 inboxId)
+                .collectList().block())
+                .isEmpty();
+        }
+
+        @Test
+        void deleteMailboxShouldCleanUpRecentWhenFailure(CassandraCluster 
cassandraCluster) throws Exception {
+            inboxManager.appendMessage(MessageManager.AppendCommand.builder()
+                .withFlags(new Flags(Flags.Flag.RECENT))
+                
.build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")),
 session);
+
+
+            cassandraCluster.getConf().registerScenario(fail()
+                .times(1)
+                .whenQueryStartsWith("DELETE FROM mailboxRecents WHERE 
mailboxId=:mailboxId;"));
+
+            mailboxManager.deleteMailbox(inbox, session);
+
+            assertThat(new 
CassandraMailboxRecentsDAO(cassandraCluster.getConf()).getRecentMessageUidsInMailbox((CassandraId)
 inboxId)
+                .collectList().block())
+                .isEmpty();
+        }
+
         private CassandraMailboxCounterDAO countersDAO(CassandraCluster 
cassandraCluster) {
             return new CassandraMailboxCounterDAO(cassandraCluster.getConf());
         }
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
index 8e05300..e773083 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
 
 import java.util.stream.IntStream;
 
@@ -78,6 +79,24 @@ class CassandraMailboxRecentDAOTest {
     }
 
     @Test
+    void getRecentMessageUidsInMailboxShouldNotReturnDeletedItems() {
+        testee.addToRecent(CASSANDRA_ID, UID1).block();
+        testee.addToRecent(CASSANDRA_ID, UID2).block();
+
+        testee.delete(CASSANDRA_ID).block();
+
+        assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID)
+            .collectList()
+            .block())
+            .isEmpty();
+    }
+
+    @Test
+    void deleteShouldNotThrowWhenNothing() {
+        assertThatCode(() -> 
testee.delete(CASSANDRA_ID).block()).doesNotThrowAnyException();
+    }
+
+    @Test
     void removeFromRecentShouldNotFailIfNotExisting() {
         testee.removeFromRecent(CASSANDRA_ID, UID1).block();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to