http://git-wip-us.apache.org/repos/asf/james-project/blob/299addd9/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java index 49acd2a..74f8a3b 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java @@ -21,18 +21,17 @@ package org.apache.james.mailbox.store.search; import static org.assertj.core.api.Assertions.assertThat; -import java.util.Collection; import java.util.Date; -import java.util.Map; +import java.util.List; import javax.mail.Flags; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; -import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; -import org.apache.james.mailbox.model.MailboxId; +import org.apache.james.mailbox.model.ComposedMessageId; import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.MultimailboxesSearchQuery; import org.apache.james.mailbox.model.SearchQuery; import org.apache.james.mailbox.model.SearchQuery.AddressType; @@ -50,6 +49,7 @@ import com.google.common.collect.Lists; public abstract class AbstractMessageSearchIndexTest { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMessageSearchIndexTest.class); + public static final long LIMIT = 100L; protected MessageSearchIndex messageSearchIndex; protected StoreMailboxManager storeMailboxManager; @@ -57,15 +57,16 @@ public abstract class AbstractMessageSearchIndexTest { private Mailbox mailbox2; private MailboxSession session; - private MessageUid m1; - private MessageUid m2; - private MessageUid m3; - private MessageUid m4; - private MessageUid m5; - private MessageUid m6; - private MessageUid m7; - private MessageUid m8; - private MessageUid m9; + private ComposedMessageId m1; + private ComposedMessageId m2; + private ComposedMessageId m3; + private ComposedMessageId m4; + private ComposedMessageId m5; + private ComposedMessageId m6; + private ComposedMessageId m7; + private ComposedMessageId m8; + private ComposedMessageId m9; + private ComposedMessageId mOther; @Before public void setUp() throws Exception { @@ -87,7 +88,7 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1388617200000L), session, true, - new Flags(Flags.Flag.DELETED)).getUid(); + new Flags(Flags.Flag.DELETED)); // sentDate: Thu, 4 Jun 2015 09:23:37 +0000 // Internal date : 2014/02/02 00:00:00.000 m2 = inboxMessageManager.appendMessage( @@ -95,7 +96,7 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1391295600000L), session, true, - new Flags(Flags.Flag.ANSWERED)).getUid(); + new Flags(Flags.Flag.ANSWERED)); // sentDate: Thu, 4 Jun 2015 09:27:37 +0000 // Internal date : 2014/03/02 00:00:00.000 m3 = inboxMessageManager.appendMessage( @@ -103,7 +104,7 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1393714800000L), session, true, - new Flags(Flags.Flag.DRAFT)).getUid(); + new Flags(Flags.Flag.DRAFT)); // sentDate: Tue, 2 Jun 2015 08:16:19 +0000 // Internal date : 2014/05/02 00:00:00.000 m4 = inboxMessageManager.appendMessage( @@ -111,7 +112,7 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1398981600000L), session, true, - new Flags(Flags.Flag.RECENT)).getUid(); + new Flags(Flags.Flag.RECENT)); // sentDate: Fri, 15 May 2015 06:35:59 +0000 // Internal date : 2014/04/02 00:00:00.000 m5 = inboxMessageManager.appendMessage( @@ -119,7 +120,7 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1396389600000L), session, true, - new Flags(Flags.Flag.FLAGGED)).getUid(); + new Flags(Flags.Flag.FLAGGED)); // sentDate: Wed, 03 Jun 2015 19:14:32 +0000 // Internal date : 2014/06/02 00:00:00.000 m6 = inboxMessageManager.appendMessage( @@ -127,7 +128,7 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1401660000000L), session, true, - new Flags(Flags.Flag.SEEN)).getUid(); + new Flags(Flags.Flag.SEEN)); // sentDate: Thu, 04 Jun 2015 07:36:08 +0000 // Internal date : 2014/07/02 00:00:00.000 m7 = inboxMessageManager.appendMessage( @@ -135,7 +136,7 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1404252000000L), session, false, - new Flags()).getUid(); + new Flags()); // sentDate: Thu, 4 Jun 2015 06:08:41 +0200 // Internal date : 2014/08/02 00:00:00.000 m8 = inboxMessageManager.appendMessage( @@ -143,10 +144,10 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1406930400000L), session, true, - new Flags("Hello")).getUid(); + new Flags("Hello")); // sentDate: Thu, 4 Jun 2015 06:08:41 +0200 // Internal date : 2014/08/02 00:00:00.000 - myFolderMessageManager.appendMessage( + mOther = myFolderMessageManager.appendMessage( ClassLoader.getSystemResourceAsStream("eml/mail.eml"), new Date(1406930400000L), session, @@ -159,7 +160,7 @@ public abstract class AbstractMessageSearchIndexTest { new Date(1409608800000L), session, true, - new Flags("Hello you")).getUid(); + new Flags("Hello you")); await(); } @@ -187,7 +188,7 @@ public abstract class AbstractMessageSearchIndexTest { public void emptySearchQueryShouldReturnAllUids() throws MailboxException { SearchQuery searchQuery = new SearchQuery(); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3, m4, m5, m6, m7, m8, m9); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -195,7 +196,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.all()); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3, m4, m5, m6, m7, m8, m9); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -206,7 +207,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.bodyContains("MAILET-94")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m5); + .containsOnly(m5.getUid()); } @Test @@ -218,7 +219,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.bodyContains("created summary")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m2, m8); + .containsOnly(m2.getUid(), m8.getUid()); } @Test @@ -226,7 +227,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.DELETED)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1); + .containsOnly(m1.getUid()); } @Test @@ -234,7 +235,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.ANSWERED)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m2); + .containsOnly(m2.getUid()); } @Test @@ -242,7 +243,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.DRAFT)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m3); + .containsOnly(m3.getUid()); } @Test @@ -251,7 +252,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.RECENT)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3, m4, m5, m6, m8, m9); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -259,7 +260,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.FLAGGED)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m5); + .containsOnly(m5.getUid()); } @Test @@ -268,17 +269,17 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.SEEN)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m6); + .containsOnly(m6.getUid()); } @Test public void multimailboxSearchShouldReturnUidOfMessageMarkedAsSeenInAllMailboxes() throws MailboxException { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.SEEN)); - Map<MailboxId, Collection<MessageUid>> actual = messageSearchIndex.search(session, MultimailboxesSearchQuery.from(searchQuery).build()); - assertThat(actual.entrySet()).hasSize(2); - assertThat(actual.get(mailbox.getMailboxId())).containsExactly(m6); - assertThat(actual.get(mailbox2.getMailboxId())).containsExactly(m1); + + List<MessageId> actual = messageSearchIndex.search(session, MultimailboxesSearchQuery.from(searchQuery).build(), LIMIT); + + assertThat(actual).containsOnly(mOther.getMessageId(), m6.getMessageId()); } @Test @@ -290,9 +291,10 @@ public abstract class AbstractMessageSearchIndexTest { .from(searchQuery) .inMailboxes(mailbox.getMailboxId()) .build(); - Map<MailboxId, Collection<MessageUid>> actual = messageSearchIndex.search(session, query); - assertThat(actual.entrySet()).hasSize(1); - assertThat(actual.get(mailbox.getMailboxId())).containsExactly(m6); + + List<MessageId> actual = messageSearchIndex.search(session, query, LIMIT); + + assertThat(actual).containsOnly(m6.getMessageId()); } @Test @@ -304,10 +306,9 @@ public abstract class AbstractMessageSearchIndexTest { .from(searchQuery) .inMailboxes(mailbox.getMailboxId(), mailbox2.getMailboxId()) .build(); - Map<MailboxId, Collection<MessageUid>> actual = messageSearchIndex.search(session, query); - assertThat(actual.entrySet()).hasSize(2); - assertThat(actual.get(mailbox.getMailboxId())).containsExactly(m8); - assertThat(actual.get(mailbox2.getMailboxId())).containsExactly(m1); + List<MessageId> actual = messageSearchIndex.search(session, query, LIMIT); + + assertThat(actual).containsOnly(mOther.getMessageId(), m8.getMessageId()); } @Test @@ -318,10 +319,10 @@ public abstract class AbstractMessageSearchIndexTest { MultimailboxesSearchQuery .from(searchQuery) .build(); - Map<MailboxId, Collection<MessageUid>> actual = messageSearchIndex.search(session, query); - assertThat(actual.entrySet()).hasSize(2); - assertThat(actual.get(mailbox.getMailboxId())).containsExactly(m8); - assertThat(actual.get(mailbox2.getMailboxId())).containsExactly(m1); + + List<MessageId> actual = messageSearchIndex.search(session, query, LIMIT); + + assertThat(actual).containsOnly(mOther.getMessageId(), m8.getMessageId()); } @Test @@ -333,18 +334,36 @@ public abstract class AbstractMessageSearchIndexTest { .from(searchQuery) .inMailboxes(mailbox.getMailboxId(), mailbox2.getMailboxId()) .build(); - Map<MailboxId, Collection<MessageUid>> actual = messageSearchIndex.search(session, query); - assertThat(actual.entrySet()).hasSize(2); - assertThat(actual.get(mailbox.getMailboxId())).containsExactly(m6); - assertThat(actual.get(mailbox2.getMailboxId())).containsExactly(m1); + + List<MessageId> actual = messageSearchIndex.search(session, query, LIMIT); + + assertThat(actual).containsOnly(mOther.getMessageId(), m6.getMessageId()); } - + + @Test + public void multimailboxSearchShouldLimitTheSize() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.SEEN)); + MultimailboxesSearchQuery query = + MultimailboxesSearchQuery + .from(searchQuery) + .inMailboxes(mailbox.getMailboxId(), mailbox2.getMailboxId()) + .build(); + + long limit = 1; + List<MessageId> actual = messageSearchIndex.search(session, query, limit); + // Two messages matches this query : mOther and m6 + + assertThat(actual).hasSize(1); + } + + @Test public void flagIsSetShouldReturnUidsOfMessageContainingAGivenUserFlag() throws MailboxException { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsSet("Hello")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m8); + .containsOnly(m8.getUid()); } @Test @@ -360,7 +379,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.DELETED)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m2, m3, m4, m5, m6, m7, m8, m9); + .containsOnly(m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -368,7 +387,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m3, m4, m5, m6, m7, m8, m9); + .containsOnly(m1.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -376,7 +395,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m4, m5, m6, m7, m8, m9); + .containsOnly(m1.getUid(), m2.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -385,7 +404,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.RECENT)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m7); + .containsOnly(m7.getUid()); } @Test @@ -393,7 +412,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3, m4, m6, m7, m8, m9); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -402,7 +421,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.SEEN)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3, m4, m5, m7, m8, m9); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -410,7 +429,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.flagIsUnSet("Hello")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3, m4, m5, m6, m7, m9); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m7.getUid(), m9.getUid()); } @Test @@ -419,7 +438,7 @@ public abstract class AbstractMessageSearchIndexTest { // Date : 2014/07/02 00:00:00.000 ( Paris time zone ) searchQuery.andCriteria(SearchQuery.internalDateAfter(new Date(1404252000000L), SearchQuery.DateResolution.Day)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m7, m8, m9); + .containsOnly(m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -428,7 +447,7 @@ public abstract class AbstractMessageSearchIndexTest { // Date : 2014/02/02 00:00:00.000 ( Paris time zone ) searchQuery.andCriteria(SearchQuery.internalDateBefore(new Date(1391295600000L), SearchQuery.DateResolution.Day)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2); + .containsOnly(m1.getUid(), m2.getUid()); } @Test @@ -437,7 +456,7 @@ public abstract class AbstractMessageSearchIndexTest { // Date : 2014/03/02 00:00:00.000 ( Paris time zone ) searchQuery.andCriteria(SearchQuery.internalDateOn(new Date(1393714800000L), SearchQuery.DateResolution.Day)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m3); + .containsOnly(m3.getUid()); } @Test @@ -445,7 +464,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.modSeqEquals(2L)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m2); + .containsOnly(m2.getUid()); } @Test @@ -453,7 +472,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(7L)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m7, m8, m9); + .containsOnly(m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -461,7 +480,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.modSeqLessThan(3L)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid()); } @Test @@ -470,7 +489,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.sizeGreaterThan(6800L)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m6); + .containsOnly(m6.getUid()); } @Test @@ -479,7 +498,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.sizeLessThan(5000L)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m2, m3, m4, m5, m7, m9); + .containsOnly(m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m7.getUid(), m9.getUid()); } @Test @@ -487,7 +506,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.headerContains("Precedence", "list")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m6, m8, m9); + .containsOnly(m1.getUid(), m6.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -495,7 +514,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.headerExists("Precedence")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3, m4, m5, m6, m8, m9); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -503,7 +522,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.From, "murari....@gmail.com")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m8); + .containsOnly(m8.getUid()); } @Test @@ -511,7 +530,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.To, "r...@listes.minet.net")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1); + .containsOnly(m1.getUid()); } @Test @@ -519,7 +538,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.Cc, "a...@any.com")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m5); + .containsOnly(m5.getUid()); } @Test @@ -527,16 +546,16 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.Bcc, "n...@no.com")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m9); + .containsOnly(m9.getUid()); } @Test public void uidShouldreturnExistingUidsOnTheGivenRanges() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m4), new SearchQuery.UidRange(m6, m7)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m4.getUid()), new SearchQuery.UidRange(m6.getUid(), m7.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m2, m3, m4, m6, m7); + .containsOnly(m2.getUid(), m3.getUid(), m4.getUid(), m6.getUid(), m7.getUid()); } @Test @@ -545,7 +564,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery.UidRange[] numericRanges = {}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m2, m3, m4, m5, m6, m7, m8, m9); + .containsOnly(m1.getUid(), m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -554,7 +573,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria(SearchQuery.headerExists("Precedence")); searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(6L)); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m6, m8, m9); + .containsOnly(m6.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -565,19 +584,19 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery.headerExists("Precedence"), SearchQuery.modSeqGreaterThan(6L))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m6, m8, m9); + .containsOnly(m6.getUid(), m8.getUid(), m9.getUid()); } @Test public void orShouldReturnResultsMatchinganyRequests() throws Exception { - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m4)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m4.getUid())}; SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria( SearchQuery.or( SearchQuery.uid(numericRanges), SearchQuery.modSeqGreaterThan(6L))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m2, m3, m4, m6, m7, m8, m9); + .containsOnly(m2.getUid(), m3.getUid(), m4.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -586,7 +605,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria( SearchQuery.not(SearchQuery.headerExists("Precedence"))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m7); + .containsOnly(m7.getUid()); } @Test @@ -595,7 +614,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria(SearchQuery.all()); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m1, m2, m3, m5, m4, m6, m7, m8, m9); + .containsExactly(m1.getUid(), m2.getUid(), m3.getUid(), m5.getUid(), m4.getUid(), m6.getUid(), m7.getUid(), m8.getUid(), m9.getUid()); } @Test @@ -604,7 +623,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria(SearchQuery.all()); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m9, m8, m7, m6, m4, m5, m3, m2, m1); + .containsExactly(m9.getUid(), m8.getUid(), m7.getUid(), m6.getUid(), m4.getUid(), m5.getUid(), m3.getUid(), m2.getUid(), m1.getUid()); } @Test @@ -614,7 +633,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria(SearchQuery.headerDateAfter("sentDate", new Date(1433408400000L), SearchQuery.DateResolution.Second)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m3, m2); + .containsOnly(m3.getUid(), m2.getUid()); } @Test @@ -624,7 +643,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria(SearchQuery.headerDateBefore("sentDate", new Date(1433109600000L), SearchQuery.DateResolution.Day)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m5); + .containsOnly(m5.getUid()); } @Test @@ -634,7 +653,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria(SearchQuery.headerDateOn("sentDate", new Date(1433224800000L), SearchQuery.DateResolution.Day)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m4, m9); + .containsOnly(m4.getUid(), m9.getUid()); } @Test @@ -642,17 +661,17 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.mailContains("root mailing list")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsOnly(m1, m6); + .containsOnly(m1.getUid(), m6.getUid()); } @Test public void sortOnCcShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxCc))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m3, m5, m4, m2); + .containsExactly(m3.getUid(), m5.getUid(), m4.getUid(), m2.getUid()); // 2 : No cc // 3 : Cc : a...@abc.org // 4 : z...@bcd.org @@ -662,11 +681,11 @@ public abstract class AbstractMessageSearchIndexTest { @Test public void sortOnFromShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxFrom))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m3, m2, m4, m5); + .containsExactly(m3.getUid(), m2.getUid(), m4.getUid(), m5.getUid()); // 2 : ji...@apache.org // 3 : ji...@apache.org // 4 : j...@apache.org @@ -676,11 +695,11 @@ public abstract class AbstractMessageSearchIndexTest { @Test public void sortOnToShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxTo))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m5, m2, m3, m4); + .containsExactly(m5.getUid(), m2.getUid(), m3.getUid(), m4.getUid()); // 2 : server-dev@james.apache.org // 3 : server-dev@james.apache.org // 4 : server-dev@james.apache.org @@ -690,11 +709,11 @@ public abstract class AbstractMessageSearchIndexTest { @Test public void sortOnSubjectShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.BaseSubject))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m4, m3, m2, m5); + .containsExactly(m4.getUid(), m3.getUid(), m2.getUid(), m5.getUid()); // 2 : [jira] [Created] (MAILBOX-234) Convert Message into JSON // 3 : [jira] [Closed] (MAILBOX-217) We should index attachment in elastic search // 4 : [jira] [Closed] (MAILBOX-11) MailboxQuery ignore namespace @@ -704,11 +723,11 @@ public abstract class AbstractMessageSearchIndexTest { @Test public void sortOnSizeShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Size))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m2, m3, m5, m4); + .containsExactly(m2.getUid(), m3.getUid(), m5.getUid(), m4.getUid()); // 2 : 3210 o // 3 : 3647 o // 4 : 4360 o @@ -718,11 +737,11 @@ public abstract class AbstractMessageSearchIndexTest { @Test public void sortOnDisplayFromShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayFrom))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m4, m3, m5, m2); + .containsExactly(m4.getUid(), m3.getUid(), m5.getUid(), m2.getUid()); // 2 : Tellier Benoit (JIRA) // 3 : efij // 4 : abcd @@ -732,11 +751,11 @@ public abstract class AbstractMessageSearchIndexTest { @Test public void sortOnDisplayToShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayTo))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m3, m2, m4, m5); + .containsExactly(m3.getUid(), m2.getUid(), m4.getUid(), m5.getUid()); // 2 : abc // 3 : aaa // 4 : server @@ -746,11 +765,11 @@ public abstract class AbstractMessageSearchIndexTest { @Test public void sortOnSentDateShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.SentDate))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m5, m4, m2, m3); + .containsExactly(m5.getUid(), m4.getUid(), m2.getUid(), m3.getUid()); // 2 : 4 Jun 2015 09:23:37 // 3 : 4 Jun 2015 09:27:37 // 4 : 2 Jun 2015 08:16:19 @@ -760,11 +779,11 @@ public abstract class AbstractMessageSearchIndexTest { @Test public void sortOnIdShouldWork() throws Exception { SearchQuery searchQuery = new SearchQuery(); - SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2, m5)}; + SearchQuery.UidRange[] numericRanges = {new SearchQuery.UidRange(m2.getUid(), m5.getUid())}; searchQuery.andCriteria(SearchQuery.uid(numericRanges)); searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Uid))); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m2, m3, m4, m5); + .containsExactly(m2.getUid(), m3.getUid(), m4.getUid(), m5.getUid()); } @Test @@ -782,7 +801,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.textContains("spam.minet.net")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m1); + .containsExactly(m1.getUid()); } @Test @@ -791,7 +810,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.textContains("listes.minet.net")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m1); + .containsExactly(m1.getUid()); } @Test @@ -800,7 +819,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.textContains("abc.org")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m3); + .containsExactly(m3.getUid()); } @Test @@ -809,7 +828,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.textContains("any.com")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m5); + .containsExactly(m5.getUid()); } @Test @@ -819,7 +838,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria(SearchQuery.textContains("reviewing work")); // text/plain contains: "We are reviewing work I did for this feature." assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m3); + .containsExactly(m3.getUid()); } @Test @@ -830,7 +849,7 @@ public abstract class AbstractMessageSearchIndexTest { // 3: text/plain contains: "We are reviewing work I did for this feature." searchQuery.andCriteria(SearchQuery.textContains("reviewing feature")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m2, m3); + .containsExactly(m2.getUid(), m3.getUid()); } @Test @@ -840,7 +859,7 @@ public abstract class AbstractMessageSearchIndexTest { // text/plain contains: "We are reviewing work I did for this feature." searchQuery.andCriteria(SearchQuery.textContains("reVieWing")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m3); + .containsExactly(m3.getUid()); } @Test @@ -850,7 +869,7 @@ public abstract class AbstractMessageSearchIndexTest { searchQuery.andCriteria(SearchQuery.textContains("a reviewing of the work")); // text/plain contains: "We are reviewing work I did for this feature." assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m3); + .containsExactly(m3.getUid()); } @Test @@ -860,7 +879,7 @@ public abstract class AbstractMessageSearchIndexTest { // text/html contains: "This is a mail with beautifull html content which contains a banana." searchQuery.andCriteria(SearchQuery.textContains("contains a banana")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m7); + .containsExactly(m7.getUid()); } @Test @@ -869,7 +888,7 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.textContains("contain banana")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m7); + .containsExactly(m7.getUid()); } @Test @@ -878,6 +897,6 @@ public abstract class AbstractMessageSearchIndexTest { SearchQuery searchQuery = new SearchQuery(); searchQuery.andCriteria(SearchQuery.textContains("beautifull banana")); assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) - .containsExactly(m7); + .containsExactly(m7.getUid()); } }
http://git-wip-us.apache.org/repos/asf/james-project/blob/299addd9/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java index bb7a48a..4a50a02 100644 --- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java +++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java @@ -105,19 +105,20 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem { userManager = new FakeAuthenticator(); InMemoryMailboxSessionMapperFactory factory = new InMemoryMailboxSessionMapperFactory(); + InMemoryMessageId.Factory messageIdFactory = new InMemoryMessageId.Factory(); ElasticSearchListeningMessageSearchIndex searchIndex = new ElasticSearchListeningMessageSearchIndex( factory, new ElasticSearchIndexer(client, new DeleteByQueryPerformer(client, Executors.newSingleThreadExecutor())), - new ElasticSearchSearcher(client, new QueryConverter(new CriterionConverter()), new InMemoryId.Factory()), + new ElasticSearchSearcher(client, new QueryConverter(new CriterionConverter()), new InMemoryId.Factory(), messageIdFactory), new MessageToElasticSearchJson(new DefaultTextExtractor(), IndexAttachments.YES)); MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); MessageParser messageParser = new MessageParser(); - mailboxManager = new StoreMailboxManager(factory, userManager, aclResolver, groupMembershipResolver, messageParser, - new InMemoryMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE); + mailboxManager = new StoreMailboxManager(factory, userManager, aclResolver, groupMembershipResolver, messageParser, + messageIdFactory, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE); mailboxManager.setMessageSearchIndex(searchIndex); try { http://git-wip-us.apache.org/repos/asf/james-project/blob/299addd9/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java index ec669fd..63bd19b 100644 --- a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java +++ b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java @@ -151,7 +151,7 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem { try { JPAId.Factory mailboxIdFactory = new Factory(); FSDirectory fsDirectory = FSDirectory.open(tempFile); - LuceneMessageSearchIndex searchIndex = new LuceneMessageSearchIndex(factory, mailboxIdFactory, fsDirectory); + LuceneMessageSearchIndex searchIndex = new LuceneMessageSearchIndex(factory, mailboxIdFactory, fsDirectory, messageIdFactory); searchIndex.setEnableSuffixMatch(true); MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); http://git-wip-us.apache.org/repos/asf/james-project/blob/299addd9/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java ---------------------------------------------------------------------- diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java index c0c68d8..f68f9dd 100644 --- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java +++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java @@ -428,7 +428,7 @@ public class MailboxEventAnalyserTest { } @Override - public Map<MailboxId, Collection<MessageUid>> search(MultimailboxesSearchQuery expression, MailboxSession session) throws MailboxException { + public List<MessageId> search(MultimailboxesSearchQuery expression, MailboxSession session, long limit) throws MailboxException { return null; } http://git-wip-us.apache.org/repos/asf/james-project/blob/299addd9/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 e025f9e..ee2593c 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 @@ -19,10 +19,7 @@ package org.apache.james.jmap.methods; -import java.util.Collection; -import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.Function; @@ -38,39 +35,25 @@ import org.apache.james.jmap.model.GetMessageListRequest; import org.apache.james.jmap.model.GetMessageListResponse; import org.apache.james.jmap.model.GetMessagesRequest; import org.apache.james.jmap.utils.FilterToSearchQuery; -import org.apache.james.jmap.utils.SortToComparatorConvertor; +import org.apache.james.jmap.utils.SortConverter; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; -import org.apache.james.mailbox.MessageManager; -import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; -import org.apache.james.mailbox.exception.MailboxNotFoundException; -import org.apache.james.mailbox.model.FetchGroupImpl; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxId.Factory; -import org.apache.james.mailbox.model.MailboxPath; -import org.apache.james.mailbox.model.MessageRange; -import org.apache.james.mailbox.model.MessageResult; import org.apache.james.mailbox.model.MultimailboxesSearchQuery; import org.apache.james.mailbox.model.SearchQuery; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.github.fge.lambdas.Throwing; import com.github.steveash.guavate.Guavate; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; public class GetMessageListMethod implements Method { public static final String MAXIMUM_LIMIT = "maximumLimit"; public static final int DEFAULT_MAXIMUM_LIMIT = 256; - private static final Logger LOGGER = LoggerFactory.getLogger(GetMailboxesMethod.class); private static final Method.Request.Name METHOD_NAME = Method.Request.name("getMessageList"); private static final Method.Response.Name RESPONSE_NAME = Method.Response.name("messageList"); @@ -103,66 +86,39 @@ public class GetMessageListMethod implements Method { public Stream<JmapResponse> process(JmapRequest request, ClientId clientId, MailboxSession mailboxSession) { Preconditions.checkArgument(request instanceof GetMessageListRequest); GetMessageListRequest messageListRequest = (GetMessageListRequest) request; - GetMessageListResponse messageListResponse = getMessageListResponse(messageListRequest, clientId, mailboxSession); + GetMessageListResponse messageListResponse = getMessageListResponse(messageListRequest, mailboxSession); Stream<JmapResponse> jmapResponse = Stream.of(JmapResponse.builder().clientId(clientId) .response(messageListResponse) .responseName(RESPONSE_NAME) .build()); - return Stream.<JmapResponse> concat(jmapResponse, + return Stream.concat(jmapResponse, processGetMessages(messageListRequest, messageListResponse, clientId, mailboxSession)); } - private GetMessageListResponse getMessageListResponse(GetMessageListRequest messageListRequest, ClientId clientId, MailboxSession mailboxSession) { + private GetMessageListResponse getMessageListResponse(GetMessageListRequest messageListRequest, MailboxSession mailboxSession) { GetMessageListResponse.Builder builder = GetMessageListResponse.builder(); try { MultimailboxesSearchQuery searchQuery = convertToSearchQuery(messageListRequest); - Map<MailboxId, Collection<MessageUid>> searchResults = mailboxManager.search(searchQuery, mailboxSession); - - aggregateResults(mailboxSession, searchResults).entries().stream() - .sorted(comparatorFor(messageListRequest)) - .map(entry -> entry.getValue().getMessageId()) + mailboxManager.search(searchQuery, + mailboxSession, + messageListRequest.getLimit().orElse(maximumLimit) + messageListRequest.getPosition()) + .stream() .skip(messageListRequest.getPosition()) - .limit(limit(messageListRequest.getLimit())) .forEach(builder::messageId); - return builder.build(); } catch (MailboxException e) { throw Throwables.propagate(e); } } - private Multimap<MailboxPath, MessageResult> aggregateResults(MailboxSession mailboxSession, Map<MailboxId, Collection<MessageUid>> searchResults) { - Multimap<MailboxPath, MessageResult> messages = LinkedHashMultimap.create(); - for (Map.Entry<MailboxId, Collection<MessageUid>> mailboxResults: searchResults.entrySet()) { - try { - aggregate(mailboxSession, messages, mailboxResults); - } catch (MailboxException e) { - LOGGER.error("Error retrieving mailbox", e); - throw Throwables.propagate(e); - } - } - return messages; - } - - private void aggregate(MailboxSession mailboxSession, Multimap<MailboxPath, MessageResult> aggregation, Map.Entry<MailboxId, Collection<MessageUid>> mailboxResults) throws MailboxNotFoundException, MailboxException { - MailboxPath mailboxPath = mailboxManager.getMailbox(mailboxResults.getKey(), mailboxSession).getMailboxPath(); - MessageManager messageManager = getMessageManager(mailboxPath, mailboxSession) - .orElseThrow(() -> new MailboxNotFoundException(mailboxPath)); - List<MessageResult> mailboxMessages = MessageRange.toRanges(mailboxResults.getValue()).stream() - .map(Throwing.function(range -> messageManager.getMessages(range, FetchGroupImpl.MINIMAL, mailboxSession))) - .map(messageIterator -> ImmutableList.copyOf(messageIterator)) - .flatMap(List::stream) - .collect(Guavate.toImmutableList()); - aggregation.putAll(mailboxPath, mailboxMessages); - } - private MultimailboxesSearchQuery convertToSearchQuery(GetMessageListRequest messageListRequest) { SearchQuery searchQuery = messageListRequest.getFilter() .map(filter -> new FilterToSearchQuery().convert(filter)) .orElse(new SearchQuery()); - Set<MailboxId> inMailboxes = buildFilterMailboxesSet(messageListRequest.getFilter(), condition -> condition.getInMailboxes()); - Set<MailboxId> notInMailboxes = buildFilterMailboxesSet(messageListRequest.getFilter(), condition -> condition.getNotInMailboxes()); + Set<MailboxId> inMailboxes = buildFilterMailboxesSet(messageListRequest.getFilter(), FilterCondition::getInMailboxes); + Set<MailboxId> notInMailboxes = buildFilterMailboxesSet(messageListRequest.getFilter(), FilterCondition::getNotInMailboxes); + searchQuery.setSorts(SortConverter.convertToSorts(messageListRequest.getSort())); return MultimailboxesSearchQuery .from(searchQuery) .inMailboxes(inMailboxes) @@ -204,21 +160,4 @@ public class GetMessageListMethod implements Method { && !messageListRequest.isFetchThreads().orElse(false); } - private long limit(Optional<Integer> limit) { - return limit.orElse(maximumLimit); - } - - private Comparator<Map.Entry<MailboxPath, MessageResult>> comparatorFor(GetMessageListRequest messageListRequest) { - return SortToComparatorConvertor.comparatorFor(messageListRequest.getSort()); - } - - private Optional<MessageManager> getMessageManager(MailboxPath mailboxPath, MailboxSession mailboxSession) { - try { - return Optional.of(mailboxManager.getMailbox(mailboxPath, mailboxSession)); - } catch (MailboxException e) { - LOGGER.warn("Error retrieveing mailbox :" + mailboxPath, e); - return Optional.empty(); - } - } - } http://git-wip-us.apache.org/repos/asf/james-project/blob/299addd9/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortToComparatorConvertor.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortToComparatorConvertor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortToComparatorConvertor.java deleted file mode 100644 index d104758..0000000 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortToComparatorConvertor.java +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.jmap.utils; - -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -import org.apache.james.mailbox.model.MailboxId; -import org.apache.james.mailbox.model.MailboxPath; -import org.apache.james.mailbox.model.MessageResult; - -import com.google.common.base.Preconditions; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableMap; - -public class SortToComparatorConvertor { - - private static final String SEPARATOR = " "; - private static final String DESC_ORDERING = "desc"; - - private SortToComparatorConvertor() { - } - - @SuppressWarnings("rawtypes") - private static final Map<String, Function<Map.Entry<MailboxPath, MessageResult>, Comparable>> fieldsMessageFunctionMap = ImmutableMap.of( - "date", entry -> entry.getValue().getInternalDate(), - "id", entry -> entry.getValue().getUid()); - - public static <M extends Map.Entry<MailboxPath, MessageResult>, Id extends MailboxId> Comparator<M> comparatorFor(List<String> sort) { - return sort.stream() - .map(SortToComparatorConvertor::<M, Id> comparatorForField) - .reduce(new EmptyComparator<>(), (x, y) -> x.thenComparing(y)); - } - - @SuppressWarnings("unchecked") - private static <M extends Map.Entry<MailboxPath, MessageResult>, Id extends MailboxId> Comparator<M> comparatorForField(String field) { - List<String> splitToList = Splitter.on(SEPARATOR).splitToList(field); - checkField(splitToList); - Comparator<M> fieldComparator = Comparator.comparing(functionForField(splitToList.get(0))); - if (splitToList.size() == 1 || splitToList.get(1).equals(DESC_ORDERING)) { - return fieldComparator.reversed(); - } - return fieldComparator; - } - - @SuppressWarnings("rawtypes") - private static Function<Map.Entry<MailboxPath, MessageResult>, Comparable> functionForField(String field) { - if (!fieldsMessageFunctionMap.containsKey(field)) { - throw new IllegalArgumentException("Unknown sorting field " + field); - } - return fieldsMessageFunctionMap.get(field); - } - - private static void checkField(List<String> splitToList) { - Preconditions.checkArgument(splitToList.size() >= 1 && splitToList.size() <= 2, "Bad sort field definition"); - } - - private static class EmptyComparator<Type> implements Comparator<Type> { - - @Override - public int compare(Type o1, Type o2) { - return 0; - } - - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/299addd9/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java index e14ad21..b2fe1d5 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java @@ -18,17 +18,14 @@ ****************************************************************/ package org.apache.james.jmap; -import java.util.Collection; import java.util.EnumSet; import java.util.List; -import java.util.Map; import java.util.Set; import org.apache.james.mailbox.MailboxListener; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageManager; -import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.BadCredentialsException; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.mock.MockMailboxSession; @@ -42,6 +39,7 @@ import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxMetaData; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MailboxQuery; +import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.model.MultimailboxesSearchQuery; import org.apache.james.user.lib.mock.InMemoryUsersRepository; @@ -248,7 +246,7 @@ public class FirstUserConnectionFilterThreadTest { } @Override - public Map<MailboxId, Collection<MessageUid>> search(MultimailboxesSearchQuery expression, MailboxSession session) throws MailboxException { + public List<MessageId> search(MultimailboxesSearchQuery expression, MailboxSession session, long limit) throws MailboxException { return null; } http://git-wip-us.apache.org/repos/asf/james-project/blob/299addd9/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortToComparatorConvertorTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortToComparatorConvertorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortToComparatorConvertorTest.java deleted file mode 100644 index e8665f3..0000000 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortToComparatorConvertorTest.java +++ /dev/null @@ -1,146 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.jmap.utils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.io.IOException; -import java.time.ZonedDateTime; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import org.apache.james.mailbox.MessageUid; -import org.apache.james.mailbox.model.MailboxPath; -import org.apache.james.mailbox.model.MessageResult; -import org.junit.Before; -import org.junit.Test; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; - -public class SortToComparatorConvertorTest { - private static final Date DATE_2017 = Date.from(ZonedDateTime.parse("2017-10-09T08:07:06+07:00[Asia/Vientiane]").toInstant()); - private static final Date DATE_2018 = Date.from(ZonedDateTime.parse("2018-10-09T08:07:06+07:00[Asia/Vientiane]").toInstant()); - - private MailboxPath mailboxPath; - private Entry firstMessage; - private Entry secondMessage; - private List<Entry> messages; - - @Before - public void setup() throws IOException { - MessageResult firstMessageResult = mock(MessageResult.class); - when(firstMessageResult.getInternalDate()).thenReturn(DATE_2017); - when(firstMessageResult.getUid()).thenReturn(MessageUid.of(1)); - firstMessage = new Entry(mailboxPath, firstMessageResult); - MessageResult secondMessageResult = mock(MessageResult.class); - when(secondMessageResult.getInternalDate()).thenReturn(DATE_2018); - when(secondMessageResult.getUid()).thenReturn(MessageUid.of(2)); - secondMessage = new Entry(mailboxPath, secondMessageResult); - messages = Lists.newArrayList(firstMessage, secondMessage); - } - - @Test - public void comparatorForShouldBeInitialOrderWhenEmptyList() { - Comparator<Entry> comparator = SortToComparatorConvertor.comparatorFor(ImmutableList.of()); - messages.sort(comparator); - assertThat(messages).containsExactly(firstMessage, secondMessage); - } - - @Test - public void comparatorForShouldBeDescByDateWhenOnlyDateInList() { - Comparator<Entry> comparator = SortToComparatorConvertor.comparatorFor(ImmutableList.of("date")); - messages.sort(comparator); - assertThat(messages).containsExactly(secondMessage, firstMessage); - } - - @Test - public void comparatorForShouldBeDescByDateWhenOnlyDateDescInList() { - Comparator<Entry> comparator = SortToComparatorConvertor.comparatorFor(ImmutableList.of("date desc")); - messages.sort(comparator); - assertThat(messages).containsExactly(secondMessage, firstMessage); - } - - @Test - public void comparatorForShouldBeAscByDateWhenOnlyDateAscInList() { - Comparator<Entry> comparator = SortToComparatorConvertor.comparatorFor(ImmutableList.of("date asc")); - messages.sort(comparator); - assertThat(messages).containsExactly(firstMessage, secondMessage); - } - - @Test - public void comparatorForShouldChainComparatorsWhenOnlyMultipleElementInList() throws IOException { - MessageResult thirdMessageResult = mock(MessageResult.class); - when(thirdMessageResult.getInternalDate()).thenReturn(DATE_2018); - when(thirdMessageResult.getUid()).thenReturn(MessageUid.of(3)); - Entry thirdMessage = new Entry(mailboxPath, thirdMessageResult); - messages.add(thirdMessage); - - Comparator<Entry> comparator = SortToComparatorConvertor.comparatorFor(ImmutableList.of("date asc", "id desc")); - messages.sort(comparator); - assertThat(messages).containsExactly(firstMessage, thirdMessage, secondMessage); - } - - @Test(expected=IllegalArgumentException.class) - public void comparatorForShouldThrowWhenBadFieldFormat() { - SortToComparatorConvertor.comparatorFor(ImmutableList.of("this is a bad field")); - } - - @Test(expected=IllegalArgumentException.class) - public void comparatorForShouldThrowWhenEmptyField() { - SortToComparatorConvertor.comparatorFor(ImmutableList.of(" ")); - } - - @Test(expected=IllegalArgumentException.class) - public void comparatorForShouldThrowWhenUnknownField() { - SortToComparatorConvertor.comparatorFor(ImmutableList.of("unknown")); - } - - private static class Entry implements Map.Entry<MailboxPath, MessageResult> { - - private MailboxPath mailboxPath; - private MessageResult messageResult; - - public Entry(MailboxPath mailboxPath, MessageResult messageResult) { - this.mailboxPath = mailboxPath; - this.messageResult = messageResult; - } - - @Override - public MailboxPath getKey() { - return mailboxPath; - } - - @Override - public MessageResult getValue() { - return messageResult; - } - - @Override - public MessageResult setValue(MessageResult messageResult) { - this.messageResult = messageResult; - return this.messageResult; - } - } -} --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org