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]