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 <[email protected]> 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 <[email protected]> Authored: Wed Jan 18 16:57:40 2017 +0100 Committer: Serge Huber <[email protected]> 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); } } }
