This is an automated email from the ASF dual-hosted git repository. shuber pushed a commit to branch unomi-1.5.x in repository https://gitbox.apache.org/repos/asf/unomi.git
commit b5e0760f966c0737278e24da5bc7e17c46694ac1 Author: MT BENTERKI <[email protected]> AuthorDate: Thu Aug 20 19:23:30 2020 +0200 UNOMI-368 add propertyValueDouble to condition evaluator (#185) * UNOMI-368 add propertyValueDouble to condition evaluator * UNOMI-368 add itest for double property (cherry picked from commit 07b7f6854e0bd93144b7e64b1e79c0280dc7982c) --- .../org/apache/unomi/itests/ConditionBuilder.java | 38 +++++++++++++++++++++- .../apache/unomi/itests/ConditionEvaluatorIT.java | 18 +++++++++- .../unomi/persistence/spi/PropertyHelper.java | 13 ++++++++ .../PropertyConditionESQueryBuilder.java | 6 ++-- .../conditions/PropertyConditionEvaluator.java | 26 +++++++++------ 5 files changed, 87 insertions(+), 14 deletions(-) diff --git a/itests/src/test/java/org/apache/unomi/itests/ConditionBuilder.java b/itests/src/test/java/org/apache/unomi/itests/ConditionBuilder.java index 38356b5..2420aed 100644 --- a/itests/src/test/java/org/apache/unomi/itests/ConditionBuilder.java +++ b/itests/src/test/java/org/apache/unomi/itests/ConditionBuilder.java @@ -26,7 +26,7 @@ import java.util.Date; /** * Utility class for building conditions - * + * * @author Sergiy Shyrkov */ public class ConditionBuilder { @@ -101,6 +101,10 @@ public class ConditionBuilder { return op("equals").integerValue(value); } + public ComparisonCondition equalTo(Double value) { + return op("equals").doubleValue(value); + } + public ComparisonCondition exists() { return op("exists"); } @@ -113,6 +117,10 @@ public class ConditionBuilder { return op("greaterThan").integerValue(value); } + public ComparisonCondition greaterThan(Double value) { + return op("greaterThan").doubleValue(value); + } + public ComparisonCondition greaterThanOrEqualTo(Date value) { return op("greaterThanOrEqualTo").dateValue(value); } @@ -121,6 +129,10 @@ public class ConditionBuilder { return op("greaterThanOrEqualTo").integerValue(value); } + public ComparisonCondition greaterThanOrEqualTo(Double value) { + return op("greaterThanOrEqualTo").doubleValue(value); + } + public ComparisonCondition in(String... values) { return op("in").stringValues(values); } @@ -141,6 +153,10 @@ public class ConditionBuilder { return op("in").integerValues(values); } + public ComparisonCondition in(Double... values) { + return op("in").doubleValues(values); + } + public ComparisonCondition lessThan(Date value) { return op("lessThan").dateValue(value); } @@ -149,6 +165,10 @@ public class ConditionBuilder { return op("lessThan").integerValue(value); } + public ComparisonCondition lessThan(Double value) { + return op("lessThan").doubleValue(value); + } + public ComparisonCondition lessThanOrEqualTo(Date value) { return op("lessThanOrEqualTo").dateValue(value); } @@ -185,6 +205,10 @@ public class ConditionBuilder { return op("notEquals").integerValue(value); } + public ComparisonCondition notEqualTo(Double value) { + return op("notEquals").doubleValue(value); + } + public ComparisonCondition notIn(String... values) { return op("notIn").stringValues(values); } @@ -197,6 +221,10 @@ public class ConditionBuilder { return op("notIn").integerValues(values); } + public ComparisonCondition notIn(Double... values) { + return op("notIn").doubleValues(values); + } + private ComparisonCondition op(String op) { return parameter("comparisonOperator", op); } @@ -222,6 +250,10 @@ public class ConditionBuilder { return parameter("propertyValueInteger", value); } + private ComparisonCondition doubleValue(Double value) { + return parameter("propertyValueDouble", value); + } + private ComparisonCondition dateValue(Date value) { return parameter("propertyValueDate", value); } @@ -234,6 +266,10 @@ public class ConditionBuilder { return parameter("propertyValuesInteger", values != null ? Arrays.asList(values) : null); } + private ComparisonCondition doubleValues(Double... values) { + return parameter("propertyValuesDouble", values != null ? Arrays.asList(values) : null); + } + private ComparisonCondition dateValues(Date... values) { return parameter("propertyValuesDate", values != null ? Arrays.asList(values) : null); } diff --git a/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java b/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java index 588012e..f0cd5f2 100644 --- a/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java +++ b/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java @@ -37,7 +37,7 @@ import static org.junit.Assert.*; /** * Integration tests for various condition types. - * + * * @author Sergiy Shyrkov */ @RunWith(PaxExam.class) @@ -69,6 +69,7 @@ public class ConditionEvaluatorIT extends BaseIT { profile.setProperty("age", Integer.valueOf(30)); profile.setProperty("gender", "female"); profile.setProperty("lastVisit", lastVisit); + profile.setProperty("randomStats", 0.15); profile.setSegments(new HashSet<String>(Arrays.asList("s1", "s2", "s3"))); this.item = profile; builder = new ConditionBuilder(definitionsService); @@ -148,6 +149,21 @@ public class ConditionEvaluatorIT extends BaseIT { } @Test + public void testDouble() { + ConditionBuilder.PropertyCondition doubleProperty = builder.profileProperty("properties.randomStats"); + + assertTrue(eval(doubleProperty.equalTo(0.15).build())); + assertTrue(eval(builder.not(doubleProperty.equalTo(2.5)).build())); + assertTrue(eval(doubleProperty.notEqualTo(2.5).build())); + assertTrue(eval(doubleProperty.lessThan(0.13).build())); + assertTrue(eval(doubleProperty.greaterThan(0.17).build())); + assertTrue(eval(doubleProperty.greaterThanOrEqualTo(0.15).build())); + assertTrue(eval(doubleProperty.in(0.15).build())); + assertTrue(eval(doubleProperty.in(0.18, 0.15).build())); + assertTrue(eval(doubleProperty.notIn(2.8, 1.6).build())); + } + + @Test public void testMultiValue() { assertTrue(eval(builder.property("profileSegmentCondition", "segments").parameter("matchType", "in") .parameter("segments", "s10", "s20", "s2").build())); diff --git a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java index 283ebbe..98ec311 100644 --- a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java +++ b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java @@ -112,6 +112,19 @@ public class PropertyHelper { return null; } + public static Double getDouble(Object value) { + if (value instanceof Number) { + return ((Number) value).doubleValue(); + } else { + try { + return Double.parseDouble(value.toString()); + } catch (NumberFormatException e) { + // Not a number + } + } + return null; + } + public static Boolean getBooleanValue(Object setPropertyValueBoolean) { if (setPropertyValueBoolean instanceof Boolean) { 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 b06c94e..e9a5dfb 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 @@ -53,17 +53,19 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder String expectedValue = ConditionContextHelper.foldToASCII((String) condition.getParameter("propertyValue")); Object expectedValueInteger = condition.getParameter("propertyValueInteger"); + Object expectedValueDouble = condition.getParameter("propertyValueDouble"); Object expectedValueDate = convertDateToISO(condition.getParameter("propertyValueDate")); Object expectedValueDateExpr = condition.getParameter("propertyValueDateExpr"); List<?> expectedValues = ConditionContextHelper.foldToASCII((List<?>) condition.getParameter("propertyValues")); List<?> expectedValuesInteger = (List<?>) condition.getParameter("propertyValuesInteger"); + List<?> expectedValuesDouble = (List<?>) condition.getParameter("propertyValuesDouble"); List<?> expectedValuesDate = convertDatesToISO((List<?>) condition.getParameter("propertyValuesDate")); List<?> expectedValuesDateExpr = (List<?>) condition.getParameter("propertyValuesDateExpr"); - Object value = ObjectUtils.firstNonNull(expectedValue, expectedValueInteger, expectedValueDate, expectedValueDateExpr); + Object value = ObjectUtils.firstNonNull(expectedValue, expectedValueInteger, expectedValueDouble, expectedValueDate, expectedValueDateExpr); @SuppressWarnings("unchecked") - List<?> values = ObjectUtils.firstNonNull(expectedValues, expectedValuesInteger, expectedValuesDate, expectedValuesDateExpr); + List<?> values = ObjectUtils.firstNonNull(expectedValues, expectedValuesInteger, expectedValuesDouble, expectedValuesDate, expectedValuesDateExpr); switch (comparisonOperator) { case "equals": 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 b85f6f7..90a94fa 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 @@ -68,7 +68,7 @@ public class PropertyConditionEvaluator implements ConditionEvaluator { this.expressionFilterFactory = expressionFilterFactory; } - private int compare(Object actualValue, String expectedValue, Object expectedValueDate, Object expectedValueInteger, Object expectedValueDateExpr) { + private int compare(Object actualValue, String expectedValue, Object expectedValueDate, Object expectedValueInteger, Object expectedValueDateExpr, Object expectedValueDouble) { if (expectedValue == null && expectedValueDate == null && expectedValueInteger == null && getDate(expectedValueDateExpr) == null) { return actualValue == null ? 0 : 1; } else if (actualValue == null) { @@ -77,6 +77,8 @@ public class PropertyConditionEvaluator implements ConditionEvaluator { if (expectedValueInteger != null) { return PropertyHelper.getInteger(actualValue).compareTo(PropertyHelper.getInteger(expectedValueInteger)); + } else if (expectedValueDouble != null) { + return PropertyHelper.getDouble(actualValue).compareTo(PropertyHelper.getDouble(expectedValueDouble)); } else if (expectedValueDate != null) { return getDate(actualValue).compareTo(getDate(expectedValueDate)); } else if (expectedValueDateExpr != null) { @@ -160,6 +162,7 @@ public class PropertyConditionEvaluator implements ConditionEvaluator { String expectedValue = ConditionContextHelper.foldToASCII((String) condition.getParameter("propertyValue")); Object expectedValueInteger = condition.getParameter("propertyValueInteger"); + Object expectedValueDouble = condition.getParameter("propertyValueDouble"); Object expectedValueDate = condition.getParameter("propertyValueDate"); Object expectedValueDateExpr = condition.getParameter("propertyValueDateExpr"); @@ -203,36 +206,39 @@ public class PropertyConditionEvaluator implements ConditionEvaluator { if (o instanceof String) { o = ConditionContextHelper.foldToASCII((String) o); } - if (compare(o, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr) == 0) { + if (compare(o, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) == 0) { return true; } } return false; } - return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr) == 0; + return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) == 0; } else if (op.equals("notEquals")) { - return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr) != 0; + return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) != 0; } else if (op.equals("greaterThan")) { - return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr) > 0; + return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) > 0; } else if (op.equals("greaterThanOrEqualTo")) { - return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr) >= 0; + return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) >= 0; } else if (op.equals("lessThan")) { - return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr) < 0; + return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) < 0; } else if (op.equals("lessThanOrEqualTo")) { - return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr) <= 0; + return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) <= 0; } else if (op.equals("between")) { List<?> expectedValuesInteger = (List<?>) condition.getParameter("propertyValuesInteger"); + List<?> expectedValuesDouble = (List<?>) condition.getParameter("propertyValuesDouble"); List<?> expectedValuesDate = (List<?>) condition.getParameter("propertyValuesDate"); List<?> expectedValuesDateExpr = (List<?>) condition.getParameter("propertyValuesDateExpr"); return compare(actualValue, null, (expectedValuesDate != null && expectedValuesDate.size() >= 1) ? getDate(expectedValuesDate.get(0)) : null, (expectedValuesInteger != null && expectedValuesInteger.size() >= 1) ? (Integer) expectedValuesInteger.get(0) : null, - (expectedValuesDateExpr != null && expectedValuesDateExpr.size() >= 1) ? (String) expectedValuesDateExpr.get(0) : null) >= 0 + (expectedValuesDateExpr != null && expectedValuesDateExpr.size() >= 1) ? (String) expectedValuesDateExpr.get(0) : null, + (expectedValuesDouble != null && expectedValuesDouble.size() >= 1) ? (String) expectedValuesDouble.get(0) : null) >= 0 && compare(actualValue, null, (expectedValuesDate != null && expectedValuesDate.size() >= 2) ? getDate(expectedValuesDate.get(1)) : null, (expectedValuesInteger != null && expectedValuesInteger.size() >= 2) ? (Integer) expectedValuesInteger.get(1) : null, - (expectedValuesDateExpr != null && expectedValuesDateExpr.size() >= 2) ? (String) expectedValuesDateExpr.get(1) : null) <= 0; + (expectedValuesDateExpr != null && expectedValuesDateExpr.size() >= 2) ? (String) expectedValuesDateExpr.get(1) : null, + (expectedValuesDouble != null && expectedValuesDouble.size() >= 2) ? (String) expectedValuesDouble.get(1) : null) <= 0; } else if (op.equals("contains")) { return actualValue.toString().contains(expectedValue); } else if (op.equals("notContains")) {
