You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by dr...@apache.org on 2017/02/13 12:46:44 UTC

incubator-unomi git commit: UNOMI-77 : Add inContains Comparison Operator

Repository: incubator-unomi
Updated Branches:
  refs/heads/master 12113c8b9 -> 121fbc8af


UNOMI-77 : Add inContains Comparison Operator


Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/121fbc8a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/121fbc8a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/121fbc8a

Branch: refs/heads/master
Commit: 121fbc8af6b0f562487f3808baf5f53d07a6a354
Parents: 12113c8
Author: Abdelkader Midani <am...@jahia.com>
Authored: Thu Feb 2 17:18:18 2017 +0100
Committer: Abdelkader Midani <am...@jahia.com>
Committed: Thu Feb 2 17:18:18 2017 +0100

----------------------------------------------------------------------
 .../PropertyConditionESQueryBuilder.java        | 19 +++++---
 .../conditions/PropertyConditionEvaluator.java  | 48 ++++++++++++--------
 2 files changed, 42 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/121fbc8a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java
----------------------------------------------------------------------
diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java
index 484c5ca..e83bad2 100644
--- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java
+++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java
@@ -40,7 +40,7 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder
         String comparisonOperator = (String) condition.getParameter("comparisonOperator");
         String name = (String) condition.getParameter("propertyName");
 
