in services/src/main/java/org/apache/unomi/services/impl/goals/GoalsServiceImpl.java [439:537]
public GoalReport getGoalReport(String goalId, AggregateQuery query) {
Condition condition = new Condition(definitionsService.getConditionType("booleanCondition"));
final ArrayList<Condition> list = new ArrayList<Condition>();
condition.setParameter("operator", "and");
condition.setParameter("subConditions", list);
Goal g = getGoal(goalId);
Condition goalTargetCondition = new Condition(definitionsService.getConditionType("sessionPropertyCondition"));
goalTargetCondition.setParameter("propertyName", "systemProperties.goals." + goalId+ "TargetReached");
goalTargetCondition.setParameter("comparisonOperator", "exists");
Condition goalStartCondition;
if (g.getStartEvent() == null && g.getCampaignId() != null) {
goalStartCondition = new Condition(definitionsService.getConditionType("sessionPropertyCondition"));
goalStartCondition.setParameter("propertyName", "systemProperties.campaigns." + g.getCampaignId() + "Engaged");
goalStartCondition.setParameter("comparisonOperator", "exists");
} else if (g.getStartEvent() == null) {
goalStartCondition = new Condition(definitionsService.getConditionType("matchAllCondition"));
} else {
goalStartCondition = new Condition(definitionsService.getConditionType("sessionPropertyCondition"));
goalStartCondition.setParameter("propertyName", "systemProperties.goals." + goalId + "StartReached");
goalStartCondition.setParameter("comparisonOperator", "exists");
}
if (query != null && query.getCondition() != null) {
ParserHelper.resolveConditionType(definitionsService, query.getCondition(), "goal " + goalId + " report");
list.add(query.getCondition());
}
Map<String, Long> all;
Map<String, Long> match;
// resolve aggregate
BaseAggregate aggregate = null;
String property = query.getAggregate().getProperty();
if(query != null && query.getAggregate() != null && property != null) {
if (query.getAggregate().getType() != null){
// try to guess the aggregate type
if(query.getAggregate().getType().equals("date")) {
String interval = (String) query.getAggregate().getParameters().get("interval");
String format = (String) query.getAggregate().getParameters().get("format");
aggregate = new DateAggregate(property, interval, format);
} else if (query.getAggregate().getType().equals("dateRange") && query.getAggregate().getDateRanges() != null && query.getAggregate().getDateRanges().size() > 0) {
String format = (String) query.getAggregate().getParameters().get("format");
aggregate = new DateRangeAggregate(property, format, query.getAggregate().getDateRanges());
} else if (query.getAggregate().getType().equals("numericRange") && query.getAggregate().getNumericRanges() != null && query.getAggregate().getNumericRanges().size() > 0) {
aggregate = new NumericRangeAggregate(property, query.getAggregate().getNumericRanges());
} else if (query.getAggregate().getType().equals("ipRange") && query.getAggregate().ipRanges() != null && query.getAggregate().ipRanges().size() > 0) {
aggregate = new IpRangeAggregate(property, query.getAggregate().ipRanges());
}
}
if(aggregate == null){
aggregate = new TermsAggregate(property);
}
}
if (aggregate != null) {
list.add(goalStartCondition);
all = persistenceService.aggregateWithOptimizedQuery(condition, aggregate, Session.ITEM_TYPE);
list.remove(goalStartCondition);
list.add(goalTargetCondition);
match = persistenceService.aggregateWithOptimizedQuery(condition, aggregate, Session.ITEM_TYPE);
} else {
list.add(goalStartCondition);
all = new HashMap<String, Long>();
all.put("_filtered", persistenceService.queryCount(condition, Session.ITEM_TYPE));
list.remove(goalStartCondition);
list.add(goalTargetCondition);
match = new HashMap<String, Long>();
match.put("_filtered", persistenceService.queryCount(condition, Session.ITEM_TYPE));
}
GoalReport report = new GoalReport();
GoalReport.Stat stat = new GoalReport.Stat();
Long allFiltered = all.remove("_filtered");
Long matchFiltered = match.remove("_filtered");
stat.setStartCount(allFiltered != null ? allFiltered : 0);
stat.setTargetCount(matchFiltered != null ? matchFiltered : 0);
stat.setConversionRate(stat.getStartCount() > 0 ? (float) stat.getTargetCount() / (float) stat.getStartCount() : 0);
report.setGlobalStats(stat);
all.remove("_all");
report.setSplit(new LinkedList<GoalReport.Stat>());
for (Map.Entry<String, Long> entry : all.entrySet()) {
GoalReport.Stat dateStat = new GoalReport.Stat();
dateStat.setKey(entry.getKey());
dateStat.setStartCount(entry.getValue());
dateStat.setTargetCount(match.containsKey(entry.getKey()) ? match.get(entry.getKey()) : 0);
dateStat.setConversionRate(dateStat.getStartCount() > 0 ? (float) dateStat.getTargetCount() / (float) dateStat.getStartCount() : 0);
dateStat.setPercentage(stat.getTargetCount() > 0 ? (float) dateStat.getTargetCount() / (float) stat.getTargetCount() : 0);
report.getSplit().add(dateStat);
}
return report;
}