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 ma...@apache.org on 2016/07/25 08:33:59 UTC

[8/8] james-project git commit: MAILBOX-273 Add partial multimailbox support for simple search backend

MAILBOX-273 Add partial multimailbox support for simple search backend


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/e456c073
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/e456c073
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/e456c073

Branch: refs/heads/master
Commit: e456c07333db5735599cc7a93cbe05476c6b7a40
Parents: 7a6a4c1
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Thu Jul 21 14:45:16 2016 +0200
Committer: Matthieu Baechler <ma...@linagora.com>
Committed: Mon Jul 25 10:13:31 2016 +0200

----------------------------------------------------------------------
 .../search/SimpleMessageSearchIndexTest.java    | 19 +-----
 .../mailbox/store/StoreMailboxManager.java      |  2 +-
 .../store/search/SimpleMessageSearchIndex.java  | 64 ++++++++++++++++----
 3 files changed, 56 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/e456c073/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index f034769..b974db9 100644
--- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -39,7 +39,7 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
     @Override
     protected void initializeMailboxManager() throws Exception {
         MailboxSessionMapperFactory mapperFactory = new InMemoryMailboxSessionMapperFactory();
-        messageSearchIndex = new SimpleMessageSearchIndex(mapperFactory);
+        messageSearchIndex = new SimpleMessageSearchIndex(mapperFactory, mapperFactory);
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new MockAuthenticator(),
@@ -214,29 +214,14 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
     @Override
     public void sortShouldOrderMessages() throws Exception {
     }
-    
-    @Ignore
-    @Override
-    public void multimailboxSearchShouldReturnUidOfMessageMarkedAsSeenInTwoMailboxes() throws MailboxException {
-    }
 
     @Ignore
     @Override
-    public void multimailboxSearchShouldReturnUidOfMessageMarkedAsSeenInAllMailboxes() throws MailboxException {
-    }
-    
-    @Ignore
-    @Override
     public void multimailboxSearchShouldReturnUidOfMessageWithExpectedFromInTwoMailboxes() throws MailboxException {
     }
-    
+
     @Ignore
     @Override
     public void multimailboxSearchShouldReturnUidOfMessageWithExpectedFromInAllMailboxes() throws MailboxException {
     }
-    
-    @Ignore
-    @Override
-    public void multimailboxSearchShouldReturnUidOfMessageMarkedAsSeenInOneMailbox() throws MailboxException {
-    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e456c073/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
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 84f24ae..7f5bd28 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
@@ -173,7 +173,7 @@ public class StoreMailboxManager implements MailboxManager {
         dispatcher = new MailboxEventDispatcher(getDelegationListener());
 
         if (index == null) {
-            index = new SimpleMessageSearchIndex(mailboxSessionMapperFactory);
+            index = new SimpleMessageSearchIndex(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
         }
         if (index instanceof ListeningMessageSearchIndex) {
             this.addGlobalListener((MailboxListener) index, null);

http://git-wip-us.apache.org/repos/asf/james-project/blob/e456c073/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
index 4a2e8d1..7d05a49 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.search;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.Iterator;
@@ -31,8 +32,8 @@ import javax.inject.Inject;
 import org.apache.james.mailbox.MailboxManager.SearchCapabilities;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.exception.UnsupportedSearchException;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.SearchQuery;
@@ -40,12 +41,18 @@ import org.apache.james.mailbox.model.SearchQuery.ConjunctionCriterion;
 import org.apache.james.mailbox.model.SearchQuery.Criterion;
 import org.apache.james.mailbox.model.SearchQuery.NumericRange;
 import org.apache.james.mailbox.model.SearchQuery.UidCriterion;
+import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableMultimap.Builder;
+import com.google.common.collect.Multimap;
+
 /**
  * {@link MessageSearchIndex} which just fetch {@link MailboxMessage}'s from the {@link MessageMapper} and use {@link MessageSearcher}
  * to match them against the {@link SearchQuery}.
@@ -55,17 +62,20 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
  *
  */
 public class SimpleMessageSearchIndex implements MessageSearchIndex {
+    private static final String WILDCARD = "%";
 
-    private final MessageMapperFactory factory;
+    private final MessageMapperFactory messageMapperFactory;
+    private final MailboxMapperFactory mailboxMapperFactory;
     
     @Inject
-    public SimpleMessageSearchIndex(MessageMapperFactory factory) {
-        this.factory = factory;
+    public SimpleMessageSearchIndex(MessageMapperFactory messageMapperFactory, MailboxMapperFactory mailboxMapperFactory) {
+        this.messageMapperFactory = messageMapperFactory;
+        this.mailboxMapperFactory = mailboxMapperFactory;
     }
     
     @Override
     public EnumSet<SearchCapabilities> getSupportedCapabilities() {
-        return EnumSet.noneOf(SearchCapabilities.class);
+        return EnumSet.of(SearchCapabilities.MultimailboxSearch);
     }
     
     /**
@@ -89,7 +99,22 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
     
     @Override
     public Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery query) throws MailboxException {
-        MessageMapper mapper = factory.getMessageMapper(session);
+        return searchMultimap(session, ImmutableList.of(mailbox), query)
+                .get(mailbox.getMailboxId())
+                .iterator();
+    }
+    
+    private Multimap<MailboxId, Long> searchMultimap(MailboxSession session, List<Mailbox> mailboxes, SearchQuery query) throws MailboxException {
+        Builder<MailboxId, Long> multimap = ImmutableMultimap.builder();
+        for (Mailbox mailbox: mailboxes) {
+            multimap.putAll(searchMultimap(session, mailbox, query));
+        }
+        return multimap.build();
+
+    }
+    
+    private Multimap<MailboxId, Long> searchMultimap(MailboxSession session, Mailbox mailbox, SearchQuery query) throws MailboxException {
+        MessageMapper mapper = messageMapperFactory.getMessageMapper(session);
 
         final SortedSet<MailboxMessage> hitSet = new TreeSet<MailboxMessage>();
 
@@ -115,15 +140,32 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
         
         // MessageSearches does the filtering for us
         if (session == null) {
-			return new MessageSearches(hitSet.iterator(), query).iterator();
-		} else {
-			return new MessageSearches(hitSet.iterator(), query, session.getLog()).iterator();
-		}
+            return ImmutableMultimap.<MailboxId, Long>builder()
+                        .putAll(mailbox.getMailboxId(), ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query).iterator()))
+                        .build();
+        } else {
+            return ImmutableMultimap.<MailboxId, Long>builder()
+                        .putAll(mailbox.getMailboxId(), ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query, session.getLog()).iterator()))
+                        .build();
+        }
     }
 
     @Override
     public Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
-        throw new UnsupportedSearchException();
+        List<Mailbox> allUserMailboxes = mailboxMapperFactory.getMailboxMapper(session)
+                .findMailboxWithPathLike(new MailboxPath(session.getPersonalSpace(), session.getUser().getUserName(), WILDCARD));
+        if (searchQuery.getMailboxIds().isEmpty()) {
+            return searchMultimap(session, allUserMailboxes, searchQuery.getSearchQuery())
+                    .asMap();
+        }
+        List<Mailbox> queriedMailboxes = new ArrayList<Mailbox>();
+        for (Mailbox mailbox: allUserMailboxes) {
+            if (searchQuery.getMailboxIds().contains(mailbox.getMailboxId())) {
+                queriedMailboxes.add(mailbox);
+            }
+        }
+        return searchMultimap(session, queriedMailboxes, searchQuery.getSearchQuery())
+                .asMap();
     }
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org