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:45 UTC
[18/22] james-project git commit: JAMES-1894 Fix in-memory sorting
for SentDate
JAMES-1894 Fix in-memory sorting for SentDate
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/0ca60fb6
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/0ca60fb6
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/0ca60fb6
Branch: refs/heads/master
Commit: 0ca60fb6a38da4573f64a4574da71a529432822e
Parents: 299addd
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Dec 22 16:46:39 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Jan 9 22:01:06 2017 +0700
----------------------------------------------------------------------
.../comparator/BaseSubjectComparator.java | 17 +--
.../search/comparator/CombinedComparator.java | 116 ++++++++--------
.../comparator/HeaderDisplayComparator.java | 31 +----
.../comparator/HeaderMailboxComparator.java | 45 +------
.../comparator/InternalDateComparator.java | 14 +-
.../search/comparator/ReverseComparator.java | 18 ++-
.../search/comparator/SentDateComparator.java | 23 +---
.../store/search/comparator/SizeComparator.java | 15 +--
.../store/search/comparator/UidComparator.java | 14 +-
.../store/search/CombinedComparatorTest.java | 133 +++++++++++++++++++
10 files changed, 228 insertions(+), 198 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/BaseSubjectComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/BaseSubjectComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/BaseSubjectComparator.java
index 2a02494..ba38ce3 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/BaseSubjectComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/BaseSubjectComparator.java
@@ -25,13 +25,7 @@ import org.apache.james.mailbox.store.search.SearchUtil;
public class BaseSubjectComparator extends AbstractHeaderComparator{
-
-
- private final static Comparator<MailboxMessage> BASESUBJECT = new BaseSubjectComparator();
- private final static Comparator<MailboxMessage> REVERSE_BASESUBJECT = new ReverseComparator(BASESUBJECT);
-
-
-
+ public final static Comparator<MailboxMessage> BASESUBJECT = new BaseSubjectComparator();
private final static String SUBJECT = "subject";
@Override
@@ -41,13 +35,4 @@ public class BaseSubjectComparator extends AbstractHeaderComparator{
return baseSubject1.compareToIgnoreCase(baseSubject2);
}
-
-
- public static Comparator<MailboxMessage> baseSubject(boolean reverse){
- if (reverse) {
- return REVERSE_BASESUBJECT;
- } else {
- return BASESUBJECT;
- }
- }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java
index 002aea2..9295480 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java
@@ -18,27 +18,84 @@
****************************************************************/
package org.apache.james.mailbox.store.search.comparator;
-import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
+import org.apache.commons.lang.NotImplementedException;
import org.apache.james.mailbox.model.SearchQuery.Sort;
import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import com.google.common.base.Function;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.FluentIterable;
+
/**
* {@link Comparator} which takes a Array of other {@link Comparator}'s and use them to compare two {@link MailboxMessage} instances till one of them
* return <> 0
- *
*/
public class CombinedComparator implements Comparator<MailboxMessage>{
- private final Comparator<MailboxMessage>[] comparators;
- public CombinedComparator(Comparator<MailboxMessage>[] comparators) {
- if(comparators == null || comparators.length < 1) {
- throw new IllegalArgumentException();
+ public static CombinedComparator create(List<Sort> sorts) {
+ Preconditions.checkNotNull(sorts);
+ Preconditions.checkArgument(!sorts.isEmpty());
+ return new CombinedComparator(FluentIterable.from(sorts)
+ .transform(toComparator())
+ .toList());
+ }
+
+ private static Function<Sort, Comparator<MailboxMessage>> toComparator() {
+ return new Function<Sort, Comparator<MailboxMessage>>() {
+ @Override
+ public Comparator<MailboxMessage> apply(Sort input) {
+ return optionalResverse(toComparator(input), input.isReverse());
+ }
+ };
+ }
+
+ private static Comparator<MailboxMessage> toComparator(Sort sort) {
+ switch (sort.getSortClause()) {
+ case Arrival:
+ return InternalDateComparator.INTERNALDATE;
+ case MailboxCc:
+ return HeaderMailboxComparator.CC_COMPARATOR;
+ case MailboxFrom:
+ return HeaderMailboxComparator.FROM_COMPARATOR;
+ case Size:
+ return SizeComparator.SIZE;
+ case BaseSubject:
+ return BaseSubjectComparator.BASESUBJECT;
+ case MailboxTo:
+ return HeaderMailboxComparator.TO_COMPARATOR;
+ case Uid:
+ return UidComparator.UID;
+ case SentDate:
+ return SentDateComparator.SENTDATE;
+ case DisplayFrom:
+ return HeaderDisplayComparator.FROM_COMPARATOR;
+ case DisplayTo:
+ return HeaderDisplayComparator.TO_COMPARATOR;
+ default:
+ throw new NotImplementedException("Combined comparator does not support sort " + sort.getSortClause());
}
+ }
+
+ private static Comparator<MailboxMessage> optionalResverse(Comparator<MailboxMessage> comparator, boolean isReverse) {
+ if (isReverse) {
+ return new ReverseComparator(comparator);
+ }
+ return comparator;
+ }
+
+ private final List<Comparator<MailboxMessage>> comparators;
+
+ public List<Comparator<MailboxMessage>> getComparators() {
+ return comparators;
+ }
+
+ private CombinedComparator(List<Comparator<MailboxMessage>> comparators) {
this.comparators = comparators;
}
+
@Override
public int compare(MailboxMessage o1, MailboxMessage o2) {
int i = 0;
@@ -50,52 +107,5 @@ public class CombinedComparator implements Comparator<MailboxMessage>{
}
return i;
}
-
- @SuppressWarnings("unchecked")
- public static Comparator<MailboxMessage> create(List<Sort> sorts) {
- List<Comparator<MailboxMessage>> comps = new ArrayList<Comparator<MailboxMessage>>();
- for (Sort sort : sorts) {
- boolean reverse = sort.isReverse();
- Comparator<MailboxMessage> comparator = null;
-
- switch (sort.getSortClause()) {
- case Arrival:
- comparator = InternalDateComparator.internalDate(reverse);
- break;
- case MailboxCc:
- comparator = HeaderMailboxComparator.cc(reverse);
- break;
- case MailboxFrom:
- comparator = HeaderMailboxComparator.from(reverse);
- break;
- case Size:
- comparator = SizeComparator.size(reverse);
- break;
- case BaseSubject:
- comparator = BaseSubjectComparator.baseSubject(reverse);
- break;
- case MailboxTo:
- comparator = HeaderMailboxComparator.to(reverse);
- break;
- case Uid:
- comparator = UidComparator.uid(reverse);
- break;
- case SentDate:
- comparator = SentDateComparator.sentDate(reverse);
- case DisplayFrom:
- comparator = HeaderDisplayComparator.from(reverse);
- break;
- case DisplayTo:
- comparator = HeaderDisplayComparator.to(reverse);
- break;
- default:
- break;
- }
- if (comparator != null) {
- comps.add(comparator);
- }
- }
- return new CombinedComparator(comps.toArray(new Comparator[0]));
- }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderDisplayComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderDisplayComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderDisplayComparator.java
index 81c474a..bd1790f 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderDisplayComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderDisplayComparator.java
@@ -24,44 +24,19 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
import org.apache.james.mailbox.store.search.SearchUtil;
public class HeaderDisplayComparator extends AbstractHeaderComparator{
+ public final static Comparator<MailboxMessage> FROM_COMPARATOR = new HeaderDisplayComparator(FROM);
+ public final static Comparator<MailboxMessage> TO_COMPARATOR = new HeaderDisplayComparator(TO);
-
- private final static Comparator<MailboxMessage> FROM_COMPARATOR = new HeaderDisplayComparator(FROM);
- private final static Comparator<MailboxMessage> REVERSE_FROM_COMPARATOR = new ReverseComparator(FROM_COMPARATOR);
-
-
- private final static Comparator<MailboxMessage> TO_COMPARATOR = new HeaderDisplayComparator(TO);
- private final static Comparator<MailboxMessage> REVERSE_TO_COMPARATOR = new ReverseComparator(TO_COMPARATOR);
-
-
private final String headerName;
public HeaderDisplayComparator(String headerName) {
this.headerName = headerName;
}
-
+
@Override
public int compare(MailboxMessage o1, MailboxMessage o2) {
String display1 = SearchUtil.getDisplayAddress(getHeaderValue(headerName, o1));
String display2 = SearchUtil.getDisplayAddress(getHeaderValue(headerName, o2));
return display1.compareToIgnoreCase(display2);
}
-
-
- public static Comparator<MailboxMessage> from(boolean reverse) {
- if (reverse) {
- return REVERSE_FROM_COMPARATOR;
- } else {
- return FROM_COMPARATOR;
- }
- }
-
-
- public static Comparator<MailboxMessage> to(boolean reverse) {
- if (reverse) {
- return REVERSE_TO_COMPARATOR;
- } else {
- return TO_COMPARATOR;
- }
- }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderMailboxComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderMailboxComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderMailboxComparator.java
index 0acb052..f21befd 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderMailboxComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderMailboxComparator.java
@@ -23,26 +23,19 @@ import java.util.Comparator;
import org.apache.james.mailbox.store.mail.model.MailboxMessage;
import org.apache.james.mailbox.store.search.SearchUtil;
+import com.google.common.base.Objects;
+
public class HeaderMailboxComparator extends AbstractHeaderComparator{
+ public final static Comparator<MailboxMessage> FROM_COMPARATOR = new HeaderMailboxComparator(FROM);
+ public final static Comparator<MailboxMessage> TO_COMPARATOR = new HeaderMailboxComparator(TO);
+ public final static Comparator<MailboxMessage> CC_COMPARATOR = new HeaderMailboxComparator(CC);
private final String headerName;
- private final static Comparator<MailboxMessage> FROM_COMPARATOR = new HeaderMailboxComparator(FROM);
- private final static Comparator<MailboxMessage> REVERSE_FROM_COMPARATOR = new ReverseComparator(FROM_COMPARATOR);
-
-
- private final static Comparator<MailboxMessage> TO_COMPARATOR = new HeaderMailboxComparator(TO);
- private final static Comparator<MailboxMessage> REVERSE_TO_COMPARATOR = new ReverseComparator(TO_COMPARATOR);
-
-
- private final static Comparator<MailboxMessage> CC_COMPARATOR = new HeaderMailboxComparator(CC);
- private final static Comparator<MailboxMessage> REVERSE_CC_COMPARATOR = new ReverseComparator(CC_COMPARATOR);
-
-
public HeaderMailboxComparator(String headerName) {
this.headerName = headerName;
}
-
+
@Override
public int compare(MailboxMessage o1, MailboxMessage o2) {
String mailbox1 = SearchUtil.getMailboxAddress(getHeaderValue(headerName, o1));
@@ -50,31 +43,5 @@ public class HeaderMailboxComparator extends AbstractHeaderComparator{
return mailbox1.compareToIgnoreCase(mailbox2);
}
-
-
-
- public static Comparator<MailboxMessage> from(boolean reverse) {
- if (reverse) {
- return REVERSE_FROM_COMPARATOR;
- } else {
- return FROM_COMPARATOR;
- }
- }
-
- public static Comparator<MailboxMessage> cc(boolean reverse) {
- if (reverse) {
- return REVERSE_CC_COMPARATOR;
- } else {
- return CC_COMPARATOR;
- }
- }
-
- public static Comparator<MailboxMessage> to(boolean reverse) {
- if (reverse) {
- return REVERSE_TO_COMPARATOR;
- } else {
- return TO_COMPARATOR;
- }
- }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java
index 4f70337..51de2eb 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java
@@ -24,25 +24,13 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
/**
* {@link Comparator} which compares {@link MailboxMessage}'s with their {@link MailboxMessage#getInternalDate()} value
- *
*/
public class InternalDateComparator implements Comparator<MailboxMessage>{
+ public final static Comparator<MailboxMessage> INTERNALDATE = new InternalDateComparator();
-
- private final static Comparator<MailboxMessage> INTERNALDATE = new InternalDateComparator();
- private final static Comparator<MailboxMessage> REVERSE_INTERNALDATE = new ReverseComparator(INTERNALDATE);
-
-
@Override
public int compare(MailboxMessage o1, MailboxMessage o2) {
return (o1.getInternalDate().compareTo(o2.getInternalDate()));
}
- public static Comparator<MailboxMessage> internalDate(boolean reverse){
- if (reverse) {
- return REVERSE_INTERNALDATE;
- } else {
- return INTERNALDATE;
- }
- }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java
index 5395482..c8d17ac 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java
@@ -22,19 +22,35 @@ import java.util.Comparator;
import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import com.google.common.base.Objects;
+
/**
* {@link Comparator} which wraps an other {@link Comparator} and reverse it
- *
*/
public class ReverseComparator implements Comparator<MailboxMessage>{
private final Comparator<MailboxMessage> comparator;
+
public ReverseComparator(Comparator<MailboxMessage> comparator) {
this.comparator = comparator;
}
+
@Override
public int compare(MailboxMessage o1, MailboxMessage o2) {
return comparator.compare(o2, o1);
}
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ReverseComparator) {
+ ReverseComparator that = (ReverseComparator) o;
+ return Objects.equal(this.comparator, that.comparator);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(comparator);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java
index 1c4e759..8a1373e 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java
@@ -32,18 +32,8 @@ import org.apache.james.mime4j.field.datetime.parser.ParseException;
*
*/
public class SentDateComparator extends AbstractHeaderComparator {
+ public final static Comparator<MailboxMessage> SENTDATE = new SentDateComparator();
-
-
- private final static Comparator<MailboxMessage> SENTDATE = new SentDateComparator(false);
- private final static Comparator<MailboxMessage> REVERSE_SENTDATE = new ReverseComparator(new SentDateComparator(true));
-
- private final boolean reverse;
-
- public SentDateComparator(boolean reverse) {
- this.reverse = reverse;
- }
-
@Override
public int compare(MailboxMessage o1, MailboxMessage o2) {
Date date1 = getSentDate(o1);
@@ -52,7 +42,7 @@ public class SentDateComparator extends AbstractHeaderComparator {
// sent date was the same so use the uid as tie-breaker
if (i == 0) {
- return UidComparator.uid(reverse).compare(o1, o2);
+ return UidComparator.UID.compare(o1, o2);
}
return 0;
}
@@ -68,13 +58,4 @@ public class SentDateComparator extends AbstractHeaderComparator {
return message.getInternalDate();
}
}
-
- public static Comparator<MailboxMessage> sentDate(boolean reverse){
- if (reverse) {
- return REVERSE_SENTDATE;
- } else {
- return SENTDATE;
- }
- }
-
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SizeComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SizeComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SizeComparator.java
index 959383b..2717226 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SizeComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SizeComparator.java
@@ -24,25 +24,12 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
/**
* {@link Comparator} which compares {@link MailboxMessage}'s with their {@link MailboxMessage#getFullContentOctets()} value
- *
*/
public class SizeComparator implements Comparator<MailboxMessage>{
+ public final static Comparator<MailboxMessage> SIZE = new SizeComparator();
-
- private final static Comparator<MailboxMessage> SIZE = new SizeComparator();
- private final static Comparator<MailboxMessage> REVERSE_SIZE = new ReverseComparator(SIZE);
-
-
@Override
public int compare(MailboxMessage o1, MailboxMessage o2) {
return (int) (o1.getFullContentOctets() - o2.getFullContentOctets());
}
-
- public static Comparator<MailboxMessage> size(boolean reverse) {
- if (reverse) {
- return REVERSE_SIZE;
- } else {
- return SIZE;
- }
- }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java
index a7a2952..2fa187f 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java
@@ -24,25 +24,13 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
/**
* {@link Comparator} which compares {@link MailboxMessage}'s with their {@link MailboxMessage#getUid()} value
- *
*/
public class UidComparator implements Comparator<MailboxMessage>{
+ public final static Comparator<MailboxMessage> UID = new UidComparator();
-
- private final static Comparator<MailboxMessage> UID = new UidComparator();
- private final static Comparator<MailboxMessage> REVERSE_UID = new ReverseComparator(UID);
-
-
@Override
public int compare(MailboxMessage o1, MailboxMessage o2) {
return o1.getUid().compareTo(o2.getUid());
}
- public static Comparator<MailboxMessage> uid(boolean reverse){
- if (reverse) {
- return REVERSE_UID;
- } else {
- return UID;
- }
- }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0ca60fb6/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java
new file mode 100644
index 0000000..be69207
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java
@@ -0,0 +1,133 @@
+/****************************************************************
+ * 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.mailbox.store.search;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.store.search.comparator.BaseSubjectComparator;
+import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
+import org.apache.james.mailbox.store.search.comparator.HeaderDisplayComparator;
+import org.apache.james.mailbox.store.search.comparator.HeaderMailboxComparator;
+import org.apache.james.mailbox.store.search.comparator.InternalDateComparator;
+import org.apache.james.mailbox.store.search.comparator.ReverseComparator;
+import org.apache.james.mailbox.store.search.comparator.SentDateComparator;
+import org.apache.james.mailbox.store.search.comparator.SizeComparator;
+import org.apache.james.mailbox.store.search.comparator.UidComparator;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import com.google.common.collect.ImmutableList;
+
+public class CombinedComparatorTest {
+
+ public static final boolean REVERSE = true;
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
+ @Test
+ public void createShouldThrowOnNullListOfSort() {
+ expectedException.expect(NullPointerException.class);
+
+ CombinedComparator.create(null);
+ }
+
+ @Test
+ public void createShouldThrowOnEmptySort() {
+ expectedException.expect(IllegalArgumentException.class);
+
+ CombinedComparator.create(ImmutableList.<SearchQuery.Sort>of());
+ }
+
+ @Test
+ public void createShouldConvertInternalDate() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival))).getComparators())
+ .containsOnly(InternalDateComparator.INTERNALDATE);
+ }
+
+ @Test
+ public void createShouldConvertCc() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxCc))).getComparators())
+ .containsOnly(HeaderMailboxComparator.CC_COMPARATOR);
+ }
+
+ @Test
+ public void createShouldConvertFrom() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxFrom))).getComparators())
+ .containsOnly(HeaderMailboxComparator.FROM_COMPARATOR);
+ }
+
+ @Test
+ public void createShouldConvertTo() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxTo))).getComparators())
+ .containsOnly(HeaderMailboxComparator.TO_COMPARATOR);
+ }
+
+ @Test
+ public void createShouldConvertSize() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Size))).getComparators())
+ .containsOnly(SizeComparator.SIZE);
+ }
+
+ @Test
+ public void createShouldConvertBaseSubject() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.BaseSubject))).getComparators())
+ .containsOnly(BaseSubjectComparator.BASESUBJECT);
+ }
+
+ @Test
+ public void createShouldConvertUid() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Uid))).getComparators())
+ .containsOnly(UidComparator.UID);
+ }
+
+ @Test
+ public void createShouldConvertSentDate() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.SentDate))).getComparators())
+ .containsOnly(SentDateComparator.SENTDATE);
+ }
+
+ @Test
+ public void createShouldConvertDisplayTo() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayTo))).getComparators())
+ .containsOnly(HeaderDisplayComparator.TO_COMPARATOR);
+ }
+
+ @Test
+ public void createShouldConvertDisplayFrom() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayFrom))).getComparators())
+ .containsOnly(HeaderDisplayComparator.FROM_COMPARATOR);
+ }
+
+ @Test
+ public void createShouldThrowOnIdConversion() {
+ expectedException.expect(NotImplementedException.class);
+
+ CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Id)));
+ }
+
+ @Test
+ public void createShouldReverse() {
+ assertThat(CombinedComparator.create(ImmutableList.of(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayFrom, REVERSE))).getComparators())
+ .containsOnly(new ReverseComparator(HeaderDisplayComparator.FROM_COMPARATOR));
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org