This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch 3.8.x
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 5766ed851042450a333fe9b266b7d4acbb91e467
Author: Benoit TELLIER <btell...@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-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to