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