package jeql.engine.query.group; import jeql.api.function.Aggregator; import jeql.api.row.ArrayRowList; import jeql.api.row.BasicRow; import jeql.api.row.RowList; import jeql.engine.query.Tuple; /** * A GroupResultBuilder for an aggregated query * with a single result row (i.e. containing * aggregate functions but with no GROUP BY specified.) * In this case storage and processing can be optimized. * * @author Martin Davis * */ class SingleGroupRowsBuilder extends EagerGroupRowsBuilder { private Aggregator[] aggItem; public SingleGroupRowsBuilder() { } /** * tuple is not used (and may be null) */ public Aggregator[] getAggregatorsForGroup(Tuple tuple) { createAggregators(); return aggItem; } private void createAggregators() { if (aggItem == null) { // not yet present - insert it aggItem = groupScope.createAggregatorVector(); } } public RowList createRows() { ArrayRowList memRL = new ArrayRowList(aggSchema); int rowSize = memRL.getSchema().size(); BasicRow row = new BasicRow(rowSize); int col = 0; // ensure aggregators are created (in case base rowlist was empty) createAggregators(); for (int iAgg = 0; iAgg < aggItem.length; iAgg++) { row.setValue(col++, aggItem[iAgg].getResult()); } memRL.add(row); return memRL; } }