Skip to content

Commit

Permalink
Support multivalued fields in ungrouped aggs (ESQL-1028)
Browse files Browse the repository at this point in the history
This adds support for reading multivalued fields in ungrouped
aggregations so `from foo | stats max(a)` will find the actual max of
`a`, even if there are many values for `a`.

I had to modify a method in `AbstractBlock` to make it useful for
aggregations. It wasn't used anywhere else so that feels safe.
  • Loading branch information
nik9000 committed Apr 20, 2023
1 parent e05d9a5 commit 1431236
Show file tree
Hide file tree
Showing 52 changed files with 405 additions and 259 deletions.
Expand Up @@ -225,16 +225,20 @@ private MethodSpec addRawVector() {
private MethodSpec addRawBlock() {
MethodSpec.Builder builder = MethodSpec.methodBuilder("addRawBlock");
builder.addModifiers(Modifier.PRIVATE).addParameter(valueBlockType(init, combine), "block");
builder.beginControlFlow("for (int p = 0; p < block.getTotalValueCount(); p++)");
builder.beginControlFlow("for (int p = 0; p < block.getPositionCount(); p++)");
{
builder.beginControlFlow("if (block.isNull(p) == false)");
builder.addStatement("int i = block.getFirstValueIndex(p)");
builder.beginControlFlow("if (block.isNull(p))");
builder.addStatement("continue");
builder.endControlFlow();
builder.addStatement("int start = block.getFirstValueIndex(p)");
builder.addStatement("int end = start + block.getValueCount(p)");
builder.beginControlFlow("for (int i = start; i < end; i++)");
combineRawInput(builder, "block");
builder.endControlFlow();
}
builder.endControlFlow();
if (combineValueCount != null) {
builder.addStatement("$T.combineValueCount(state, block.validPositionCount())", declarationType);
builder.addStatement("$T.combineValueCount(state, block.getTotalValueCount())", declarationType);
}
return builder.build();
}
Expand Down
Expand Up @@ -58,13 +58,17 @@ private void addRawVector(DoubleVector vector) {
}

private void addRawBlock(DoubleBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
AvgDoubleAggregator.combine(state, block.getDouble(i));
}
}
AvgDoubleAggregator.combineValueCount(state, block.validPositionCount());
AvgDoubleAggregator.combineValueCount(state, block.getTotalValueCount());
}

@Override
Expand Down
Expand Up @@ -57,13 +57,17 @@ private void addRawVector(IntVector vector) {
}

private void addRawBlock(IntBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
AvgIntAggregator.combine(state, block.getInt(i));
}
}
AvgIntAggregator.combineValueCount(state, block.validPositionCount());
AvgIntAggregator.combineValueCount(state, block.getTotalValueCount());
}

@Override
Expand Down
Expand Up @@ -58,13 +58,17 @@ private void addRawVector(LongVector vector) {
}

private void addRawBlock(LongBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
AvgLongAggregator.combine(state, block.getLong(i));
}
}
AvgLongAggregator.combineValueCount(state, block.validPositionCount());
AvgLongAggregator.combineValueCount(state, block.getTotalValueCount());
}

@Override
Expand Down
Expand Up @@ -58,9 +58,13 @@ private void addRawVector(BooleanVector vector) {
}

private void addRawBlock(BooleanBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
CountDistinctBooleanAggregator.combine(state, block.getBoolean(i));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(DoubleVector vector) {
}

private void addRawBlock(DoubleBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
CountDistinctDoubleAggregator.combine(state, block.getDouble(i));
}
}
Expand Down
Expand Up @@ -56,9 +56,13 @@ private void addRawVector(IntVector vector) {
}

private void addRawBlock(IntBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
CountDistinctIntAggregator.combine(state, block.getInt(i));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(LongVector vector) {
}

private void addRawBlock(LongBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
CountDistinctLongAggregator.combine(state, block.getLong(i));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(DoubleVector vector) {
}

private void addRawBlock(DoubleBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
state.doubleValue(MaxDoubleAggregator.combine(state.doubleValue(), block.getDouble(i)));
}
}
Expand Down
Expand Up @@ -56,9 +56,13 @@ private void addRawVector(IntVector vector) {
}

private void addRawBlock(IntBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
state.intValue(MaxIntAggregator.combine(state.intValue(), block.getInt(i)));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(LongVector vector) {
}

private void addRawBlock(LongBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
state.longValue(MaxLongAggregator.combine(state.longValue(), block.getLong(i)));
}
}
Expand Down
Expand Up @@ -58,9 +58,13 @@ private void addRawVector(DoubleVector vector) {
}

private void addRawBlock(DoubleBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
MedianAbsoluteDeviationDoubleAggregator.combine(state, block.getDouble(i));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(IntVector vector) {
}

private void addRawBlock(IntBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
MedianAbsoluteDeviationIntAggregator.combine(state, block.getInt(i));
}
}
Expand Down
Expand Up @@ -58,9 +58,13 @@ private void addRawVector(LongVector vector) {
}

private void addRawBlock(LongBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
MedianAbsoluteDeviationLongAggregator.combine(state, block.getLong(i));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(DoubleVector vector) {
}

private void addRawBlock(DoubleBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
MedianDoubleAggregator.combine(state, block.getDouble(i));
}
}
Expand Down
Expand Up @@ -56,9 +56,13 @@ private void addRawVector(IntVector vector) {
}

private void addRawBlock(IntBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
MedianIntAggregator.combine(state, block.getInt(i));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(LongVector vector) {
}

private void addRawBlock(LongBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
MedianLongAggregator.combine(state, block.getLong(i));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(DoubleVector vector) {
}

private void addRawBlock(DoubleBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
state.doubleValue(MinDoubleAggregator.combine(state.doubleValue(), block.getDouble(i)));
}
}
Expand Down
Expand Up @@ -56,9 +56,13 @@ private void addRawVector(IntVector vector) {
}

private void addRawBlock(IntBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
state.intValue(MinIntAggregator.combine(state.intValue(), block.getInt(i)));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(LongVector vector) {
}

private void addRawBlock(LongBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
state.longValue(MinLongAggregator.combine(state.longValue(), block.getLong(i)));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(DoubleVector vector) {
}

private void addRawBlock(DoubleBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
SumDoubleAggregator.combine(state, block.getDouble(i));
}
}
Expand Down
Expand Up @@ -57,9 +57,13 @@ private void addRawVector(IntVector vector) {
}

private void addRawBlock(IntBlock block) {
for (int p = 0; p < block.getTotalValueCount(); p++) {
if (block.isNull(p) == false) {
int i = block.getFirstValueIndex(p);
for (int p = 0; p < block.getPositionCount(); p++) {
if (block.isNull(p)) {
continue;
}
int start = block.getFirstValueIndex(p);
int end = start + block.getValueCount(p);
for (int i = start; i < end; i++) {
state.longValue(SumIntAggregator.combine(state.longValue(), block.getInt(i)));
}
}
Expand Down

0 comments on commit 1431236

Please sign in to comment.