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")) {