You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2023/06/09 06:52:14 UTC

[james-project] branch master updated: JAMES-3911 JPA: Propose a dedicated query for UID listing (#1583)

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


The following commit(s) were added to refs/heads/master by this push:
     new 0dc16e1cf0 JAMES-3911 JPA: Propose a dedicated query for UID listing (#1583)
0dc16e1cf0 is described below

commit 0dc16e1cf019b173ce44fe51ad8f52a644525cac
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Fri Jun 9 13:52:07 2023 +0700

    JAMES-3911 JPA: Propose a dedicated query for UID listing (#1583)
    
    Avoids loading all mail metadata
---
 .../apache/james/mailbox/jpa/mail/JPAMessageMapper.java | 17 +++++++++++++++--
 .../mail/model/openjpa/AbstractJPAMailboxMessage.java   |  1 +
 2 files changed, 16 insertions(+), 2 deletions(-)

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 39fba12976..c9a05f7cc9 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
@@ -59,6 +59,8 @@ import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
 
 import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import reactor.core.scheduler.Schedulers;
 
 /**
  * JPA implementation of a {@link MessageMapper}. This class is not thread-safe!
@@ -89,8 +91,17 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
 
     @Override
     public Flux<MessageUid> listAllMessageUids(Mailbox mailbox) {
-        return findInMailboxReactive(mailbox, MessageRange.all(), FetchType.METADATA, UNLIMITED)
-            .map(MailboxMessage::getUid);
+        return Mono.fromCallable(() -> {
+            try {
+                JPAId mailboxId = (JPAId) mailbox.getMailboxId();
+                Query query = getEntityManager().createNamedQuery("listUidsInMailbox")
+                    .setParameter("idParam", mailboxId.getRawId());
+                return query.getResultStream().map(result -> MessageUid.of((Long) result));
+            } catch (PersistenceException e) {
+                throw new MailboxException("Search of recent messages failed in mailbox " + mailbox, e);
+            }
+        }).flatMapMany(Flux::fromStream)
+            .subscribeOn(Schedulers.boundedElastic());
     }
 
     @Override
@@ -208,6 +219,8 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
         }
     }
 
+
+
     @Override
     public List<MessageUid> retrieveMessagesMarkedForDeletion(Mailbox mailbox, MessageRange messageRange) throws MailboxException {
         try {
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index 2b9887f18b..6de70c6d8c 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -80,6 +80,7 @@ import com.google.common.collect.ImmutableList;
 @IdClass(AbstractJPAMailboxMessage.MailboxIdUidKey.class)
 @NamedQueries({
         @NamedQuery(name = "findRecentMessageUidsInMailbox", query = "SELECT message.uid FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.recent = TRUE ORDER BY message.uid ASC"),
+        @NamedQuery(name = "listUidsInMailbox", query = "SELECT message.uid FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam ORDER BY message.uid ASC"),
         @NamedQuery(name = "findUnseenMessagesInMailboxOrderByUid", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.seen = FALSE ORDER BY message.uid ASC"),
         @NamedQuery(name = "findMessagesInMailbox", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam ORDER BY message.uid ASC"),
         @NamedQuery(name = "findMessagesInMailboxBetweenUIDs", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND :toParam ORDER BY message.uid ASC"),


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