@Override public boolean outputPartialResult(ArrayTupleBuilder tb, IFrameTupleAccessor stateAccessor, int tIndex, AggregateState state) throws HyracksDataException { byte[] data = stateAccessor.getBuffer().array(); int startOffset = stateAccessor.getTupleStartOffset(tIndex); int aggFieldOffset = stateAccessor.getFieldStartOffset(tIndex, offsetFieldIndex); int refOffset = startOffset + stateAccessor.getFieldSlotsLength() + aggFieldOffset; int start = refOffset; for (int i = 0; i < aggs.length; i++) { aggs[i].finishPartial(data, start, stateFieldLength[i], tb.getDataOutput()); start += stateFieldLength[i]; tb.addFieldEndOffset(); } return true; }
@Override public void aggregate(IFrameTupleAccessor accessor, int tIndex, IFrameTupleAccessor stateAccessor, int stateTupleIndex, AggregateState state) throws HyracksDataException { ftr.reset(accessor, tIndex); int stateTupleStart = stateAccessor.getTupleStartOffset(stateTupleIndex); int fieldSlotLength = stateAccessor.getFieldSlotsLength(); for (int i = 0; i < aggs.length; i++) { byte[] data = stateAccessor.getBuffer().array(); int start = stateAccessor.getFieldStartOffset(stateTupleIndex, i + keys.length) + stateTupleStart + fieldSlotLength; aggs[i].step(ftr, data, start, stateFieldLength[i]); } }
@Override public void init(ArrayTupleBuilder tb, IFrameTupleAccessor accessor, int tIndex, AggregateState state) throws HyracksDataException { DataOutput output = tb.getDataOutput(); ftr.reset(accessor, tIndex); for (int i = 0; i < aggs.length; i++) { int begin = tb.getSize(); if (aggs[i] == null) { aggs[i] = aggFactories[i].createAggregateEvaluator(ctx); } aggs[i].init(output); tb.addFieldEndOffset(); stateFieldLength[i] = tb.getSize() - begin; } // doing initial aggregate ftr.reset(accessor, tIndex); for (int i = 0; i < aggs.length; i++) { byte[] data = tb.getByteArray(); int prevFieldPos = i + keys.length - 1; int start = prevFieldPos >= 0 ? tb.getFieldEndOffsets()[prevFieldPos] : 0; aggs[i].step(ftr, data, start, stateFieldLength[i]); } }
@Override public boolean outputFinalResult(ArrayTupleBuilder tb, IFrameTupleAccessor stateAccessor, int tIndex, AggregateState state) throws HyracksDataException { byte[] data = stateAccessor.getBuffer().array(); int startOffset = stateAccessor.getTupleStartOffset(tIndex); int aggFieldOffset = stateAccessor.getFieldStartOffset(tIndex, offsetFieldIndex); int refOffset = startOffset + stateAccessor.getFieldSlotsLength() + aggFieldOffset; int start = refOffset; for (int i = 0; i < aggs.length; i++) { aggs[i].finish(data, start, stateFieldLength[i], tb.getDataOutput()); start += stateFieldLength[i]; tb.addFieldEndOffset(); } return true; }