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 2019/11/18 02:51:16 UTC

[james-project] 42/44: JAMES-2632 Allow bulk mailbox counter retrieval

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 f0d13b5b65772a72d483798bf4a9a31ae1d1053d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 8 13:22:04 2019 +0700

    JAMES-2632 Allow bulk mailbox counter retrieval
---
 .../cassandra/mail/CassandraMessageMapper.java     | 39 +++++++++-------------
 .../james/mailbox/jpa/mail/JPAMessageMapper.java   | 14 ++------
 .../jpa/mail/TransactionalMessageMapper.java       |  4 +--
 .../mailbox/maildir/mail/MaildirMessageMapper.java |  8 ++---
 .../inmemory/mail/InMemoryMessageMapper.java       |  5 +--
 .../james/mailbox/store/StoreMailboxManager.java   |  1 -
 .../james/mailbox/store/mail/MessageMapper.java    |  3 +-
 .../StoreMailboxMessageResultIteratorTest.java     |  2 +-
 .../store/mail/model/MessageMapperTest.java        |  2 +-
 9 files changed, 31 insertions(+), 47 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 675d648..b11c836 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -42,7 +42,6 @@ import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
-import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -115,41 +114,35 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
     @Override
-    public long countMessagesInMailbox(Mailbox mailbox) throws MailboxException {
-        return mailboxCounterDAO.countMessagesInMailbox(mailbox)
-                .defaultIfEmpty(0L)
-                .block();
+    public long countMessagesInMailbox(Mailbox mailbox) {
+        return getMailboxCounters(mailbox).getCount();
     }
 
     @Override
-    public long countUnseenMessagesInMailbox(Mailbox mailbox) throws MailboxException {
-        return mailboxCounterDAO.countUnseenMessagesInMailbox(mailbox)
-                .defaultIfEmpty(0L)
-                .block();
+    public long countUnseenMessagesInMailbox(Mailbox mailbox) {
+        return getMailboxCounters(mailbox).getUnseen();
     }
 
     @Override
-    public MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException {
-        CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
-        return getMailboxCounters(mailboxId)
-                .block();
+    public MailboxCounters getMailboxCounters(Mailbox mailbox) {
+        return getMailboxCountersAsMono(mailbox).block();
     }
 
-    private Mono<MailboxCounters> getMailboxCounters(CassandraId mailboxId) {
+    private Mono<MailboxCounters> getMailboxCountersAsMono(Mailbox mailbox) {
+        CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
         return mailboxCounterDAO.retrieveMailboxCounters(mailboxId)
-                .defaultIfEmpty(MailboxCounters.builder()
-                    .mailboxId(mailboxId)
-                    .count(0)
-                    .unseen(0)
-                    .build());
+            .defaultIfEmpty(MailboxCounters.builder()
+                .mailboxId(mailboxId)
+                .count(0)
+                .unseen(0)
+                .build());
     }
 
     @Override
-    public List<MailboxCounters> getMailboxCounters(Collection<MailboxId> mailboxIds) {
-        return Flux.fromIterable(mailboxIds)
+    public List<MailboxCounters> getMailboxCounters(Collection<Mailbox> mailboxes) {
+        return Flux.fromIterable(mailboxes)
             .publishOn(Schedulers.boundedElastic())
-            .map(id -> (CassandraId) id)
-            .concatMap(this::getMailboxCounters)
+            .concatMap(this::getMailboxCountersAsMono)
             .toStream()
             .collect(Guavate.toImmutableList());
     }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
index 6c88f59..a2475fe 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
@@ -42,7 +42,6 @@ import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMailboxMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMailboxMessage;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
-import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
@@ -154,16 +153,9 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
     }
 
     @Override
-    public List<MailboxCounters> getMailboxCounters(Collection<MailboxId> mailboxIds) throws MailboxException {
-        return mailboxIds.stream()
-            .map(id -> (JPAId) id)
-            .map(Throwing.<JPAId, MailboxCounters>function(
-                id -> MailboxCounters.builder()
-                    .mailboxId(id)
-                    .count(countMessagesInMailbox(id))
-                    .unseen(countUnseenMessagesInMailbox(id))
-                    .build())
-                .sneakyThrow())
+    public List<MailboxCounters> getMailboxCounters(Collection<Mailbox> mailboxes) throws MailboxException {
+        return mailboxes.stream()
+            .map(Throwing.<Mailbox, MailboxCounters>function(this::getMailboxCounters).sneakyThrow())
             .collect(Guavate.toImmutableList());
     }
 
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
index 58d34a4..658547c 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
@@ -156,7 +156,7 @@ public class TransactionalMessageMapper implements MessageMapper {
     }
 
     @Override
-    public List<MailboxCounters> getMailboxCounters(Collection<MailboxId> mailboxIds) throws MailboxException {
-        throw new NotImplementedException("not implemented");
+    public List<MailboxCounters> getMailboxCounters(Collection<Mailbox> mailboxes) throws MailboxException {
+        return messageMapper.getMailboxCounters(mailboxes);
     }
 }
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
index 17e6f44..2c9e427 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
@@ -36,7 +36,6 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -46,7 +45,6 @@ import org.apache.james.mailbox.maildir.MaildirStore;
 import org.apache.james.mailbox.maildir.mail.model.MaildirMailboxMessage;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
-import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
@@ -153,8 +151,10 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
     }
 
     @Override
-    public List<MailboxCounters> getMailboxCounters(Collection<MailboxId> mailboxIds) {
-        throw new NotImplementedException("Not available as maildir relies on mailboxPath");
+    public List<MailboxCounters> getMailboxCounters(Collection<Mailbox> mailboxes) throws MailboxException {
+        return mailboxes.stream()
+            .map(Throwing.<Mailbox, MailboxCounters>function(this::getMailboxCounters).sneakyThrow())
+            .collect(Guavate.toImmutableList());
     }
 
     @Override
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
index 6ef7781..f87f946 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
@@ -99,8 +99,9 @@ public class InMemoryMessageMapper extends AbstractMessageMapper {
     }
 
     @Override
-    public List<MailboxCounters> getMailboxCounters(Collection<MailboxId> mailboxIds) {
-        return mailboxIds.stream()
+    public List<MailboxCounters> getMailboxCounters(Collection<Mailbox> mailboxes) {
+        return mailboxes.stream()
+            .map(Mailbox::getMailboxId)
             .map(id -> MailboxCounters.builder()
                 .mailboxId(id)
                 .count(countMessagesInMailbox(id))
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index b80196b..671bc8c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -794,7 +794,6 @@ public class StoreMailboxManager implements MailboxManager {
         MessageMapper messageMapper = mailboxSessionMapperFactory.getMessageMapper(session);
         return messageMapper.getMailboxCounters(mailboxes.stream()
             .filter(Throwing.<Mailbox>predicate(mailbox -> storeRightManager.hasRight(mailbox, Right.Read, session)).sneakyThrow())
-            .map(Mailbox::getMailboxId)
             .collect(Guavate.toImmutableList()));
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
index 3fab26f..f01ddb0 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
@@ -30,7 +30,6 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
-import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -76,7 +75,7 @@ public interface MessageMapper extends Mapper {
 
     MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException;
 
-    List<MailboxCounters> getMailboxCounters(Collection<MailboxId> mailboxIds) throws MailboxException;
+    List<MailboxCounters> getMailboxCounters(Collection<Mailbox> mailboxes) throws MailboxException;
 
     /**
      * Delete the given {@link MailboxMessage}
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
index 28e164c..b3f7528 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
@@ -99,7 +99,7 @@ public class StoreMailboxMessageResultIteratorTest {
         }
 
         @Override
-        public List<MailboxCounters> getMailboxCounters(Collection<MailboxId> mailboxIds) throws MailboxException {
+        public List<MailboxCounters> getMailboxCounters(Collection<Mailbox> mailboxes) {
             throw new UnsupportedOperationException();
         }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index f57fde6..09323b8 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -131,7 +131,7 @@ public abstract class MessageMapperTest {
     @Test
     public void getMailboxCountersShouldReturnStoredValue() throws MailboxException {
         saveMessages();
-        assertThat(messageMapper.getMailboxCounters(ImmutableList.of(benwaInboxMailbox.getMailboxId(), benwaWorkMailbox.getMailboxId())))
+        assertThat(messageMapper.getMailboxCounters(ImmutableList.of(benwaInboxMailbox, benwaWorkMailbox)))
             .containsExactlyInAnyOrder(
                 MailboxCounters.builder()
                     .mailboxId(benwaInboxMailbox.getMailboxId())


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