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/26 10:38:36 UTC

[1/2] james-project git commit: JAMES-1807 implement notInMailbox correctly

Repository: james-project
Updated Branches:
  refs/heads/master 9af58b759 -> 46d377f87


JAMES-1807 implement notInMailbox correctly


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

Branch: refs/heads/master
Commit: 46d377f870375a53a8a16b239e8c292108f5f44a
Parents: fd37855
Author: Matthieu Baechler <ma...@linagora.com>
Authored: Tue Jul 26 11:39:14 2016 +0200
Committer: Matthieu Baechler <ma...@linagora.com>
Committed: Tue Jul 26 12:37:41 2016 +0200

----------------------------------------------------------------------
 ...lasticSearchListeningMessageSearchIndex.java |  5 ++--
 .../elasticsearch/query/QueryConverter.java     | 27 ++++++++++++--------
 .../search/ElasticSearchSearcher.java           | 13 +++++-----
 .../store/search/SimpleMessageSearchIndex.java  | 17 +++++++++---
 .../integration/GetMessageListMethodTest.java   |  3 ---
 .../jmap/methods/GetMessageListMethod.java      | 17 ++++++++----
 6 files changed, 50 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/46d377f8/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index 63f0fec..5d24222 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -83,8 +83,9 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     public Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
         MailboxId mailboxId = mailbox.getMailboxId();
+        MultimailboxesSearchQuery query = MultimailboxesSearchQuery.from(searchQuery).inMailboxes(mailboxId).build();
         return searcher
-                .search(ImmutableList.of(session.getUser()), ImmutableList.of(mailboxId), searchQuery)
+                .search(ImmutableList.of(session.getUser()), query)
                 .get(mailboxId)
                 .iterator();
     }
@@ -93,7 +94,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     public Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery)
             throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
-        return searcher.search(ImmutableList.of(session.getUser()), searchQuery.getInMailboxes(), searchQuery.getSearchQuery()).asMap();
+        return searcher.search(ImmutableList.of(session.getUser()), searchQuery).asMap();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/46d377f8/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
index 0757b34..fb25109 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
@@ -21,16 +21,20 @@ package org.apache.james.mailbox.elasticsearch.query;
 
 import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
 import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
+import static org.elasticsearch.index.query.QueryBuilders.notQuery;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 
 import javax.inject.Inject;
 
 import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.SearchQuery;
+import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 
 import com.github.steveash.guavate.Guavate;
@@ -46,10 +50,13 @@ public class QueryConverter {
         this.criterionConverter = criterionConverter;
     }
 
