@Override
protected void processIntermediate(GroupByIdBlock groupIdsBlock, Block valuesBlock)
{
ensureCapacity(groupIdsBlock.getGroupCount());
BlockCursor intermediates = valuesBlock.cursor();
for (int position = 0; position < groupIdsBlock.getPositionCount(); position++) {
checkState(intermediates.advanceNextPosition());
// skip null values
if (!intermediates.isNull()) {
long groupId = groupIdsBlock.getGroupId(position);
// todo do all of this with shifts and masks
long globalOffset = groupId * ENTRY_SIZE;
int sliceIndex = Ints.checkedCast(globalOffset / SLICE_SIZE);
Slice slice = slices.get(sliceIndex);
int sliceOffset = Ints.checkedCast(globalOffset - (sliceIndex * SLICE_SIZE));
Slice input = intermediates.getSlice();
ESTIMATOR.mergeInto(slice, sliceOffset + 1, input, 0);
setNotNull(slice, sliceOffset);
}
}
checkState(!intermediates.advanceNextPosition());
}