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