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 2017/01/18 15:57:55 UTC

incubator-unomi git commit: - Clarify past event condition matching code - Fix issue in the property condition query builder when an operator is not defined as we are creating the condition in the UI.

Repository: incubator-unomi
Updated Branches:
  refs/heads/master e61412fc9 -> 46f035819


- Clarify past event condition matching code
- Fix issue in the property condition query builder when an operator is not defined as we are creating the condition in the UI.

Signed-off-by: Serge Huber <sh...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/46f03581
Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/46f03581
Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/46f03581

Branch: refs/heads/master
Commit: 46f035819465df16c47e67b87f50eb4a5bf1e805
Parents: e61412f
Author: Serge Huber <sh...@apache.org>
Authored: Wed Jan 18 16:57:40 2017 +0100
Committer: Serge Huber <sh...@apache.org>
Committed: Wed Jan 18 16:57:40 2017 +0100

----------------------------------------------------------------------
 .../PastEventConditionESQueryBuilder.java       | 12 +++---
 .../PropertyConditionESQueryBuilder.java        | 45 ++++++++++----------
 .../services/services/SegmentServiceImpl.java   | 19 +++++----
 3 files changed, 39 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/46f03581/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java
----------------------------------------------------------------------
diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java
index 84d964f..7c6217b 100644
--- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java
+++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java
@@ -75,11 +75,13 @@ public class PastEventConditionESQueryBuilder implements ConditionESQueryBuilder
         Integer minimumEventCount = condition.getParameter("minimumEventCount") == null ? 0 : (Integer) condition.getParameter("minimumEventCount");
         Integer maximumEventCount = condition.getParameter("maximumEventCount") == null  ? Integer.MAX_VALUE : (Integer) condition.getParameter("maximumEventCount");
 
