You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by dg...@apache.org on 2021/11/05 16:19:46 UTC
[unomi] branch improve-is-day-condition-operator created (now
9619bac)
This is an automated email from the ASF dual-hosted git repository.
dgriffon pushed a change to branch improve-is-day-condition-operator
in repository https://gitbox.apache.org/repos/asf/unomi.git.
at 9619bac UNOMI-523 : add date expression to isDay / isNotDay property comparison operator. (bonus, fix double property type support)
This branch includes the following new commits:
new 9619bac UNOMI-523 : add date expression to isDay / isNotDay property comparison operator. (bonus, fix double property type support)
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[unomi] 01/01: UNOMI-523 : add date expression to isDay / isNotDay
property comparison operator. (bonus, fix double property type support)
Posted by dg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
dgriffon pushed a commit to branch improve-is-day-condition-operator
in repository https://gitbox.apache.org/repos/asf/unomi.git
commit 9619bac32bf48bf8a4b9b85923164199e0d389dc
Author: David Griffon <dg...@jahia.com>
AuthorDate: Fri Nov 5 17:18:19 2021 +0100
UNOMI-523 : add date expression to isDay / isNotDay property comparison operator. (bonus, fix double property type support)
---
.../org/apache/unomi/itests/ConditionBuilder.java | 12 ++++++++++++
.../apache/unomi/itests/ConditionEvaluatorIT.java | 5 +++++
.../conditions/PropertyConditionESQueryBuilder.java | 6 ++++--
.../conditions/PropertyConditionEvaluator.java | 21 ++++++++++++---------
4 files changed, 33 insertions(+), 11 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 2d01f97..44eb676 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ConditionBuilder.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ConditionBuilder.java
@@ -149,10 +149,18 @@ public class ConditionBuilder {
return op("isDay").dateValue(value);
}
+ public ComparisonCondition isDay(String expression) {
+ return op("isDay").dateValueExpr(expression);
+ }
+
public ComparisonCondition isNotDay(Date value) {
return op("isNotDay").dateValue(value);
}
+ public ComparisonCondition isNotDay(String expression) {
+ return op("isNotDay").dateValueExpr(expression);
+ }
+
public ComparisonCondition in(Integer... values) {
return op("in").integerValues(values);
}
@@ -262,6 +270,10 @@ public class ConditionBuilder {
return parameter("propertyValueDate", value);
}
+ private ComparisonCondition dateValueExpr(String value) {
+ return parameter("propertyValueDateExpr", value);
+ }
+
private ComparisonCondition stringValues(String... values) {
return parameter("propertyValues", 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 427f45f..d546017 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ConditionEvaluatorIT.java
@@ -17,6 +17,7 @@
package org.apache.unomi.itests;
+import org.apache.commons.lang3.time.DateUtils;
import org.apache.unomi.api.Item;
import org.apache.unomi.api.Profile;
import org.apache.unomi.api.conditions.Condition;
@@ -32,6 +33,7 @@ import org.ops4j.pax.exam.util.Filter;
import javax.inject.Inject;
import java.util.*;
+import java.util.concurrent.TimeUnit;
import static org.junit.Assert.*;
@@ -116,6 +118,9 @@ public class ConditionEvaluatorIT extends BaseIT {
assertTrue(eval(builder.profileProperty("properties.lastVisit").isDay(lastVisit).build()));
assertTrue(eval(builder.profileProperty("properties.lastVisit").isNotDay(new Date(lastVisit.getTime() + (24*60*60*1000))).build()));
+ long daysFromToday = TimeUnit.MILLISECONDS.toDays(DateUtils.round(new Date(), Calendar.DAY_OF_MONTH).getTime() - lastVisit.getTime());
+ assertTrue(eval(builder.profileProperty("properties.lastVisit").isDay("now-" + daysFromToday + "d").build()));
+ assertTrue(eval(builder.profileProperty("properties.lastVisit").isNotDay("now-" + (daysFromToday + 1) + "d").build()));
}
@Test
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 1613081..644ba7f 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
@@ -36,6 +36,8 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
+import static org.apache.unomi.plugins.baseplugin.conditions.PropertyConditionEvaluator.getDate;
+
public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder {
DateTimeFormatter dateTimeFormatter;
@@ -146,10 +148,10 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder
return boolQueryBuilder;
case "isDay":
checkRequiredValue(value, name, comparisonOperator, false);
- return getIsSameDayRange(value, name);
+ return getIsSameDayRange(getDate(value), name);
case "isNotDay":
checkRequiredValue(value, name, comparisonOperator, false);
- return QueryBuilders.boolQuery().mustNot(getIsSameDayRange(value, name));
+ return QueryBuilders.boolQuery().mustNot(getIsSameDayRange(getDate(value), name));
case "distance":
final String unitString = (String) condition.getParameter("unit");
final Object centerObj = condition.getParameter("center");
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 f637a7b..d2ef90a 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
@@ -69,7 +69,7 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
}
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) {
+ if (expectedValue == null && expectedValueDate == null && expectedValueInteger == null && getDate(expectedValueDateExpr) == null && expectedValueDouble == null) {
return actualValue == null ? 0 : 1;
} else if (actualValue == null) {
return -1;
@@ -88,9 +88,9 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
}
}
- private boolean compareMultivalue(Object actualValue, List<?> expectedValues, List<?> expectedValuesDate, List<?> expectedValuesNumber, List<?> expectedValuesDateExpr, String op) {
+ private boolean compareValues(Object actualValue, List<?> expectedValues, List<?> expectedValuesInteger, List<?> expectedValuesDouble, List<?> expectedValuesDate, List<?> expectedValuesDateExpr, String op) {
@SuppressWarnings("unchecked")
- List<?> expected = ObjectUtils.firstNonNull(expectedValues, expectedValuesDate, expectedValuesNumber);
+ List<?> expected = ObjectUtils.firstNonNull(expectedValues, expectedValuesDate, expectedValuesInteger, expectedValuesDouble);
if (actualValue == null) {
return expected == null;
} else if (expected == null) {
@@ -264,14 +264,17 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
} 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<?> expectedValuesDouble = (List<?>) condition.getParameter("propertyValuesDouble");
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) {
- return yearMonthDayDateFormat.format(getDate(actualValue)).equals(yearMonthDayDateFormat.format(getDate(expectedValueDate)));
- } else if (op.equals("isNotDay") && expectedValueDate != null) {
- return !yearMonthDayDateFormat.format(getDate(actualValue)).equals(yearMonthDayDateFormat.format(getDate(expectedValueDate)));
+ return compareValues(actualValue, expectedValues, expectedValuesInteger, expectedValuesDouble, expectedValuesDate, expectedValuesDateExpr, op);
+ } else if (op.equals("isDay") && (expectedValueDate != null || expectedValueDateExpr != null)) {
+ Object expectedDate = expectedValueDate == null ? expectedValueDateExpr : expectedValueDate;
+ return yearMonthDayDateFormat.format(getDate(actualValue)).equals(yearMonthDayDateFormat.format(getDate(expectedDate)));
+ } else if (op.equals("isNotDay") && (expectedValueDate != null || expectedValueDateExpr != null)) {
+ Object expectedDate = expectedValueDate == null ? expectedValueDateExpr : expectedValueDate;
+ return !yearMonthDayDateFormat.format(getDate(actualValue)).equals(yearMonthDayDateFormat.format(getDate(expectedDate)));
} else if (op.equals("distance")) {
GeoPoint actualCenter = null;
if (actualValue instanceof GeoPoint) {
@@ -433,7 +436,7 @@ public class PropertyConditionEvaluator implements ConditionEvaluator {
return accessor;
}
- private Date getDate(Object value) {
+ protected static Date getDate(Object value) {
if (value == null) {
return null;
}