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

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

commit dd266ce4c79508269810b015dd51fb1c2eaa604a
Author: RĂ©mi Kowalski <[email protected]>
AuthorDate: Thu Jul 18 15:34:04 2019 +0200

    JAMES-2813 add Operator and expected value in criterion ValueMatcher
---
 .../apache/james/vault/dto/query/CriterionDTO.java |  3 +-
 .../james/vault/dto/query/QueryTranslator.java     | 49 +++++++---------------
 .../org/apache/james/vault/search/Criterion.java   | 31 +++++++++++---
 .../james/vault/search/CriterionFactory.java       | 26 +++++++-----
 .../vault/search/{Criterion.java => Operator.java} | 45 ++++++--------------
 .../dto/query/QueryElementDeserializerTest.java    |  2 +-
 .../dto/query/QueryElementSerializerTest.java      |  2 +-
 .../james/vault/dto/query/QueryTranslatorTest.java |  2 +-
 8 files changed, 75 insertions(+), 85 deletions(-)

diff --git 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java
 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java
index 374d1ef..0497e27 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java
@@ -22,6 +22,7 @@ package org.apache.james.vault.dto.query;
 import java.util.Objects;
 
 import org.apache.james.vault.search.FieldName;
+import org.apache.james.vault.search.Operator;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -33,7 +34,7 @@ import com.google.common.base.MoreObjects;
 public class CriterionDTO implements QueryElement {
 
     @VisibleForTesting
-    static CriterionDTO from(FieldName fieldName, QueryTranslator.Operator 
operator, String value) {
+    static CriterionDTO from(FieldName fieldName, Operator operator, String 
value) {
         return new CriterionDTO(fieldName.getValue(), operator.getValue(), 
value);
     }
 
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java
 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java
index e51dc83..2bd22fc 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java
@@ -24,12 +24,12 @@ import static 
org.apache.james.vault.dto.query.QueryTranslator.FieldValueParser.
 import static 
org.apache.james.vault.dto.query.QueryTranslator.FieldValueParser.MAIL_ADDRESS_PARSER;
 import static 
org.apache.james.vault.dto.query.QueryTranslator.FieldValueParser.STRING_PARSER;
 import static 
org.apache.james.vault.dto.query.QueryTranslator.FieldValueParser.ZONED_DATE_TIME_PARSER;
-import static 
org.apache.james.vault.dto.query.QueryTranslator.Operator.AFTER_OR_EQUALS;
-import static 
org.apache.james.vault.dto.query.QueryTranslator.Operator.BEFORE_OR_EQUALS;
-import static 
org.apache.james.vault.dto.query.QueryTranslator.Operator.CONTAINS;
-import static 
org.apache.james.vault.dto.query.QueryTranslator.Operator.CONTAINS_IGNORE_CASE;
-import static org.apache.james.vault.dto.query.QueryTranslator.Operator.EQUALS;
-import static 
org.apache.james.vault.dto.query.QueryTranslator.Operator.EQUALS_IGNORE_CASE;
+import static org.apache.james.vault.search.Operator.AFTER_OR_EQUALS;
+import static org.apache.james.vault.search.Operator.BEFORE_OR_EQUALS;
+import static org.apache.james.vault.search.Operator.CONTAINS;
+import static org.apache.james.vault.search.Operator.CONTAINS_IGNORE_CASE;
+import static org.apache.james.vault.search.Operator.EQUALS;
+import static org.apache.james.vault.search.Operator.EQUALS_IGNORE_CASE;
 
 import java.time.ZonedDateTime;
 import java.util.Objects;
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.vault.search.Criterion;
 import org.apache.james.vault.search.CriterionFactory;
 import org.apache.james.vault.search.FieldName;
+import org.apache.james.vault.search.Operator;
 import org.apache.james.vault.search.Query;
 
 import com.github.fge.lambdas.Throwing;
@@ -68,6 +69,13 @@ public class QueryTranslator {
             .orElseThrow(() -> new 
QueryTranslator.QueryTranslatorException("fieldName: '" + fieldNameString + "' 
is not supported"));
     }
 
+    static Operator getOperator(String operator) throws 
QueryTranslatorException {
+        return Stream.of(Operator.values())
+            .filter(operatorString -> 
operatorString.getValue().equals(operator))
+            .findFirst()
+            .orElseThrow(() -> new QueryTranslatorException("operator: '" + 
operator + "' is not supported"));
+    }
+
     enum Combinator {
         AND("and");
 
@@ -83,33 +91,6 @@ public class QueryTranslator {
     }
 
 
-
-    enum Operator {
-        EQUALS("equals"),
-        EQUALS_IGNORE_CASE("equalsIgnoreCase"),
-        CONTAINS("contains"),
-        CONTAINS_IGNORE_CASE("containsIgnoreCase"),
-        BEFORE_OR_EQUALS("beforeOrEquals"),
-        AFTER_OR_EQUALS("afterOrEquals");
-
-        static Operator getOperator(String operator) throws 
QueryTranslatorException {
-            return Stream.of(values())
-                .filter(operatorString -> 
operatorString.value.equals(operator))
-                .findFirst()
-                .orElseThrow(() -> new QueryTranslatorException("operator: '" 
+ operator + "' is not supported"));
-        }
-
-        private final String value;
-
-        Operator(String value) {
-            this.value = value;
-        }
-
-        public String getValue() {
-            return value;
-        }
-    }
-
     interface FieldValueParser<T> {
 
         class MailboxIdValueParser implements FieldValueParser<MailboxId> {
@@ -182,7 +163,7 @@ public class QueryTranslator {
     private Function<String, Criterion<?>> getCriterionParser(CriterionDTO 
dto) {
         return criterionRegistry.get(
             getField(dto.getFieldName()),
-            Operator.getOperator(dto.getOperator()));
+            getOperator(dto.getOperator()));
     }
 
     public Query translate(QueryElement queryElement) throws 
QueryTranslatorException {
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java
 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java
index 0e18380..770c596 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java
@@ -25,12 +25,33 @@ import org.apache.james.vault.DeletedMessage;
 
 public class Criterion<T> {
 
-    public interface ValueMatcher<T> {
-        boolean matches(T referenceValue);
+    public static class ValueMatcher<V, T> {
+
+        private V expectedValue;
+        private Operator operator;
+        private Predicate<T> matchPredicate;
+
+        public ValueMatcher(V expectedValue, Operator operator, Predicate<T> 
matchPredicate) {
+            this.expectedValue = expectedValue;
+            this.operator = operator;
+            this.matchPredicate = matchPredicate;
+        }
+
+        public V expectedValue() {
+            return expectedValue;
+        }
+
+        public Operator operator() {
+            return operator;
+        }
+
+        public boolean matches(T value) {
+            return matchPredicate.test(value);
+        }
     }
 
     public interface ExpectMatcher<T> {
-        Criterion<T> withMatcher(ValueMatcher<T> valueMatcher);
+        Criterion<T> withMatcher(ValueMatcher<?, T> valueMatcher);
     }
 
     public interface Builder {
@@ -42,9 +63,9 @@ public class Criterion<T> {
     private static final boolean DEFAULT_TO_NON_MATCHED_IF_NON_EXIST = false;
 
     private final DeletedMessageField<T> field;
-    private final ValueMatcher<T> valueMatcher;
+    private final ValueMatcher<?, T> valueMatcher;
 
-    private Criterion(DeletedMessageField<T> field, ValueMatcher<T> 
valueMatcher) {
+    private Criterion(DeletedMessageField<T> field, ValueMatcher<?, T> 
valueMatcher) {
         this.field = field;
         this.valueMatcher = valueMatcher;
     }
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java
 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java
index ed2b0a4..aa0a330 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java
@@ -26,6 +26,12 @@ import static 
org.apache.james.vault.search.DeletedMessageField.ORIGIN_MAILBOXES
 import static org.apache.james.vault.search.DeletedMessageField.RECIPIENTS;
 import static org.apache.james.vault.search.DeletedMessageField.SENDER;
 import static org.apache.james.vault.search.DeletedMessageField.SUBJECT;
+import static org.apache.james.vault.search.Operator.AFTER_OR_EQUALS;
+import static org.apache.james.vault.search.Operator.BEFORE_OR_EQUALS;
+import static org.apache.james.vault.search.Operator.CONTAINS;
+import static org.apache.james.vault.search.Operator.CONTAINS_IGNORE_CASE;
+import static org.apache.james.vault.search.Operator.EQUALS;
+import static org.apache.james.vault.search.Operator.EQUALS_IGNORE_CASE;
 
 import java.time.ZonedDateTime;
 import java.util.Collection;
@@ -45,19 +51,19 @@ public interface CriterionFactory {
         }
 
         public Criterion<String> contains(String subString) {
-            return builder.withMatcher(value -> value.contains(subString));
+            return builder.withMatcher(new Criterion.ValueMatcher<>(subString, 
CONTAINS, value -> value.contains(subString)));
         }
 
         public Criterion<String> containsIgnoreCase(String subString) {
-            return builder.withMatcher(value -> 
value.toLowerCase(Locale.US).contains(subString.toLowerCase(Locale.US)));
+            return builder.withMatcher(new Criterion.ValueMatcher<>(subString, 
CONTAINS_IGNORE_CASE, value -> 
value.toLowerCase(Locale.US).contains(subString.toLowerCase(Locale.US))));
         }
 
         public Criterion<String> equals(String expectedString) {
-            return builder.withMatcher(expectedString::equals);
+            return builder.withMatcher(new 
Criterion.ValueMatcher<>(expectedString, EQUALS, expectedString::equals));
         }
 
         public Criterion<String> equalsIgnoreCase(String expectedString) {
-            return builder.withMatcher(expectedString::equalsIgnoreCase);
+            return builder.withMatcher(new 
Criterion.ValueMatcher<>(expectedString, EQUALS_IGNORE_CASE, 
expectedString::equalsIgnoreCase));
         }
     }
 
@@ -70,11 +76,11 @@ public interface CriterionFactory {
         }
 
         public Criterion<ZonedDateTime> beforeOrEquals(ZonedDateTime 
expectedValue) {
-            return builder.withMatcher(actualValue -> 
!expectedValue.isBefore(actualValue));
+            return builder.withMatcher(new 
Criterion.ValueMatcher<>(expectedValue, BEFORE_OR_EQUALS, value -> 
!expectedValue.isBefore(value)));
         }
 
         public Criterion<ZonedDateTime> afterOrEquals(ZonedDateTime 
expectedValue) {
-            return builder.withMatcher(actualValue -> 
!expectedValue.isAfter(actualValue));
+            return builder.withMatcher(new 
Criterion.ValueMatcher<>(expectedValue, AFTER_OR_EQUALS, value -> 
!expectedValue.isAfter(value)));
         }
     }
 
@@ -88,12 +94,12 @@ public interface CriterionFactory {
 
     static Criterion<Collection<MailAddress>> containsRecipient(MailAddress 
recipient) {
         return Criterion.Builder.forField(RECIPIENTS)
-            .withMatcher(actualValue -> actualValue.contains(recipient));
+            .withMatcher(new Criterion.ValueMatcher<>(recipient, CONTAINS, 
value -> value.contains(recipient)));
     }
 
     static Criterion<MailAddress> hasSender(MailAddress sender) {
         return Criterion.Builder.forField(SENDER)
-            .withMatcher(sender::equals);
+            .withMatcher(new Criterion.ValueMatcher<>(sender, EQUALS, 
sender::equals));
     }
 
     static Criterion<Boolean> hasAttachment() {
@@ -106,7 +112,7 @@ public interface CriterionFactory {
 
     static Criterion<Boolean> hasAttachment(boolean hasAttachment) {
         return Criterion.Builder.forField(HAS_ATTACHMENT)
-            .withMatcher(actualValue -> hasAttachment == actualValue);
+            .withMatcher(new Criterion.ValueMatcher<>(hasAttachment, EQUALS, 
value -> hasAttachment == value));
     }
 
     static StringCriterionFactory subject() {
@@ -115,6 +121,6 @@ public interface CriterionFactory {
 
     static Criterion<Collection<MailboxId>> containsOriginMailbox(MailboxId 
mailboxId) {
         return Criterion.Builder.forField(ORIGIN_MAILBOXES)
-            .withMatcher(actualValue -> actualValue.contains(mailboxId));
+            .withMatcher(new Criterion.ValueMatcher<>(mailboxId, CONTAINS, 
value -> value.contains(mailboxId)));
     }
 }
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java
 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Operator.java
similarity index 54%
copy from 
mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java
copy to 
mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Operator.java
index 0e18380..3689b0f 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Operator.java
@@ -16,42 +16,23 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-
 package org.apache.james.vault.search;
 
-import java.util.function.Predicate;
-
-import org.apache.james.vault.DeletedMessage;
-
-public class Criterion<T> {
-
-    public interface ValueMatcher<T> {
-        boolean matches(T referenceValue);
-    }
-
-    public interface ExpectMatcher<T> {
-        Criterion<T> withMatcher(ValueMatcher<T> valueMatcher);
-    }
-
-    public interface Builder {
-        static <U> ExpectMatcher<U> forField(DeletedMessageField<U> field) {
-            return matcher -> new Criterion<>(field, matcher);
-        }
-    }
-
-    private static final boolean DEFAULT_TO_NON_MATCHED_IF_NON_EXIST = false;
+public enum Operator {
+    EQUALS("equals"),
+    EQUALS_IGNORE_CASE("equalsIgnoreCase"),
+    CONTAINS("contains"),
+    CONTAINS_IGNORE_CASE("containsIgnoreCase"),
+    BEFORE_OR_EQUALS("beforeOrEquals"),
+    AFTER_OR_EQUALS("afterOrEquals");
 
-    private final DeletedMessageField<T> field;
-    private final ValueMatcher<T> valueMatcher;
+    private final String value;
 
-    private Criterion(DeletedMessageField<T> field, ValueMatcher<T> 
valueMatcher) {
-        this.field = field;
-        this.valueMatcher = valueMatcher;
+    Operator(String value) {
+        this.value = value;
     }
 
-    Predicate<DeletedMessage> toPredicate() {
-        return deletedMessage -> field.valueExtractor().extract(deletedMessage)
-            .map(valueMatcher::matches)
-            .orElse(DEFAULT_TO_NON_MATCHED_IF_NON_EXIST);
+    public String getValue() {
+        return value;
     }
-}
+}
\ No newline at end of file
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java
index 1187003..d2b0932 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java
@@ -23,8 +23,8 @@ import static 
org.apache.james.vault.DeletedMessageFixture.SUBJECT;
 import static org.apache.mailet.base.MailAddressFixture.SENDER;
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.vault.dto.query.QueryTranslator.Operator;
 import org.apache.james.vault.search.FieldName;
+import org.apache.james.vault.search.Operator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java
index 730034c..105de89 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java
@@ -22,8 +22,8 @@ package org.apache.james.vault.dto.query;
 import static org.apache.james.vault.DeletedMessageFixture.SUBJECT;
 import static org.apache.mailet.base.MailAddressFixture.SENDER;
 
-import org.apache.james.vault.dto.query.QueryTranslator.Operator;
 import org.apache.james.vault.search.FieldName;
+import org.apache.james.vault.search.Operator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java
index 75fa081..37986f7 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java
@@ -23,8 +23,8 @@ import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.mailbox.inmemory.InMemoryId;
-import org.apache.james.vault.dto.query.QueryTranslator.Operator;
 import org.apache.james.vault.search.FieldName;
+import org.apache.james.vault.search.Operator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 


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

Reply via email to