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 <[email protected]> Authored: Thu Feb 2 17:18:18 2017 +0100 Committer: Abdelkader Midani <[email protected]> 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;
