chibenwa commented on code in PR #2963:
URL: https://github.com/apache/james-project/pull/2963#discussion_r2890133925
##########
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala:
##########
@@ -92,81 +89,21 @@ class EmailQueryMethod @Inject() (serializer:
EmailQuerySerializer,
}
private def executeQuery(session: MailboxSession, request:
EmailQueryRequest, searchQuery: MultimailboxesSearchQuery, position: Position,
limit: Limit): SMono[EmailQueryResponse] = {
- val ids: SMono[Seq[MessageId]] = request match {
- case request: EmailQueryRequest if
matchesInMailboxSortedByReceivedAt(request) =>
- queryViewForListingSortedByReceivedAt(session, position, limit,
request, searchQuery.getNamespace)
- case request: EmailQueryRequest if
matchesInMailboxAfterSortedByReceivedAt(request) =>
- queryViewForContentAfterSortedByReceivedAt(session, position, limit,
request, searchQuery.getNamespace)
- case request: EmailQueryRequest if
matchesInMailboxBeforeSortedByReceivedAt(request) =>
- queryViewForContentBeforeSortedByReceivedAt(session, position, limit,
request, searchQuery.getNamespace)
- case _ => executeQueryAgainstSearchIndex(session, searchQuery, position,
limit)
- }
+ val ids: SMono[Seq[MessageId]] = executeQueryOptimizers(session, request,
searchQuery, position, limit)
+ .getOrElse(executeQueryAgainstSearchIndex(session, searchQuery,
position, limit))
+ .collectSeq()
ids.map(ids => toResponse(request, position, limit, ids))
}
-
- private def queryViewForContentAfterSortedByReceivedAt(mailboxSession:
MailboxSession, position: Position, limitToUse: Limit, request:
EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
- val condition: FilterCondition =
request.filter.get.asInstanceOf[FilterCondition]
- val mailboxId: MailboxId = condition.inMailbox.get
- val after: ZonedDateTime = condition.after.get.asUTC
- val collapseThreads: Boolean = getCollapseThreads(request)
-
- val queryViewEntries: SFlux[MessageId] =
SFlux.fromPublisher(emailQueryViewManager.getEmailQueryView(mailboxSession.getUser)
- .listMailboxContentSinceAfterSortedByReceivedAt(mailboxId, after,
JavaLimit.from(limitToUse.value + position.value), collapseThreads))
-
- fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession,
position, limitToUse, namespace)
- }
-
- private def queryViewForContentBeforeSortedByReceivedAt(mailboxSession:
MailboxSession, position: Position, limitToUse: Limit, request:
EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
- val condition: FilterCondition =
request.filter.get.asInstanceOf[FilterCondition]
- val mailboxId: MailboxId = condition.inMailbox.get
- val before: ZonedDateTime = condition.before.get.asUTC
- val collapseThreads: Boolean = getCollapseThreads(request)
-
- val queryViewEntries: SFlux[MessageId] =
SFlux.fromPublisher(emailQueryViewManager.getEmailQueryView(mailboxSession.getUser)
- .listMailboxContentBeforeSortedByReceivedAt(mailboxId, before,
JavaLimit.from(limitToUse.value + position.value), collapseThreads))
-
- fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession,
position, limitToUse, namespace)
- }
-
- private def queryViewForListingSortedByReceivedAt(mailboxSession:
MailboxSession, position: Position, limitToUse: Limit, request:
EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
- val mailboxId: MailboxId =
request.filter.get.asInstanceOf[FilterCondition].inMailbox.get
- val collapseThreads: Boolean = getCollapseThreads(request)
-
- val queryViewEntries: SFlux[MessageId] =
SFlux.fromPublisher(emailQueryViewManager
-
.getEmailQueryView(mailboxSession.getUser).listMailboxContentSortedByReceivedAt(mailboxId,
JavaLimit.from(limitToUse.value + position.value), collapseThreads))
-
- fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession,
position, limitToUse, namespace)
- }
-
- private def fromQueryViewEntries(mailboxId: MailboxId, queryViewEntries:
SFlux[MessageId], mailboxSession: MailboxSession, position: Position,
limitToUse: Limit, namespace: Namespace): SMono[Seq[MessageId]] =
- SMono(mailboxManager.getMailboxReactive(mailboxId, mailboxSession))
- .filter(messageManager =>
namespace.keepAccessible(messageManager.getMailboxEntity))
- .flatMap(_ => queryViewEntries
- .drop(position.value)
- .take(limitToUse.value)
- .collectSeq())
- .switchIfEmpty(SMono.just[Seq[MessageId]](Seq()))
- .onErrorResume({
- case _: MailboxNotFoundException => SMono.just[Seq[MessageId]](Seq())
- case e => SMono.error[Seq[MessageId]](e)
- })
-
- private def matchesInMailboxSortedByReceivedAt(request: EmailQueryRequest):
Boolean =
- configuration.isEmailQueryViewEnabled &&
- request.filter.exists(_.inMailboxFilterOnly) &&
- request.sort.contains(Set(Comparator.RECEIVED_AT_DESC))
-
- private def matchesInMailboxAfterSortedByReceivedAt(request:
EmailQueryRequest): Boolean =
- configuration.isEmailQueryViewEnabled &&
- request.filter.exists(_.inMailboxAndAfterFilterOnly) &&
- request.sort.contains(Set(Comparator.RECEIVED_AT_DESC))
-
- private def matchesInMailboxBeforeSortedByReceivedAt(request:
EmailQueryRequest): Boolean =
- configuration.isEmailQueryViewEnabled &&
- request.filter.exists(_.inMailboxAndBeforeFilterOnly) &&
- request.sort.contains(Set(Comparator.RECEIVED_AT_DESC))
+ private def executeQueryOptimizers(session: MailboxSession, request:
EmailQueryRequest, searchQuery: MultimailboxesSearchQuery, position: Position,
limit: Limit): Option[SFlux[MessageId]] =
+ if (configuration.isEmailQueryViewEnabled) {
Review Comment:
This if is evil.
We should inject `EmailQueryViewOptimizer` if and only if it's enabled in
the conf.
Or at the very least this if should be moved in the relevant optimizer.
As it stands disabling emailQueryView would prevent any other optimizers to
be run...
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]