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