Skip to content

Commit 311a722

Browse files
authored
ESQL: Support for multi-argument aggs (#132424)
Adds support for multi-argument grouped aggs. Previously we only had support for aggs with a value and a timestamp. Now we can support any number of fields. This change is mostly mechanical and mostly in generated code. The only production code changes are: 1. Rename things like `block` and `vector` to `fooBlock` so names are unique with multi-argument fields. `foo` comes from the name of the argument to `combine`. 2. Support for passing `Block`s of `long`s in `FirstOverTime` and `LastOverTime`. This will allow it to function outside of TSDB. 3. Flip the order of the arguments in the `combine` methods for `FirstOverTime` and `LastOverTime` so they line up with how the ESQL code orders the arguments. This shouldn't change the runtime at all. 4. Rename the offset variable we use for reading from vectors in non-grouped code so it's the same name as we use in grouped code. This just keeps the code gen a little more consistent.
1 parent a86ab92 commit 311a722

File tree

158 files changed

+5853
-3675
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

158 files changed

+5853
-3675
lines changed

x-pack/plugin/esql/compute/gen/src/main/java/org/elasticsearch/compute/gen/AggregatorImplementer.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ public AggregatorImplementer(
106106
requireName("combine"),
107107
requireArgsStartsWith(requireType(aggState.declaredType()), requireAnyType("<aggregation input column type>"))
108108
);
109-
110109
this.aggParams = combine.getParameters().stream().skip(1).map(AggregationParameter::create).toList();
111110

112111
this.createParameters = init.getParameters()
@@ -344,10 +343,13 @@ private MethodSpec addRawVector(boolean masked) {
344343
builder.addStatement("state.seen(true)");
345344
}
346345

347-
builder.beginControlFlow("for (int i = 0; i < $L.getPositionCount(); i++)", aggParams.getFirst().vectorName());
346+
builder.beginControlFlow(
347+
"for (int valuesPosition = 0; valuesPosition < $L.getPositionCount(); valuesPosition++)",
348+
aggParams.getFirst().vectorName()
349+
);
348350
{
349351
if (masked) {
350-
builder.beginControlFlow("if (mask.getBoolean(i) == false)").addStatement("continue").endControlFlow();
352+
builder.beginControlFlow("if (mask.getBoolean(valuesPosition) == false)").addStatement("continue").endControlFlow();
351353
}
352354
for (AggregationParameter p : aggParams) {
353355
p.read(builder, true);
@@ -420,11 +422,14 @@ private MethodSpec addRawBlock(boolean masked) {
420422
return builder.build();
421423
}
422424

423-
private MethodSpec.Builder initAddRaw(boolean isVector, boolean masked) {
424-
MethodSpec.Builder builder = MethodSpec.methodBuilder(isVector ? "addRawVector" : "addRawBlock");
425+
private MethodSpec.Builder initAddRaw(boolean valuesAreVector, boolean masked) {
426+
MethodSpec.Builder builder = MethodSpec.methodBuilder(valuesAreVector ? "addRawVector" : "addRawBlock");
425427
builder.addModifiers(Modifier.PRIVATE);
426428
for (AggregationParameter p : aggParams) {
427-
builder.addParameter(isVector ? vectorType(p.type) : blockType(p.type), isVector ? p.vectorName() : p.blockName());
429+
builder.addParameter(
430+
valuesAreVector ? vectorType(p.type) : blockType(p.type),
431+
valuesAreVector ? p.vectorName() : p.blockName()
432+
);
428433
}
429434
if (masked) {
430435
builder.addParameter(BOOLEAN_VECTOR, "mask");
@@ -440,7 +445,7 @@ private MethodSpec.Builder initAddRaw(boolean isVector, boolean masked) {
440445

441446
private void combineRawInput(MethodSpec.Builder builder) {
442447
TypeName returnType = TypeName.get(combine.getReturnType());
443-
warningsBlock(builder, () -> { invokeCombineRawInput(returnType, builder); });
448+
warningsBlock(builder, () -> invokeCombineRawInput(returnType, builder));
444449
}
445450

446451
private void invokeCombineRawInput(TypeName returnType, MethodSpec.Builder builder) {
@@ -451,9 +456,11 @@ private void invokeCombineRawInput(TypeName returnType, MethodSpec.Builder build
451456
params.add(returnType);
452457
params.add(declarationType);
453458
params.add(returnType);
454-
} else {
459+
} else if (returnType == TypeName.VOID) {
455460
pattern.append("$T.combine(state");
456461
params.add(declarationType);
462+
} else {
463+
throw new IllegalArgumentException("combine must return void or a primitive");
457464
}
458465
for (AggregationParameter p : aggParams) {
459466
pattern.append(", $L");
@@ -753,7 +760,7 @@ public void read(MethodSpec.Builder builder, boolean vector) {
753760
params.add(vector ? vectorName() : blockName());
754761
params.add(readMethod());
755762
if (vector) {
756-
pattern.append("i");
763+
pattern.append("valuesPosition");
757764
} else {
758765
pattern.append("$L");
759766
params.add(offsetName());

x-pack/plugin/esql/compute/gen/src/main/java/org/elasticsearch/compute/gen/GroupingAggregatorImplementer.java

Lines changed: 154 additions & 179 deletions
Large diffs are not rendered by default.

x-pack/plugin/esql/compute/src/main/generated-src/org/elasticsearch/compute/aggregation/FirstOverTimeDoubleAggregator.java

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/compute/src/main/generated-src/org/elasticsearch/compute/aggregation/FirstOverTimeFloatAggregator.java

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/compute/src/main/generated-src/org/elasticsearch/compute/aggregation/FirstOverTimeIntAggregator.java

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/compute/src/main/generated-src/org/elasticsearch/compute/aggregation/FirstOverTimeLongAggregator.java

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/compute/src/main/generated-src/org/elasticsearch/compute/aggregation/LastOverTimeDoubleAggregator.java

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/compute/src/main/generated-src/org/elasticsearch/compute/aggregation/LastOverTimeFloatAggregator.java

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/compute/src/main/generated-src/org/elasticsearch/compute/aggregation/LastOverTimeIntAggregator.java

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/compute/src/main/generated-src/org/elasticsearch/compute/aggregation/LastOverTimeLongAggregator.java

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)