You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by GitBox <gi...@apache.org> on 2021/07/15 10:50:47 UTC

[GitHub] [james-project] quantranhong1999 commented on a change in pull request #539: JAMES-3516 Enable threadId search query for MessageSearchIndex

quantranhong1999 commented on a change in pull request #539:
URL: https://github.com/apache/james-project/pull/539#discussion_r670352787



##########
File path: mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
##########
@@ -1512,4 +1549,101 @@ void searchShouldRetrieveMailByAttachmentFileName() throws Exception {
         assertThat(messageSearchIndex.search(session, mailbox, searchQuery).toStream())
             .containsOnly(mWithFileName.getUid());
     }
+
+    @Test
+    void givenThreeMailsInAThreadThenGetThreadShouldReturnAListWithThreeMessageIdsInThatThread() throws MailboxException {
+        MailboxMessage message1 = createMessage(quanMailbox, ThreadId.fromBaseMessageId(newBasedMessageId));
+        MailboxMessage message2 = createMessage(quanMailbox, ThreadId.fromBaseMessageId(newBasedMessageId));
+        MailboxMessage message3 = createMessage(quanMailbox, ThreadId.fromBaseMessageId(newBasedMessageId));
+
+        appendMessageThenDispatchAddedEvent(quanMailbox, message1);
+        appendMessageThenDispatchAddedEvent(quanMailbox, message2);
+        appendMessageThenDispatchAddedEvent(quanMailbox, message3);
+
+        awaitMessageCount(ImmutableList.of(), SearchQuery.matchAll(), 16);
+
+        SearchQuery searchQuery = SearchQuery.of(SearchQuery.threadId(ThreadId.fromBaseMessageId(newBasedMessageId)));
+        List<MessageId> actual = messageSearchIndex.search(quanSession, ImmutableList.of(quanMailbox.getMailboxId()), searchQuery, LIMIT)
+            .collectList().block();
+
+        assertThat(actual).isEqualTo(ImmutableList.of(message1.getMessageId(), message2.getMessageId(), message3.getMessageId()));
+    }
+
+    @Test
+    void givenAMailInAThreadThenGetThreadShouldReturnAListWithOnlyOneMessageIdInThatThread() throws MailboxException {
+        MailboxMessage message1 = createMessage(quanMailbox, ThreadId.fromBaseMessageId(newBasedMessageId));
+
+        appendMessageThenDispatchAddedEvent(quanMailbox, message1);
+
+        awaitMessageCount(ImmutableList.of(), SearchQuery.matchAll(), 14);
+
+        SearchQuery searchQuery = SearchQuery.of(SearchQuery.threadId(ThreadId.fromBaseMessageId(newBasedMessageId)));
+        List<MessageId> actual = messageSearchIndex.search(quanSession, ImmutableList.of(quanMailbox.getMailboxId()), searchQuery, LIMIT)
+            .collectList().block();
+
+        assertThat(actual).containsOnly(message1.getMessageId());
+    }
+
+    @Test
+    void givenTwoDistinctThreadsThenGetThreadShouldNotReturnUnrelatedMails() throws MailboxException {
+        // given message1 and message2 in thread1, message3 in thread2
+        ThreadId threadId1 = ThreadId.fromBaseMessageId(newBasedMessageId);
+        ThreadId threadId2 = ThreadId.fromBaseMessageId(otherBasedMessageId);
+        MailboxMessage message1 = createMessage(quanMailbox, threadId1);
+        MailboxMessage message2 = createMessage(quanMailbox, threadId1);
+        MailboxMessage message3 = createMessage(quanMailbox, threadId2);
+
+        appendMessageThenDispatchAddedEvent(quanMailbox, message1);
+        appendMessageThenDispatchAddedEvent(quanMailbox, message2);
+        appendMessageThenDispatchAddedEvent(quanMailbox, message3);
+
+        awaitMessageCount(ImmutableList.of(), SearchQuery.matchAll(), 16);
+
+        // then get thread2 should not return unrelated message1 and message2
+        SearchQuery searchQuery = SearchQuery.of(SearchQuery.threadId(threadId2));
+        List<MessageId> actual = messageSearchIndex.search(quanSession, ImmutableList.of(quanMailbox.getMailboxId()), searchQuery, LIMIT)
+            .collectList().block();
+
+        assertThat(actual).doesNotContain(message1.getMessageId(), message2.getMessageId());
+    }
+
+    @Test
+    void givenNonThreadThenGetThreadShouldReturnEmptyListMessageId() throws MailboxException {
+        // given non messages in thread1
+        ThreadId threadId1 = ThreadId.fromBaseMessageId(newBasedMessageId);
+
+        // then get thread1 should return empty list messageId
+        SearchQuery searchQuery = SearchQuery.of(SearchQuery.threadId(threadId1));
+        List<MessageId> actual = messageSearchIndex.search(quanSession, ImmutableList.of(quanMailbox.getMailboxId()), searchQuery, LIMIT)
+            .collectList().block();
+
+        assertThat(actual).isEmpty();
+    }
+
+    private void appendMessageThenDispatchAddedEvent(Mailbox mailbox, MailboxMessage mailboxMessage) throws MailboxException {

Review comment:
       I know that. But how we solve that is an issue now.
   Once we satisfy with the scanning threadId guessing algorithm then we can apply that to CassandraModule, JPA module, InmemoryModule by moving ThreadIdGuessingAlgorithm APIs to MailboxManager. That's will solve the constructor loop.
   
   Is this scanning with ElasticSearch good enough for production? Until then we maybe can move on.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



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