@Override public List<AnswerGroup<T>> apply(Stream<? extends ConceptMap> conceptMaps) { Collector<ConceptMap, ?, List<T>> applyAggregate = collectingAndThen(toList(), list -> innerAggregate.apply(list.stream())); List<AnswerGroup<T>> answerGroups = new ArrayList<>(); conceptMaps.collect(groupingBy(this::getConcept, applyAggregate)) .forEach( (key, values) -> answerGroups.add(new AnswerGroup<>(key, values))); return answerGroups; }
@Override public List<Value> apply(Stream<? extends ConceptMap> stream) { List<? extends ConceptMap> list = stream.collect(toList()); Number count = countAggregate.apply(list.stream()).get(0).number(); if (count.intValue() == 0) { return Collections.emptyList(); } else { Number sum = sumAggregate.apply(list.stream()).get(0).number(); return Collections.singletonList(new Value(sum.doubleValue() / count.longValue())); } }
@Override public <T extends Answer> Stream<T> run(AggregateQuery<T> query) { return query.aggregate().apply(query.match().stream()).stream(); }