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
commit 09a02ce474f9432423cec645fb47d6b77ad04fcd Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Tue Nov 12 14:32:56 2019 +0700 MAILBOX-391 MailboxMapper::findMailboxWithPathLike should be also queried for child mailboxes This allows to avoid further requests for positionning child metadata --- .../org/apache/james/mailbox/model/search/ExactName.java | 5 +++++ .../mailbox/model/search/MailboxNameExpression.java | 2 ++ .../apache/james/mailbox/model/search/MailboxQuery.java | 12 +++++++----- .../apache/james/mailbox/model/search/PrefixedRegex.java | 5 +++++ .../james/mailbox/model/search/PrefixedWildcard.java | 5 +++++ .../org/apache/james/mailbox/model/search/Wildcard.java | 5 +++++ .../apache/james/mailbox/store/StoreMailboxManager.java | 16 +++++++--------- .../james/mailbox/store/StoreMailboxManagerTest.java | 4 ++-- 8 files changed, 38 insertions(+), 16 deletions(-) diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java index 1a9b0c8..1c04431 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java @@ -49,6 +49,11 @@ public class ExactName implements MailboxNameExpression { } @Override + public MailboxNameExpression includeChildren() { + return new PrefixedWildcard(name); + } + + @Override public final boolean equals(Object o) { if (o instanceof ExactName) { ExactName exactName = (ExactName) o; diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java index eda289d..8a17ee5 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java @@ -53,6 +53,8 @@ public interface MailboxNameExpression { */ boolean isWild(); + MailboxNameExpression includeChildren(); + /** * Gets wildcard character that matches any series of characters. * diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java index 4ed7c58..52afd64 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java @@ -112,10 +112,10 @@ public class MailboxQuery { } public static class UserBound extends MailboxQuery { - private UserBound(Optional<String> namespace, Optional<String> user, MailboxNameExpression mailboxNameExpression) { - super(namespace, user, mailboxNameExpression); - Preconditions.checkArgument(namespace.isPresent()); - Preconditions.checkArgument(user.isPresent()); + private UserBound(String namespace, String user, MailboxNameExpression mailboxNameExpression) { + super(Optional.of(namespace), Optional.of(user), mailboxNameExpression); + Preconditions.checkNotNull(namespace); + Preconditions.checkNotNull(user); } public String getFixedNamespace() { @@ -180,7 +180,9 @@ public class MailboxQuery { } public UserBound asUserBound() { - return new UserBound(namespace, user, mailboxNameExpression); + Preconditions.checkState(namespace.isPresent(), "This MailboxQuery is not user bound as namespace is missing"); + Preconditions.checkState(user.isPresent(), "This MailboxQuery is not user bound as user is missing"); + return new UserBound(namespace.get(), user.get(), mailboxNameExpression); } @Override diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java index 86e6743..3f2be46 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java @@ -54,6 +54,11 @@ public class PrefixedRegex implements MailboxNameExpression { } @Override + public MailboxNameExpression includeChildren() { + return new PrefixedRegex(prefix, regex + "*", pathDelimiter); + } + + @Override public String getCombinedName() { if (prefix != null && prefix.length() > 0) { final int baseLength = prefix.length(); diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java index ae1e6fb..b313319 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java @@ -48,6 +48,11 @@ public class PrefixedWildcard implements MailboxNameExpression { } @Override + public MailboxNameExpression includeChildren() { + return this; + } + + @Override public final boolean equals(Object o) { if (o instanceof PrefixedWildcard) { PrefixedWildcard that = (PrefixedWildcard) o; diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java index fa647cb..73e76e5 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java @@ -47,6 +47,11 @@ public class Wildcard implements MailboxNameExpression { } @Override + public MailboxNameExpression includeChildren() { + return this; + } + + @Override public final boolean equals(Object o) { return o instanceof Wildcard; } diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java index d85608f..b40eb95 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java @@ -574,33 +574,31 @@ public class StoreMailboxManager implements MailboxManager { return searchMailboxes(mailboxExpression, session, Right.Lookup); } - private List<MailboxMetaData> searchMailboxes(MailboxQuery mailboxExpression, MailboxSession session, Right right) throws MailboxException { + private List<MailboxMetaData> searchMailboxes(MailboxQuery mailboxQuery, MailboxSession session, Right right) throws MailboxException { MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(session); Stream<Mailbox> baseMailboxes = mailboxMapper - .findMailboxWithPathLike(toSingleUserQuery(mailboxExpression, session)) + .findMailboxWithPathLike(toSingleUserQuery(mailboxQuery, session)) .stream(); - Stream<Mailbox> delegatedMailboxes = getDelegatedMailboxes(mailboxMapper, mailboxExpression, right, session); - List<Mailbox> mailboxes = Stream.concat(baseMailboxes, - delegatedMailboxes) + Stream<Mailbox> delegatedMailboxes = getDelegatedMailboxes(mailboxMapper, mailboxQuery, right, session); + List<Mailbox> mailboxes = Stream.concat(baseMailboxes, delegatedMailboxes) .distinct() .filter(Throwing.predicate(mailbox -> storeRightManager.hasRight(mailbox, right, session))) .collect(Guavate.toImmutableList()); return mailboxes .stream() - .filter(mailbox -> mailboxExpression.isPathMatch(mailbox.generateAssociatedPath())) + .filter(mailboxQuery::matches) .map(mailbox -> toMailboxMetadata(session, mailboxes, mailbox)) .sorted(new StandardMailboxMetaDataComparator()) .collect(Guavate.toImmutableList()); } public static MailboxQuery.UserBound toSingleUserQuery(MailboxQuery mailboxQuery, MailboxSession mailboxSession) { - MailboxNameExpression nameExpression = mailboxQuery.getMailboxNameExpression(); - return MailboxQuery.builder() .namespace(mailboxQuery.getNamespace().orElse(MailboxConstants.USER_NAMESPACE)) .username(mailboxQuery.getUser().orElse(mailboxSession.getUser().asString())) - .expression(nameExpression) + .expression(mailboxQuery.getMailboxNameExpression() + .includeChildren()) .build() .asUserBound(); } diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java index db99510..85834fd 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java @@ -208,7 +208,7 @@ public class StoreMailboxManagerTest { .isEqualTo(MailboxQuery.builder() .namespace(MailboxConstants.USER_NAMESPACE) .username("user") - .expression(new PrefixedRegex(EMPTY_PREFIX, "abc", session.getPathDelimiter())) + .expression(new PrefixedRegex(EMPTY_PREFIX, "abc*", session.getPathDelimiter())) .build() .asUserBound()); } @@ -227,7 +227,7 @@ public class StoreMailboxManagerTest { .isEqualTo(MailboxQuery.builder() .namespace(MailboxConstants.USER_NAMESPACE) .username("user") - .expression(new PrefixedRegex("prefix.", "abc", session.getPathDelimiter())) + .expression(new PrefixedRegex("prefix.", "abc*", session.getPathDelimiter())) .build() .asUserBound()); } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org