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 ro...@apache.org on 2017/01/11 16:45:32 UTC

[05/22] james-project git commit: JAMES-1894 Introduce a Sort converter that targets Search Queries

JAMES-1894 Introduce a Sort converter that targets Search Queries


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

Branch: refs/heads/master
Commit: d42f234b945c681240951a3642a2e821f23748ab
Parents: 678f55a
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Dec 22 10:20:14 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Jan 9 21:58:32 2017 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/model/SearchQuery.java |  22 +++-
 .../elasticsearch/query/SortConverter.java      |   2 +-
 .../apache/james/jmap/utils/SortConverter.java  |  89 +++++++++++++++
 .../james/jmap/utils/SortConverterTest.java     | 114 +++++++++++++++++++
 4 files changed, 225 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d42f234b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index 46a96a3..9faae8f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -145,7 +145,12 @@ public class SearchQuery implements Serializable {
             /**
              * Uid of the message. This is the DEFAULT if no other is specified
              */
-            Uid
+            Uid,
+
+            /**
+             * Unique Id of the message.
+             */
+            Id
         }
 
         private final boolean reverse;
@@ -182,6 +187,21 @@ public class SearchQuery implements Serializable {
         public SortClause getSortClause() {
             return sortClause;
         }
+
+        @Override
+        public boolean equals(Object o) {
+            if (o instanceof Sort) {
+                Sort that = (Sort) o;
+                return Objects.equal(this.sortClause, that.sortClause)
+                    && Objects.equal(this.reverse, that.reverse);
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hashCode(sortClause, reverse);
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/d42f234b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java
index 5644239..737827e 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java
@@ -70,7 +70,7 @@ public class SortConverter {
     }
 
     private static SortOrder getOrder(SearchQuery.Sort sort) {
-        if( sort.isReverse() ) {
+        if(sort.isReverse()) {
             return SortOrder.DESC;
         } else {
             return SortOrder.ASC;

http://git-wip-us.apache.org/repos/asf/james-project/blob/d42f234b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java
new file mode 100644
index 0000000..74ad6a6
--- /dev/null
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SortConverter.java
@@ -0,0 +1,89 @@
+/****************************************************************
+ O * 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.List;
+import java.util.Map;
+
+import org.apache.james.mailbox.model.SearchQuery;
+
+import com.github.steveash.guavate.Guavate;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableMap;
+
+public class SortConverter {
+
+    private static final String SEPARATOR = " ";
+    private static final String DESC_ORDERING = "desc";
+    private static final String ASC_ORDERING = "asc";
+
+    private static final Map<String, SearchQuery.Sort.SortClause> SORT_CLAUSE_MAP = ImmutableMap.of(
+        "date", SearchQuery.Sort.SortClause.Arrival,
+        "id", SearchQuery.Sort.SortClause.Id);
+    public static final boolean REVERSE = true;
+    public static final SearchQuery.Sort DEFAULT_SORT = new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, REVERSE);
+
+
+    public static List<SearchQuery.Sort> convertToSorts(List<String> jmapSorts) {
+        Preconditions.checkNotNull(jmapSorts);
+        ImmutableList<SearchQuery.Sort> result = jmapSorts.stream()
+            .map(SortConverter::toSort)
+            .collect(Guavate.toImmutableList());
+        if (result.isEmpty()) {
+            return ImmutableList.of(DEFAULT_SORT);
+        }
+        return result;
+    }
+
+    private static SearchQuery.Sort toSort(String jmapSort) {
+        Preconditions.checkNotNull(jmapSort);
+        List<String> splitToList = Splitter.on(SEPARATOR).splitToList(jmapSort);
+        checkField(splitToList);
+        return new SearchQuery.Sort(getSortClause(splitToList.get(0)),
+            isReverse(splitToList));
+    }
+
+    private static SearchQuery.Sort.SortClause getSortClause(String field) {
+        if (! SORT_CLAUSE_MAP.containsKey(field)) {
+            throw new IllegalArgumentException("Unknown sorting field: " + field + " should be one of " + SORT_CLAUSE_MAP.keySet());
+        }
+        return SORT_CLAUSE_MAP.get(field);
+    }
+
+    private static boolean isReverse(List<String> splitList) {
+        if (splitList.size() == 1) {
+            return true;
+        }
+        String order = splitList.get(1);
+        switch (order) {
+            case DESC_ORDERING:
+                return true;
+            case ASC_ORDERING:
+                return false;
+        }
+        throw new IllegalArgumentException("Unknown sorting order: " + order + " should be one of [asc, desc]");
+    }
+
+    private static void checkField(List<String> splitToList) {
+        Preconditions.checkArgument(splitToList.size() > 0 && splitToList.size() <=2, "Bad sort field definition. Must contains a field and an optional order separated by a space");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/d42f234b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java
new file mode 100644
index 0000000..bcd48ae
--- /dev/null
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/SortConverterTest.java
@@ -0,0 +1,114 @@
+/****************************************************************
+ * 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 java.util.List;
+
+import org.apache.james.mailbox.model.SearchQuery;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
+public class SortConverterTest {
+
+    public static final boolean REVERSE = true;
+    public static final boolean NOT_REVERSE = !REVERSE;
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void convertToSortsShouldThrowOnNullValue() {
+        expectedException.expect(NullPointerException.class);
+        SortConverter.convertToSorts(null);
+    }
+
+    @Test
+    public void convertToSortsShouldReturnDefaultSortOnEmptyEntry() {
+        assertThat(SortConverter.convertToSorts(ImmutableList.of()))
+            .containsOnly(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, REVERSE));
+    }
+
+    @Test
+    public void convertToSortsShouldThrowOnNullJmapSort() {
+        List<String> jmapSorts = Lists.newArrayList((String) null);
+        expectedException.expect(NullPointerException.class);
+        SortConverter.convertToSorts(jmapSorts);
+    }
+
+    @Test
+    public void convertToSortsShouldThrowOnEmptyJmapSort() {
+        expectedException.expect(IllegalArgumentException.class);
+        SortConverter.convertToSorts(ImmutableList.of(""));
+    }
+
+    @Test
+    public void convertToSortsShouldThrowOnUnknownJmapSort() {
+        expectedException.expect(IllegalArgumentException.class);
+        SortConverter.convertToSorts(ImmutableList.of("unknown"));
+    }
+
+    @Test
+    public void convertToSortsShouldSupportDate() {
+        assertThat(SortConverter.convertToSorts(ImmutableList.of("date desc")))
+            .containsExactly(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, REVERSE));
+    }
+
+    @Test
+    public void convertToSortsShouldSupportId() {
+        assertThat(SortConverter.convertToSorts(ImmutableList.of("id desc")))
+            .containsExactly(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Id, REVERSE));
+    }
+
+    @Test
+    public void convertToSortsShouldBeDescWhenNoOrderClause() {
+        assertThat(SortConverter.convertToSorts(ImmutableList.of("date")))
+            .containsExactly(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, REVERSE));
+    }
+
+    @Test
+    public void convertToSortsShouldThrowWhenOnUnknownOrderClause() {
+        expectedException.expect(IllegalArgumentException.class);
+        SortConverter.convertToSorts(ImmutableList.of("date unknown"));
+    }
+
+    @Test
+    public void convertToSortsShouldSupportAscOrder() {
+        assertThat(SortConverter.convertToSorts(ImmutableList.of("date asc")))
+            .containsExactly(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, NOT_REVERSE));
+    }
+
+    @Test
+    public void convertToSortsShouldThrowWhenJmapSortIsTooLong() {
+        expectedException.expect(IllegalArgumentException.class);
+        SortConverter.convertToSorts(ImmutableList.of("date asc toomuch"));
+    }
+
+    @Test
+    public void convertToSortsShouldSupportMultipleSorts() {
+        assertThat(SortConverter.convertToSorts(ImmutableList.of("date asc", "id desc")))
+            .containsExactly(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, NOT_REVERSE),
+                new SearchQuery.Sort(SearchQuery.Sort.SortClause.Id, REVERSE));
+    }
+}


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