-        if(comparisonOperator == null || name == null){
+        if (comparisonOperator == null || name == null) {
             throw new IllegalArgumentException("Impossible to build ES filter, condition is not valid, comparisonOperator and propertyName properties should be provided");
         }
 
@@ -54,9 +54,9 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder
         List<?> expectedValuesDate = (List<?>) condition.getParameter("propertyValuesDate");
         List<?> expectedValuesDateExpr = (List<?>) condition.getParameter("propertyValuesDateExpr");
 
-        Object value = ObjectUtils.firstNonNull(expectedValue,expectedValueInteger,expectedValueDate,expectedValueDateExpr);
+        Object value = ObjectUtils.firstNonNull(expectedValue, expectedValueInteger, expectedValueDate, expectedValueDateExpr);
         @SuppressWarnings("unchecked")
-        List<?> values = ObjectUtils.firstNonNull(expectedValues,expectedValuesInteger,expectedValuesDate,expectedValuesDateExpr);
+        List<?> values = ObjectUtils.firstNonNull(expectedValues, expectedValuesInteger, expectedValuesDate, expectedValuesDateExpr);
 
         switch (comparisonOperator) {
             case "equals":
@@ -109,6 +109,13 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder
                     boolQueryBuilder.must(QueryBuilders.termQuery(name, curValue));
                 }
                 return boolQueryBuilder;
+            case "inContains":
+                checkRequiredValue(values, name, comparisonOperator, true);
+                BoolQueryBuilder boolQueryBuilderInContains = QueryBuilders.boolQuery();
+                for (Object curValue : values) {
+                    boolQueryBuilderInContains.must(QueryBuilders.regexpQuery(name, ".*" + curValue + ".*"));
+                }
+                return boolQueryBuilderInContains;
             case "hasSomeOf":
                 checkRequiredValue(values, name, comparisonOperator, true);
                 boolQueryBuilder = QueryBuilders.boolQuery();
@@ -134,18 +141,18 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder
     }
 
     private void checkRequiredValuesSize(List<?> values, String name, String operator, int expectedSize) {
-        if(values == null || values.size() != expectedSize) {
+        if (values == null || values.size() != expectedSize) {
             throw new IllegalArgumentException("Impossible to build ES filter, missing " + expectedSize + " values for a condition using comparisonOperator: " + operator + ", and propertyName: " + name);
         }
     }
 
     private void checkRequiredValue(Object value, String name, String operator, boolean multiple) {
-        if(value == null) {
+        if (value == null) {
             throw new IllegalArgumentException("Impossible to build ES filter, missing value" + (multiple ? "s" : "") + " for condition using comparisonOperator: " + operator + ", and propertyName: " + name);
         }
     }
 
-    private QueryBuilder getIsSameDayRange (Object value, String name) {
+    private QueryBuilder getIsSameDayRange(Object value, String name) {
         DateTime date = new DateTime(value);
         DateTime dayStart = date.withTimeAtStartOfDay();
         DateTime dayAfterStart = date.plusDays(1).withTimeAtStartOfDay();

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/121fbc8a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java
----------------------------------------------------------------------
diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java
index 68e58a6..1de3ae0 100644
--- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java
+++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java
@@ -51,10 +51,10 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
     private static final Logger logger = LoggerFactory.getLogger(PropertyConditionEvaluator.class.getName());
 
     private static final SimpleDateFormat yearMonthDayDateFormat = new SimpleDateFormat("yyyyMMdd");
-    
+
     private BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();
-    
-    private Map<String, Map<String, ExpressionAccessor>> expressionCache = new HashMap<>(64); 
+
+    private Map<String, Map<String, ExpressionAccessor>> expressionCache = new HashMap<>(64);
 
     private int compare(Object actualValue, String expectedValue, Object expectedValueDate, Object expectedValueInteger, Object expectedValueDateExpr) {
         if (expectedValue == null && expectedValueDate == null && expectedValueInteger == null && getDate(expectedValueDateExpr) == null) {
@@ -82,11 +82,11 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
         } else if (expected == null) {
             return false;
         }
-        
+
         List<Object> actual = ConditionContextHelper.foldToASCII(getValueSet(actualValue));
 
         boolean result = true;
-        
+
         switch (op) {
             case "in":
                 result = false;
@@ -97,6 +97,16 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
                     }
                 }
                 break;
+            case "inContains":
+                result = false;
+                for (Object a : actual) {
+                    for (Object b : expected)
+                        if (((String) a).contains((String) b)) {
+                            result = true;
+                            break;
+                        }
+                }
+                break;
             case "notIn":
                 for (Object a : actual) {
                     if (expected.contains(a)) {
@@ -114,20 +124,20 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
                 }
                 break;
             case "hasNoneOf":
-                if(!Collections.disjoint(actual, expected)){
+                if (!Collections.disjoint(actual, expected)) {
                     return false;
                 }
                 break;
             case "hasSomeOf":
-                if(Collections.disjoint(actual, expected)){
+                if (Collections.disjoint(actual, expected)) {
                     return false;
                 }
                 break;
-                
+
             default:
                 throw new IllegalArgumentException("Unknown comparison operator " + op);
         }
-        
+
         return result;
     }
 
@@ -143,7 +153,7 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
 
         Object actualValue;
         if (item instanceof Event && "eventType".equals(name)) {
-            actualValue = ((Event)item).getEventType();
+            actualValue = ((Event) item).getEventType();
         } else {
             try {
                 long time = System.nanoTime();
@@ -159,7 +169,7 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
             } catch (Exception e) {
                 if (!(e instanceof OgnlException)
                         || (!StringUtils.startsWith(e.getMessage(),
-                                "source is null for getProperty(null"))) {
+                        "source is null for getProperty(null"))) {
                     logger.warn("Error evaluating value for " + item.getClass().getName() + " " + name, e);
                 }
                 actualValue = null;
@@ -169,15 +179,15 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
             actualValue = ConditionContextHelper.foldToASCII((String) actualValue);
         }
 
-        if(op == null) {
+        if (op == null) {
             return false;
-        } else if(actualValue == null){
+        } else if (actualValue == null) {
             return op.equals("missing");
         } else if (op.equals("exists")) {
             return true;
         } else if (op.equals("equals")) {
             if (actualValue instanceof Collection) {
-                for (Object o : ((Collection<?>)actualValue)) {
+                for (Object o : ((Collection<?>) actualValue)) {
                     if (o instanceof String) {
                         o = ConditionContextHelper.foldToASCII((String) o);
                     }
@@ -219,19 +229,19 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
             return actualValue.toString().endsWith(expectedValue);
         } else if (op.equals("matchesRegex")) {
             return expectedValue != null && Pattern.compile(expectedValue).matcher(actualValue.toString()).matches();
-        } else if (op.equals("in") || op.equals("notIn") || op.equals("hasSomeOf") || op.equals("hasNoneOf") || op.equals("all")) {
+        } else if (op.equals("in") || op.equals("inContains") || op.equals("notIn") || op.equals("hasSomeOf") || op.equals("hasNoneOf") || op.equals("all")) {
             List<?> expectedValues = ConditionContextHelper.foldToASCII((List<?>) condition.getParameter("propertyValues"));
             List<?> expectedValuesInteger = (List<?>) condition.getParameter("propertyValuesInteger");
             List<?> expectedValuesDate = (List<?>) condition.getParameter("propertyValuesDate");
             List<?> expectedValuesDateExpr = (List<?>) condition.getParameter("propertyValuesDateExpr");
 
             return compareMultivalue(actualValue, expectedValues, expectedValuesDate, expectedValuesInteger, expectedValuesDateExpr, op);
-        } else if(op.equals("isDay") && expectedValueDate != null) {
+        } else if (op.equals("isDay") && expectedValueDate != null) {
             return yearMonthDayDateFormat.format(getDate(actualValue)).equals(yearMonthDayDateFormat.format(getDate(expectedValueDate)));
-        } else if(op.equals("isNotDay") && expectedValueDate != null) {
+        } else if (op.equals("isNotDay") && expectedValueDate != null) {
             return !yearMonthDayDateFormat.format(getDate(actualValue)).equals(yearMonthDayDateFormat.format(getDate(expectedValueDate)));
         }
-        
+
         return false;
     }
 
@@ -272,7 +282,7 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
 
         return accessor;
     }
-    
+
     private Date getDate(Object value) {
         if (value == null) {
             return null;