You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/11/14 02:09:38 UTC
[james-project] 21/32: MAILBOX-391
MailboxMapper::findMailboxWithPathLike should be also queried for child
mailboxes
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 <bt...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org