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