final ArrayBackedValueStorage abvsCount = new ArrayBackedValueStorage();
final DataOutput dOutCount = abvsCount.getDataOutput();
final ArrayBackedValueStorage abvsSum = new ArrayBackedValueStorage();
final DataOutput dOutSum = abvsSum.getDataOutput();
final ArrayBackedValueStorage abvsSeq = new ArrayBackedValueStorage();
final SequenceBuilder sb = new SequenceBuilder();
final AddOperation aOp = new AddOperation();
return new AbstractTaggedValueArgumentAggregateEvaluator(args) {
long count;
TaggedValuePointable tvpSum = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
@Override
public void init() throws AlgebricksException {
count = 0;
try {
abvsSum.reset();
dOutSum.write(ValueTag.XS_INTEGER_TAG);
dOutSum.writeLong(0);
tvpSum.set(abvsSum);
} catch (Exception e) {
throw new AlgebricksException(e);
}
}
@Override
public void finish(IPointable result) throws AlgebricksException {
if (count == 0) {
XDMConstants.setEmptySequence(result);
} else {
// Set count as a TaggedValuePointable.
try {
abvsCount.reset();
dOutCount.write(ValueTag.XS_INTEGER_TAG);
dOutCount.writeLong(count);
tvpCount.set(abvsCount);
// Save intermediate result.
abvsSeq.reset();
sb.reset(abvsSeq);
sb.addItem(tvpCount);
sb.addItem(tvpSum);
sb.finish();
result.set(abvsSeq);
} catch (Exception e) {
throw new AlgebricksException(e);
}
}