-    public QueryBuilder from(SearchQuery searchQuery, List<User> users, Collection<MailboxId> mailboxIds) {
-        QueryBuilder queryBuilder = generateQueryBuilder(searchQuery);
-        queryBuilder = addUsersFilter(queryBuilder, users);
-        return addMailboxFilters(queryBuilder, mailboxIds);
+    public QueryBuilder from(List<User> users, MultimailboxesSearchQuery query) {
+        BoolQueryBuilder boolQueryBuilder = boolQuery()
+            .must(generateQueryBuilder(query.getSearchQuery()))
+            .filter(usersQuery(users));
+        mailboxesQuery(query.getInMailboxes()).map(boolQueryBuilder::filter);
+        mailboxesQuery(query.getNotInMailboxes()).map(boolQueryBuilder::mustNot);
+        return boolQueryBuilder;
     }
 
     private QueryBuilder generateQueryBuilder(SearchQuery searchQuery) {
@@ -63,23 +70,21 @@ public class QueryConverter {
         }
     }
 
-    private QueryBuilder addUsersFilter(QueryBuilder queryBuilder, List<User> users) {
+    private QueryBuilder usersQuery(List<User> users) {
         ImmutableList<String> usernames = users.stream()
                 .map(User::getUserName)
                 .collect(Guavate.toImmutableList());
-        return boolQuery().must(queryBuilder)
-            .filter(termsQuery(JsonMessageConstants.USERS, usernames));
+        return termsQuery(JsonMessageConstants.USERS, usernames);
     }
 
-    private QueryBuilder addMailboxFilters(QueryBuilder queryBuilder, Collection<MailboxId> mailboxIds) {
+    private Optional<QueryBuilder> mailboxesQuery(Collection<MailboxId> mailboxIds) {
         if (mailboxIds.isEmpty()) {
-            return queryBuilder;
+            return Optional.empty();
         }
         ImmutableList<String> ids = mailboxIds.stream()
                 .map(MailboxId::serialize)
                 .collect(Guavate.toImmutableList());
-        return boolQuery().must(queryBuilder)
-            .filter(termsQuery(JsonMessageConstants.MAILBOX_ID, ids));
+        return Optional.of(termsQuery(JsonMessageConstants.MAILBOX_ID, ids));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/46d377f8/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
index 9edaa41..2eb4cf1 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.mailbox.elasticsearch.search;
 
-import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Stream;
@@ -36,7 +35,7 @@ import org.apache.james.mailbox.elasticsearch.query.SortConverter;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxId.Factory;
-import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.Client;
@@ -72,21 +71,21 @@ public class ElasticSearchSearcher {
         this.mailboxIdFactory = mailboxIdFactory;
     }
     
-    public Multimap<MailboxId, Long> search(List<User> users, Collection<MailboxId> mailboxIds, SearchQuery searchQuery) throws MailboxException {
-        return new ScrollIterable(client, getSearchRequestBuilder(client, users, mailboxIds, searchQuery)).stream()
+    public Multimap<MailboxId, Long> search(List<User> users, MultimailboxesSearchQuery query) throws MailboxException {
+        return new ScrollIterable(client, getSearchRequestBuilder(client, users, query)).stream()
             .flatMap(this::transformResponseToUidStream)
             .collect(Guavate.toImmutableListMultimap(Pair::getLeft, Pair::getRight));
     }
     
-    private SearchRequestBuilder getSearchRequestBuilder(Client client, List<User> users, Collection<MailboxId> mailboxIds, SearchQuery searchQuery) {
-        return searchQuery.getSorts()
+    private SearchRequestBuilder getSearchRequestBuilder(Client client, List<User> users, MultimailboxesSearchQuery query) {
+        return query.getSearchQuery().getSorts()
             .stream()
             .reduce(
                 client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
                     .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
                     .setScroll(TIMEOUT)
                     .addFields(JsonMessageConstants.ID, JsonMessageConstants.MAILBOX_ID)
-                    .setQuery(queryConverter.from(searchQuery, users, mailboxIds))
+                    .setQuery(queryConverter.from(users, query))
                     .setSize(size),
                 (searchBuilder, sort) -> searchBuilder.addSort(SortConverter.convertSort(sort)),
                 (partialResult1, partialResult2) -> partialResult1);

http://git-wip-us.apache.org/repos/asf/james-project/blob/46d377f8/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 667f2ab..6ada22f 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
@@ -49,6 +49,9 @@ import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableMultimap.Builder;
@@ -106,7 +109,7 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
                 .iterator();
     }
     
-    private Multimap<MailboxId, Long> searchMultimap(MailboxSession session, List<Mailbox> mailboxes, SearchQuery query) throws MailboxException {
+    private Multimap<MailboxId, Long> searchMultimap(MailboxSession session, Iterable<Mailbox> mailboxes, SearchQuery query) throws MailboxException {
         Builder<MailboxId, Long> multimap = ImmutableMultimap.builder();
         for (Mailbox mailbox: mailboxes) {
             multimap.putAll(searchMultimap(session, mailbox, query));
@@ -154,15 +157,21 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
     }
 
     @Override
-    public Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
+    public Map<MailboxId, Collection<Long>> search(MailboxSession session, final MultimailboxesSearchQuery searchQuery) throws MailboxException {
         List<Mailbox> allUserMailboxes = mailboxMapperFactory.getMailboxMapper(session)
                 .findMailboxWithPathLike(new MailboxPath(session.getPersonalSpace(), session.getUser().getUserName(), WILDCARD));
+        FluentIterable<Mailbox> filteredMailboxes = FluentIterable.from(allUserMailboxes).filter(new Predicate<Mailbox>() {
+            @Override
+            public boolean apply(Mailbox input) {
+                return !searchQuery.getNotInMailboxes().contains(input.getMailboxId());
+            }
+        });
         if (searchQuery.getInMailboxes().isEmpty()) {
-            return searchMultimap(session, allUserMailboxes, searchQuery.getSearchQuery())
+            return searchMultimap(session, filteredMailboxes, searchQuery.getSearchQuery())
                     .asMap();
         }
         List<Mailbox> queriedMailboxes = new ArrayList<Mailbox>();
-        for (Mailbox mailbox: allUserMailboxes) {
+        for (Mailbox mailbox: filteredMailboxes) {
             if (searchQuery.getInMailboxes().contains(mailbox.getMailboxId())) {
                 queriedMailboxes.add(mailbox);
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/46d377f8/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index c8b3d2e..ee24d6b 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -254,7 +254,6 @@ public abstract class GetMessageListMethodTest {
             .body(ARGUMENTS + ".messageIds", contains("username@domain.tld|mailbox|1"));
     }
 
-    @Ignore("Temporay break inMailboxes/notInMailboxes support")
     @Test
     public void getMessageListShouldFilterMessagesWhenNotInMailboxesFilterMatches() throws Exception {
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
@@ -276,7 +275,6 @@ public abstract class GetMessageListMethodTest {
             .body(ARGUMENTS + ".messageIds", empty());
     }
 
-    @Ignore("Temporay break inMailboxes/notInMailboxes support")
     @Test
     public void getMessageListShouldFilterMessagesWhenNotInMailboxesFilterMatchesTwice() throws Exception {
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
@@ -301,7 +299,6 @@ public abstract class GetMessageListMethodTest {
             .body(ARGUMENTS + ".messageIds", empty());
     }
 
-    @Ignore("Temporay break inMailboxes/notInMailboxes support")
     @Test
     public void getMessageListShouldFilterMessagesWhenIdenticalNotInMailboxesAndInmailboxesFilterMatch() throws Exception {
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");

http://git-wip-us.apache.org/repos/asf/james-project/blob/46d377f8/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
index 979eb60..5fb1dae 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -167,17 +168,23 @@ public class GetMessageListMethod implements Method {
         SearchQuery searchQuery = messageListRequest.getFilter()
                 .map(filter -> new FilterToSearchQuery().convert(filter))
                 .orElse(new SearchQuery());
-        Set<MailboxId> inMailboxes = filterToFilterCondition(messageListRequest.getFilter())
-                .flatMap(condition -> Guavate.stream(condition.getInMailboxes()))
-                .flatMap(List::stream)
-                .map(mailboxIdFactory::fromString)
-                .collect(Guavate.toImmutableSet());
+        Set<MailboxId> inMailboxes = buildFilterMailboxesSet(messageListRequest.getFilter(), condition -> condition.getInMailboxes());
+        Set<MailboxId> notInMailboxes = buildFilterMailboxesSet(messageListRequest.getFilter(), condition -> condition.getNotInMailboxes());
         return MultimailboxesSearchQuery
                 .from(searchQuery)
                 .inMailboxes(inMailboxes)
+                .notInMailboxes(notInMailboxes)
                 .build();
     }
 
+    private Set<MailboxId> buildFilterMailboxesSet(Optional<Filter> maybeFilter, Function<FilterCondition, Optional<List<String>>> mailboxListExtractor) {
+        return filterToFilterCondition(maybeFilter)
+            .flatMap(condition -> Guavate.stream(mailboxListExtractor.apply(condition)))
+            .flatMap(List::stream)
+            .map(mailboxIdFactory::fromString)
+            .collect(Guavate.toImmutableSet());
+    }
+    
     private Stream<FilterCondition> filterToFilterCondition(Optional<Filter> maybeCondition) {
         return Guavate.stream(maybeCondition)
                 .flatMap(c -> {


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


[2/2] james-project git commit: JAMES-1807 add notInMailboxes in MultimailboxesSearchQuery

Posted by ma...@apache.org.
JAMES-1807 add notInMailboxes in MultimailboxesSearchQuery


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

Branch: refs/heads/master
Commit: fd37855cbe2c64d4488b80e24b2697b72c2304f2
Parents: 9af58b7
Author: Matthieu Baechler <ma...@linagora.com>
Authored: Tue Jul 26 10:15:51 2016 +0200
Committer: Matthieu Baechler <ma...@linagora.com>
Committed: Tue Jul 26 12:37:41 2016 +0200

----------------------------------------------------------------------
 .../model/MultimailboxesSearchQuery.java        | 31 +++++++++++----
 .../model/MultimailboxesSearchQueryTest.java    | 42 ++++++++++++++++----
 ...lasticSearchListeningMessageSearchIndex.java |  2 +-
 .../lucene/search/LuceneMessageSearchIndex.java |  2 +-
 .../store/search/SimpleMessageSearchIndex.java  |  4 +-
 5 files changed, 63 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/fd37855c/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java
index 42e667b..b0b867d 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java
@@ -36,11 +36,13 @@ public class MultimailboxesSearchQuery {
         
         private final SearchQuery searchQuery;
         private ImmutableSet.Builder<MailboxId> mailboxIds;
+        private ImmutableSet.Builder<MailboxId> notInMailboxIds;
 
         private Builder(SearchQuery searchQuery) {
             Preconditions.checkNotNull(searchQuery);
             this.searchQuery = searchQuery;
             this.mailboxIds = ImmutableSet.builder();
+            this.notInMailboxIds = ImmutableSet.builder();
         }
 
         public Builder inMailboxes(Collection<MailboxId> mailboxIds) {
@@ -52,23 +54,38 @@ public class MultimailboxesSearchQuery {
             return inMailboxes(Arrays.asList(mailboxIds));
         }
         
-        public MultimailboxesSearchQuery build() {
-            return new MultimailboxesSearchQuery(searchQuery, mailboxIds.build());
+        public Builder notInMailboxes(Collection<MailboxId> mailboxIds) {
+            this.notInMailboxIds.addAll(mailboxIds);
+            return this;
         }
         
+        public Builder notInMailboxes(MailboxId... mailboxIds) {
+            return notInMailboxes(Arrays.asList(mailboxIds));
+        }
+
+        public MultimailboxesSearchQuery build() {
+            return new MultimailboxesSearchQuery(searchQuery, mailboxIds.build(), notInMailboxIds.build());
+        }
+
     }
 
     private final SearchQuery searchQuery;
-    private final ImmutableSet<MailboxId> mailboxIds;
+    private final ImmutableSet<MailboxId> inMailboxes;
+    private final ImmutableSet<MailboxId> notInMailboxes;
 
     @VisibleForTesting
-    MultimailboxesSearchQuery(SearchQuery searchQuery, ImmutableSet<MailboxId> mailboxIds) {
+    MultimailboxesSearchQuery(SearchQuery searchQuery, ImmutableSet<MailboxId> inMailboxes, ImmutableSet<MailboxId> notInMailboxes) {
         this.searchQuery = searchQuery;
-        this.mailboxIds = mailboxIds;
+        this.inMailboxes = inMailboxes;
+        this.notInMailboxes = notInMailboxes;
     }
 
-    public ImmutableSet<MailboxId> getMailboxIds() {
-        return mailboxIds;
+    public ImmutableSet<MailboxId> getInMailboxes() {
+        return inMailboxes;
+    }
+    
+    public ImmutableSet<MailboxId> getNotInMailboxes() {
+        return notInMailboxes;
     }
     
     public SearchQuery getSearchQuery() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/fd37855c/mailbox/api/src/test/java/org/apache/james/mailbox/model/MultimailboxesSearchQueryTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MultimailboxesSearchQueryTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MultimailboxesSearchQueryTest.java
index 92a77a2..867a70d 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MultimailboxesSearchQueryTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MultimailboxesSearchQueryTest.java
@@ -34,30 +34,58 @@ public class MultimailboxesSearchQueryTest {
     }
 
     @Test
-    public void buildShouldBuildWhenNoMailboxes() {
-        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, ImmutableSet.<MailboxId>of());
+    public void buildShouldBuildWheninMailboxes() {
+        ImmutableSet<MailboxId> inMailboxes = ImmutableSet.<MailboxId>of();
+        ImmutableSet<MailboxId> notInMailboxes = ImmutableSet.<MailboxId>of();
+        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, inMailboxes, notInMailboxes);
         MultimailboxesSearchQuery actual = MultimailboxesSearchQuery.from(EMPTY_QUERY).build();
         assertThat(actual).isEqualToComparingFieldByField(expected);
     }
 
     @Test
     public void buildShouldBuildWhenEmptyMailboxes() {
-        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, ImmutableSet.<MailboxId>of());
+        ImmutableSet<MailboxId> inMailboxes = ImmutableSet.<MailboxId>of();
+        ImmutableSet<MailboxId> notInMailboxes = ImmutableSet.<MailboxId>of();
+        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, inMailboxes, notInMailboxes);
         MultimailboxesSearchQuery actual = MultimailboxesSearchQuery.from(EMPTY_QUERY).inMailboxes().build();
         assertThat(actual).isEqualToComparingFieldByField(expected);
     }
 
     @Test
+    public void buildShouldBuildWhenEmptyNotInMailboxes() {
+        ImmutableSet<MailboxId> inMailboxes = ImmutableSet.<MailboxId>of();
+        ImmutableSet<MailboxId> notInMailboxes = ImmutableSet.<MailboxId>of();
+        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, inMailboxes, notInMailboxes);
+        MultimailboxesSearchQuery actual = MultimailboxesSearchQuery.from(EMPTY_QUERY).notInMailboxes().build();
+        assertThat(actual).isEqualToComparingFieldByField(expected);
+    }
+
+    
+    @Test
     public void buildShouldBuildWhenOneMailbox() {
-        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, ImmutableSet.<MailboxId>of(TestId.of(("id1"))));
+        ImmutableSet<MailboxId> inMailboxes = ImmutableSet.<MailboxId>of(TestId.of(("id1")));
+        ImmutableSet<MailboxId> notInMailboxes = ImmutableSet.<MailboxId>of();
+        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, inMailboxes, notInMailboxes);
         MultimailboxesSearchQuery actual = MultimailboxesSearchQuery.from(EMPTY_QUERY).inMailboxes(TestId.of("id1")).build();
         assertThat(actual).isEqualToComparingFieldByField(expected);
     }
 
     @Test
-    public void buildShouldBuildWhenTwoMailboxes() {
-        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, ImmutableSet.<MailboxId>of(TestId.of("id1"), TestId.of("id2")));
-        MultimailboxesSearchQuery actual = MultimailboxesSearchQuery.from(EMPTY_QUERY).inMailboxes(TestId.of("id1"), TestId.of("id2")).build();
+    public void buildShouldBuildWhenOneNotInMailbox() {
+        ImmutableSet<MailboxId> inMailboxes = ImmutableSet.<MailboxId>of();
+        ImmutableSet<MailboxId> notInMailboxes = ImmutableSet.<MailboxId>of(TestId.of(("id1")));
+        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, inMailboxes, notInMailboxes);
+        MultimailboxesSearchQuery actual = MultimailboxesSearchQuery.from(EMPTY_QUERY).notInMailboxes(TestId.of("id1")).build();
+        assertThat(actual).isEqualToComparingFieldByField(expected);
+    }
+
+    
+    @Test
+    public void buildShouldBuildWhenAllDefined() {
+        ImmutableSet<MailboxId> inMailboxes = ImmutableSet.<MailboxId>of(TestId.of("id1"));
+        ImmutableSet<MailboxId> notInMailboxes = ImmutableSet.<MailboxId>of(TestId.of("id2"));
+        MultimailboxesSearchQuery expected = new MultimailboxesSearchQuery(EMPTY_QUERY, inMailboxes, notInMailboxes);
+        MultimailboxesSearchQuery actual = MultimailboxesSearchQuery.from(EMPTY_QUERY).inMailboxes(TestId.of("id1")).notInMailboxes(TestId.of("id2")).build();
         assertThat(actual).isEqualToComparingFieldByField(expected);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/fd37855c/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index 47823db..63f0fec 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -93,7 +93,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     public Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery)
             throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
-        return searcher.search(ImmutableList.of(session.getUser()), searchQuery.getMailboxIds(), searchQuery.getSearchQuery()).asMap();
+        return searcher.search(ImmutableList.of(session.getUser()), searchQuery.getInMailboxes(), searchQuery.getSearchQuery()).asMap();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/fd37855c/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index bc48605..c87e8c2 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -451,7 +451,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         Multimap<MailboxId, Long> results = LinkedHashMultimap.create();
         IndexSearcher searcher = null;
 
-        Query inMailboxes = buildQueryFromMailboxes(searchQuery.getMailboxIds());
+        Query inMailboxes = buildQueryFromMailboxes(searchQuery.getInMailboxes());
         
         try {
             searcher = new IndexSearcher(IndexReader.open(writer, true));

http://git-wip-us.apache.org/repos/asf/james-project/blob/fd37855c/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 db16fd7..667f2ab 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
@@ -157,13 +157,13 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
     public Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
         List<Mailbox> allUserMailboxes = mailboxMapperFactory.getMailboxMapper(session)
                 .findMailboxWithPathLike(new MailboxPath(session.getPersonalSpace(), session.getUser().getUserName(), WILDCARD));
-        if (searchQuery.getMailboxIds().isEmpty()) {
+        if (searchQuery.getInMailboxes().isEmpty()) {
             return searchMultimap(session, allUserMailboxes, searchQuery.getSearchQuery())
                     .asMap();
         }
         List<Mailbox> queriedMailboxes = new ArrayList<Mailbox>();
         for (Mailbox mailbox: allUserMailboxes) {
-            if (searchQuery.getMailboxIds().contains(mailbox.getMailboxId())) {
+            if (searchQuery.getInMailboxes().contains(mailbox.getMailboxId())) {
                 queriedMailboxes.add(mailbox);
             }
         }


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