private void executeAggregation(OCommandContext ctx, int nRecords) { if (!prev.isPresent()) { throw new OCommandExecutionException("Cannot execute an aggregation or a GROUP BY without a previous result"); } OExecutionStepInternal prevStep = prev.get(); OResultSet lastRs = prevStep.syncPull(ctx, nRecords); while (lastRs.hasNext()) { aggregate(lastRs.next(), ctx); if (!lastRs.hasNext()) { lastRs = prevStep.syncPull(ctx, nRecords); } } finalResults = new ArrayList<>(); finalResults.addAll(aggregateResults.values()); aggregateResults.clear(); for (OResultInternal item : finalResults) { for (String name : item.getPropertyNames()) { Object prevVal = item.getProperty(name); if (prevVal instanceof AggregationContext) { item.setProperty(name, ((AggregationContext) prevVal).getFinalValue()); } } } }
preAggr.setProperty(alias, aggrCtx); aggrCtx.apply(next, ctx); } else { preAggr.setProperty(alias, proj.execute(next, ctx));