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 <[email protected]> Authored: Thu Jul 21 14:45:16 2016 +0200 Committer: Matthieu Baechler <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
