This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 2f12c348a1 JAMES-3963 Sort From To Cc on display name first (#1811)
2f12c348a1 is described below

commit 2f12c348a1c4688f9d3698e8bb268fa6e2aa038e
Author: Benoit TELLIER <[email protected]>
AuthorDate: Mon Nov 27 05:22:19 2023 +0100

    JAMES-3963 Sort From To Cc on display name first (#1811)
---
 .../mailbox/opensearch/MailboxMappingFactory.java  | 21 ++++++++--
 .../mailbox/opensearch/query/SortConverter.java    | 49 ++++++++++++++--------
 .../opensearch/search/OpenSearchSearcher.java      |  2 +-
 .../search/AbstractMessageSearchIndexTest.java     | 15 +++----
 4 files changed, 58 insertions(+), 29 deletions(-)

diff --git 
a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/MailboxMappingFactory.java
 
b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/MailboxMappingFactory.java
index 2964a8738f..9d97e9fd9e 100644
--- 
a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/MailboxMappingFactory.java
+++ 
b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/MailboxMappingFactory.java
@@ -118,7 +118,12 @@ public class MailboxMappingFactory {
                 .object(new ObjectProperty.Builder()
                     .properties(ImmutableMap.of(
                         JsonMessageConstants.EMailer.NAME, new 
Property.Builder()
-                            .text(new 
TextProperty.Builder().analyzer(KEEP_MAIL_AND_URL).build())
+                            .text(new TextProperty.Builder()
+                                .analyzer(KEEP_MAIL_AND_URL)
+                                .fields(RAW, new Property.Builder()
+                                    .keyword(new 
KeywordProperty.Builder().normalizer(CASE_INSENSITIVE).build())
+                                    .build())
+                                .build())
                             .build(),
                         JsonMessageConstants.EMailer.DOMAIN, new 
Property.Builder()
                             .text(new TextProperty.Builder()
@@ -162,7 +167,12 @@ public class MailboxMappingFactory {
                 .object(new ObjectProperty.Builder()
                     .properties(ImmutableMap.of(
                         JsonMessageConstants.EMailer.NAME, new 
Property.Builder()
-                            .text(new 
TextProperty.Builder().analyzer(KEEP_MAIL_AND_URL).build())
+                            .text(new TextProperty.Builder()
+                                .analyzer(KEEP_MAIL_AND_URL)
+                                .fields(RAW, new Property.Builder()
+                                    .keyword(new 
KeywordProperty.Builder().normalizer(CASE_INSENSITIVE).build())
+                                    .build())
+                                .build())
                             .build(),
                         JsonMessageConstants.EMailer.DOMAIN, new 
Property.Builder()
                             .text(new TextProperty.Builder()
@@ -186,7 +196,12 @@ public class MailboxMappingFactory {
                 .object(new ObjectProperty.Builder()
                     .properties(ImmutableMap.of(
                         JsonMessageConstants.EMailer.NAME, new 
Property.Builder()
-                            .text(new 
TextProperty.Builder().analyzer(KEEP_MAIL_AND_URL).build())
+                            .text(new TextProperty.Builder()
+                                .analyzer(KEEP_MAIL_AND_URL)
+                                .fields(RAW, new Property.Builder()
+                                    .keyword(new 
KeywordProperty.Builder().normalizer(CASE_INSENSITIVE).build())
+                                    .build())
+                                .build())
                             .build(),
                         JsonMessageConstants.EMailer.DOMAIN, new 
Property.Builder()
                             .text(new TextProperty.Builder()
diff --git 
a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/SortConverter.java
 
b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/SortConverter.java
index cf4bb8d91e..82822f46b1 100644
--- 
a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/SortConverter.java
+++ 
b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/SortConverter.java
@@ -19,7 +19,20 @@
 
 package org.apache.james.mailbox.opensearch.query;
 
-import org.apache.james.backends.opensearch.IndexCreationFactory;
+import static org.apache.james.backends.opensearch.IndexCreationFactory.RAW;
+import static org.apache.james.mailbox.opensearch.json.JsonMessageConstants.CC;
+import static 
org.apache.james.mailbox.opensearch.json.JsonMessageConstants.EMailer.ADDRESS;
+import static 
org.apache.james.mailbox.opensearch.json.JsonMessageConstants.EMailer.NAME;
+import static 
org.apache.james.mailbox.opensearch.json.JsonMessageConstants.FROM;
+import static 
org.apache.james.mailbox.opensearch.json.JsonMessageConstants.MESSAGE_ID;
+import static 
org.apache.james.mailbox.opensearch.json.JsonMessageConstants.SENT_DATE;
+import static 
org.apache.james.mailbox.opensearch.json.JsonMessageConstants.SIZE;
+import static 
org.apache.james.mailbox.opensearch.json.JsonMessageConstants.SUBJECT;
+import static org.apache.james.mailbox.opensearch.json.JsonMessageConstants.TO;
+import static 
org.apache.james.mailbox.opensearch.json.JsonMessageConstants.UID;
+
+import java.util.stream.Stream;
+
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.opensearch.json.JsonMessageConstants;
 import org.opensearch.client.opensearch._types.FieldSort;
@@ -30,36 +43,36 @@ public class SortConverter {
 
     private static final String PATH_SEPARATOR = ".";
 
-    public static FieldSort convertSort(SearchQuery.Sort sort) {
+    public static Stream<FieldSort> convertSort(SearchQuery.Sort sort) {
         return getSortClause(sort.getSortClause())
-            .order(getOrder(sort))
-            .mode(SortMode.Min)
-            .build();
+            .map(clause -> clause.order(getOrder(sort))
+                .mode(SortMode.Min)
+                .build());
     }
 
-    private static FieldSort.Builder getSortClause(SearchQuery.Sort.SortClause 
clause) {
+    private static Stream<FieldSort.Builder> 
getSortClause(SearchQuery.Sort.SortClause clause) {
         switch (clause) {
             case Arrival :
-                return new 
FieldSort.Builder().field(JsonMessageConstants.DATE);
+                return Stream.of(new 
FieldSort.Builder().field(JsonMessageConstants.DATE));
             case MailboxCc :
-                return new FieldSort.Builder().field(JsonMessageConstants.CC + 
PATH_SEPARATOR
-                    + JsonMessageConstants.EMailer.ADDRESS + PATH_SEPARATOR + 
IndexCreationFactory.RAW);
+                return Stream.of(new FieldSort.Builder().field(CC + 
PATH_SEPARATOR + NAME + PATH_SEPARATOR + RAW),
+                    new FieldSort.Builder().field(CC + PATH_SEPARATOR + 
ADDRESS + PATH_SEPARATOR + RAW));
             case MailboxFrom :
-                return new FieldSort.Builder().field(JsonMessageConstants.FROM 
+ PATH_SEPARATOR
-                    + JsonMessageConstants.EMailer.ADDRESS + PATH_SEPARATOR + 
IndexCreationFactory.RAW);
+                return Stream.of(new FieldSort.Builder().field(FROM + 
PATH_SEPARATOR + NAME + PATH_SEPARATOR + RAW),
+                    new FieldSort.Builder().field(CC + PATH_SEPARATOR + 
ADDRESS + PATH_SEPARATOR + RAW));
             case MailboxTo :
-                return new FieldSort.Builder().field(JsonMessageConstants.TO + 
PATH_SEPARATOR
-                    + JsonMessageConstants.EMailer.ADDRESS + PATH_SEPARATOR + 
IndexCreationFactory.RAW);
+                return Stream.of(new FieldSort.Builder().field(TO + 
PATH_SEPARATOR + NAME + PATH_SEPARATOR + RAW),
+                    new FieldSort.Builder().field(CC + PATH_SEPARATOR + 
ADDRESS + PATH_SEPARATOR + RAW));
             case BaseSubject :
-                return new 
FieldSort.Builder().field(JsonMessageConstants.SUBJECT + PATH_SEPARATOR + 
IndexCreationFactory.RAW);
+                return Stream.of(new FieldSort.Builder().field(SUBJECT + 
PATH_SEPARATOR + RAW));
             case Size :
-                return new 
FieldSort.Builder().field(JsonMessageConstants.SIZE);
+                return Stream.of(new FieldSort.Builder().field(SIZE));
             case SentDate :
-                return new 
FieldSort.Builder().field(JsonMessageConstants.SENT_DATE);
+                return Stream.of(new FieldSort.Builder().field(SENT_DATE));
             case Uid :
-                return new FieldSort.Builder().field(JsonMessageConstants.UID);
+                return Stream.of(new FieldSort.Builder().field(UID));
             case Id:
-                return new 
FieldSort.Builder().field(JsonMessageConstants.MESSAGE_ID);
+                return Stream.of(new FieldSort.Builder().field(MESSAGE_ID));
             default:
                 throw new RuntimeException("Sort is not implemented");
         }
diff --git 
a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/search/OpenSearchSearcher.java
 
b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/search/OpenSearchSearcher.java
index 7b7f4acd97..81b16e3ab3 100644
--- 
a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/search/OpenSearchSearcher.java
+++ 
b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/search/OpenSearchSearcher.java
@@ -72,7 +72,7 @@ public class OpenSearchSearcher {
     private SearchRequest prepareSearch(Collection<MailboxId> mailboxIds, 
SearchQuery query, Optional<Integer> limit, List<String> fields) {
         List<SortOptions> sorts = query.getSorts()
             .stream()
-            .map(SortConverter::convertSort)
+            .flatMap(SortConverter::convertSort)
             .map(fieldSort -> new 
SortOptions.Builder().field(fieldSort).build())
             .collect(Collectors.toList());
 
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 c997ab3633..5597f4a43e 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
@@ -1318,6 +1318,7 @@ public abstract class AbstractMessageSearchIndexTest {
         // 5 : [email protected]
     }
 
+    // TODO fix
     @Test
     protected void sortOnFromShouldWork() throws Exception {
         SearchQuery searchQuery = SearchQuery.builder()
@@ -1326,11 +1327,11 @@ public abstract class AbstractMessageSearchIndexTest {
             .build();
 
         assertThat(messageSearchIndex.search(session, mailbox, 
searchQuery).toStream())
-            .containsExactly(m3.getUid(), m2.getUid(), m4.getUid(), 
m5.getUid());
-        // m3 : [email protected]
-        // m2 : [email protected]
-        // m4 : [email protected]
-        // m5 : [email protected]
+            .containsExactly(m4.getUid(), m3.getUid(), m5.getUid(), 
m2.getUid());
+        // m4 : "abcd" <[email protected]>
+        // m3 : "efij" <[email protected]>
+        // m5 : "Eric Charles (JIRA)" <[email protected]>
+        // m2 : "Tellier Benoit (JIRA)" <[email protected]>
     }
 
     @Test
@@ -1341,11 +1342,11 @@ public abstract class AbstractMessageSearchIndexTest {
             .build();
 
         assertThat(messageSearchIndex.search(session, mailbox, 
searchQuery).toStream())
-            .containsExactly(m5.getUid(), m3.getUid(), m2.getUid(), 
m4.getUid());
-        // 5 : "zzz" <[email protected]>
+            .containsExactly(m3.getUid(), m2.getUid(), m4.getUid(), 
m5.getUid());
         // 3 : "aaa" <[email protected]>
         // 2 : "abc" <[email protected]>
         // 4 : "server" <[email protected]>
+        // 5 : "zzz" <[email protected]>
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to