You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by sh...@apache.org on 2020/11/11 09:20:47 UTC
[unomi] 01/17: UNOMI-368 add propertyValueDouble to condition
evaluator (#185)
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 <be...@gmail.com>
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")) {