-        Map<String, Long> res = persistenceService.aggregateQuery(andCondition, new TermsAggregate("profileId"), Event.ITEM_TYPE);
-        for (Map.Entry<String, Long> entry : res.entrySet()) {
-            if (!entry.getKey().startsWith("_")) {
-                if (entry.getValue() >= minimumEventCount && entry.getValue() <= maximumEventCount) {
-                    ids.add(entry.getKey());
+        Map<String, Long> eventCountByProfile = persistenceService.aggregateQuery(andCondition, new TermsAggregate("profileId"), Event.ITEM_TYPE);
+        if (eventCountByProfile != null) {
+            for (Map.Entry<String, Long> entry : eventCountByProfile.entrySet()) {
+                if (!entry.getKey().startsWith("_")) {
+                    if (entry.getValue() >= minimumEventCount && entry.getValue() <= maximumEventCount) {
+                        ids.add(entry.getKey());
+                    }
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/46f03581/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 c36722b..484c5ca 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
@@ -37,10 +37,10 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder
 
     @Override
     public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) {
-        String op = (String) condition.getParameter("comparisonOperator");
+        String comparisonOperator = (String) condition.getParameter("comparisonOperator");
         String name = (String) condition.getParameter("propertyName");
 
-        if(op == 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");
         }
 
@@ -58,80 +58,79 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder
         @SuppressWarnings("unchecked")
         List<?> values = ObjectUtils.firstNonNull(expectedValues,expectedValuesInteger,expectedValuesDate,expectedValuesDateExpr);
 
-        switch (op) {
+        switch (comparisonOperator) {
             case "equals":
-                checkRequiredValue(value, name, op, false);
+                checkRequiredValue(value, name, comparisonOperator, false);
                 return QueryBuilders.termQuery(name, value);
             case "notEquals":
-                checkRequiredValue(value, name, op, false);
+                checkRequiredValue(value, name, comparisonOperator, false);
                 return QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery(name, value));
             case "greaterThan":
-                checkRequiredValue(value, name, op, false);
+                checkRequiredValue(value, name, comparisonOperator, false);
                 return QueryBuilders.rangeQuery(name).gt(value);
             case "greaterThanOrEqualTo":
-                checkRequiredValue(value, name, op, false);
+                checkRequiredValue(value, name, comparisonOperator, false);
                 return QueryBuilders.rangeQuery(name).gte(value);
             case "lessThan":
-                checkRequiredValue(value, name, op, false);
+                checkRequiredValue(value, name, comparisonOperator, false);
                 return QueryBuilders.rangeQuery(name).lt(value);
             case "lessThanOrEqualTo":
-                checkRequiredValue(value, name, op, false);
+                checkRequiredValue(value, name, comparisonOperator, false);
                 return QueryBuilders.rangeQuery(name).lte(value);
             case "between":
-                checkRequiredValuesSize(values, name, op, 2);
+                checkRequiredValuesSize(values, name, comparisonOperator, 2);
                 return QueryBuilders.rangeQuery(name).gte(values.get(0)).lte(values.get(1));
             case "exists":
                 return QueryBuilders.existsQuery(name);
             case "missing":
                 return QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery((name)));
             case "contains":
-                checkRequiredValue(expectedValue, name, op, false);
+                checkRequiredValue(expectedValue, name, comparisonOperator, false);
                 return QueryBuilders.regexpQuery(name, ".*" + expectedValue + ".*");
             case "startsWith":
-                checkRequiredValue(expectedValue, name, op, false);
+                checkRequiredValue(expectedValue, name, comparisonOperator, false);
                 return QueryBuilders.prefixQuery(name, expectedValue);
             case "endsWith":
-                checkRequiredValue(expectedValue, name, op, false);
+                checkRequiredValue(expectedValue, name, comparisonOperator, false);
                 return QueryBuilders.regexpQuery(name, ".*" + expectedValue);
             case "matchesRegex":
-                checkRequiredValue(expectedValue, name, op, false);
+                checkRequiredValue(expectedValue, name, comparisonOperator, false);
                 return QueryBuilders.regexpQuery(name, expectedValue);
             case "in":
-                checkRequiredValue(values, name, op, true);
+                checkRequiredValue(values, name, comparisonOperator, true);
                 return QueryBuilders.termsQuery(name, values.toArray());
             case "notIn":
-                checkRequiredValue(values, name, op, true);
+                checkRequiredValue(values, name, comparisonOperator, true);
                 return QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(name, values.toArray()));
             case "all":
-                checkRequiredValue(values, name, op, true);
+                checkRequiredValue(values, name, comparisonOperator, true);
                 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
                 for (Object curValue : values) {
                     boolQueryBuilder.must(QueryBuilders.termQuery(name, curValue));
                 }
                 return boolQueryBuilder;
             case "hasSomeOf":
-                checkRequiredValue(values, name, op, true);
+                checkRequiredValue(values, name, comparisonOperator, true);
                 boolQueryBuilder = QueryBuilders.boolQuery();
                 for (Object curValue : values) {
                     boolQueryBuilder.should(QueryBuilders.termQuery(name, curValue));
                 }
                 return boolQueryBuilder;
             case "hasNoneOf":
-                checkRequiredValue(values, name, op, true);
+                checkRequiredValue(values, name, comparisonOperator, true);
                 boolQueryBuilder = QueryBuilders.boolQuery();
                 for (Object curValue : values) {
                     boolQueryBuilder.mustNot(QueryBuilders.termQuery(name, curValue));
                 }
                 return boolQueryBuilder;
             case "isDay":
-                checkRequiredValue(value, name, op, false);
+                checkRequiredValue(value, name, comparisonOperator, false);
                 return getIsSameDayRange(value, name);
             case "isNotDay":
-                checkRequiredValue(value, name, op, false);
+                checkRequiredValue(value, name, comparisonOperator, false);
                 return QueryBuilders.boolQuery().mustNot(getIsSameDayRange(value, name));
-            default:
-                throw new IllegalArgumentException("Impossible to build ES filter, unrecognized op=" + op);
         }
+        return null;
     }
 
     private void checkRequiredValuesSize(List<?> values, String name, String operator, int expectedSize) {

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/46f03581/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
index 2275d60..08f2f25 100644
--- a/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
@@ -803,17 +803,18 @@ public class SegmentServiceImpl implements SegmentService, SynchronousBundleList
             l.add(numberOfDaysCondition);
         }
         String propertyKey = (String) parentCondition.getParameter("generatedPropertyKey");
-        Map<String, Long> res = persistenceService.aggregateQuery(andCondition, new TermsAggregate("profileId"), Event.ITEM_TYPE);
-        for (Map.Entry<String, Long> entry : res.entrySet()) {
-            if (!entry.getKey().startsWith("_")) {
-                Map<String,Object> p = new HashMap<>();
-                p.put(propertyKey, entry.getValue());
-                Map<String,Object> p2 = new HashMap<>();
-                p2.put("pastEvents",p);
+        Map<String, Long> eventCountByProfile = persistenceService.aggregateQuery(andCondition, new TermsAggregate("profileId"), Event.ITEM_TYPE);
+        for (Map.Entry<String, Long> entry : eventCountByProfile.entrySet()) {
+            String profileId = entry.getKey();
+            if (!profileId.startsWith("_")) {
+                Map<String,Long> pastEventCounts = new HashMap<>();
+                pastEventCounts.put(propertyKey, entry.getValue());
+                Map<String,Object> systemProperties = new HashMap<>();
+                systemProperties.put("pastEvents",pastEventCounts);
                 try {
-                    persistenceService.update(entry.getKey(), null, Profile.class, "systemProperties", p2);
+                    persistenceService.update(profileId, null, Profile.class, "systemProperties", systemProperties);
                 } catch (Exception e) {
-                    logger.error(e.getMessage(), e);
+                    logger.error("Error updating profile {} past event system properties", profileId, e);
                 }
             }
         }