public Parts createPartialAggregations(SymbolAllocator symbolAllocator, FunctionRegistry functionRegistry)
{
ImmutableMap.Builder<Symbol, Aggregation> partialAggregation = ImmutableMap.builder();
ImmutableMap.Builder<Symbol, Aggregation> finalAggregation = ImmutableMap.builder();
ImmutableMap.Builder<Symbol, Symbol> mappings = ImmutableMap.builder();
for (Map.Entry<Symbol, Aggregation> entry : aggregations.entrySet()) {
Aggregation originalAggregation = entry.getValue();
Signature signature = originalAggregation.getSignature();
InternalAggregationFunction function = functionRegistry.getAggregateFunctionImplementation(signature);
Symbol partialSymbol = symbolAllocator.newSymbol(signature.getName(), function.getIntermediateType());
mappings.put(entry.getKey(), partialSymbol);
partialAggregation.put(partialSymbol, new Aggregation(originalAggregation.getCall(), signature, originalAggregation.getMask()));
finalAggregation.put(entry.getKey(),
new Aggregation(
new FunctionCall(QualifiedName.of(signature.getName()), ImmutableList.of(partialSymbol.toSymbolReference())),
signature,
Optional.empty()));
}
groupingSymbols.forEach(symbol -> mappings.put(symbol, symbol));
return new Parts(
new StatisticAggregations(partialAggregation.build(), groupingSymbols),
new StatisticAggregations(finalAggregation.build(), groupingSymbols),
mappings.build());
}