Skip to content

Commit c94aeef

Browse files
Marios Trivyzascostin
authored andcommitted
SQL: Improve painless script generated from IN (#35055)
Replace standard `||` and `==` painless operators with new `in` method introduced in `InternalSqlScriptUtils`. This allows the list of values to become a script variable which is replaced each time with the list of values provided by the user. Move In to the same package as InPipe & InProcessor Follow up to #34750 Co-authored-by: Costin Leau <[email protected]>
1 parent e350f0a commit c94aeef

File tree

19 files changed

+79
-81
lines changed

19 files changed

+79
-81
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Verifier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import org.elasticsearch.xpack.sql.expression.function.Functions;
2020
import org.elasticsearch.xpack.sql.expression.function.Score;
2121
import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction;
22-
import org.elasticsearch.xpack.sql.expression.predicate.In;
22+
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.In;
2323
import org.elasticsearch.xpack.sql.plan.logical.Aggregate;
2424
import org.elasticsearch.xpack.sql.plan.logical.Distinct;
2525
import org.elasticsearch.xpack.sql.plan.logical.Filter;

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/Processors.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,12 @@ public static List<NamedWriteableRegistry.Entry> getNamedWriteables() {
8888
entries.add(new Entry(Processor.class, SubstringFunctionProcessor.NAME, SubstringFunctionProcessor::new));
8989
return entries;
9090
}
91-
}
91+
92+
public static List<Object> process(List<Processor> processors, Object input) {
93+
List<Object> values = new ArrayList<>(processors.size());
94+
for (Processor p : processors) {
95+
values.add(p.process(input));
96+
}
97+
return values;
98+
}
99+
}

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/whitelist/InternalSqlScriptUtils.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@
2727
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.BinaryArithmeticProcessor.BinaryArithmeticOperation;
2828
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.UnaryArithmeticProcessor.UnaryArithmeticOperation;
2929
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.BinaryComparisonProcessor.BinaryComparisonOperation;
30+
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.InProcessor;
3031
import org.elasticsearch.xpack.sql.expression.predicate.regex.RegexProcessor.RegexOperation;
3132
import org.elasticsearch.xpack.sql.util.StringUtils;
3233

3334
import java.time.ZonedDateTime;
35+
import java.util.List;
3436
import java.util.Map;
3537

3638
/**
@@ -113,6 +115,10 @@ public static Boolean notNull(Object expression) {
113115
return IsNotNullProcessor.apply(expression);
114116
}
115117

118+
public static Boolean in(Object value, List<Object> values) {
119+
return InProcessor.apply(value, values);
120+
}
121+
116122
//
117123
// Regex
118124
//
@@ -375,4 +381,4 @@ public static String substring(String s, Number start, Number length) {
375381
public static String ucase(String s) {
376382
return (String) StringOperation.UCASE.apply(s);
377383
}
378-
}
384+
}

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/script/Scripts.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,4 @@ public static ScriptTemplate binaryMethod(String methodName, ScriptTemplate left
8787
.build(),
8888
dataType);
8989
}
90-
}
90+
}

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java renamed to x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/In.java

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,17 @@
33
* or more contributor license agreements. Licensed under the Elastic License;
44
* you may not use this file except in compliance with the Elastic License.
55
*/
6-
package org.elasticsearch.xpack.sql.expression.predicate;
6+
package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison;
77

88
import org.elasticsearch.xpack.sql.expression.Attribute;
99
import org.elasticsearch.xpack.sql.expression.Expression;
1010
import org.elasticsearch.xpack.sql.expression.Expressions;
11+
import org.elasticsearch.xpack.sql.expression.Foldables;
1112
import org.elasticsearch.xpack.sql.expression.NamedExpression;
1213
import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunctionAttribute;
1314
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
14-
import org.elasticsearch.xpack.sql.expression.gen.script.Params;
15-
import org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder;
1615
import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate;
1716
import org.elasticsearch.xpack.sql.expression.gen.script.ScriptWeaver;
18-
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Comparisons;
19-
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.InPipe;
2017
import org.elasticsearch.xpack.sql.tree.Location;
2118
import org.elasticsearch.xpack.sql.tree.NodeInfo;
2219
import org.elasticsearch.xpack.sql.type.DataType;
@@ -30,7 +27,6 @@
3027
import java.util.StringJoiner;
3128
import java.util.stream.Collectors;
3229

33-
import static java.lang.String.format;
3430
import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder;
3531

3632
public class In extends NamedExpression implements ScriptWeaver {
@@ -84,24 +80,12 @@ public boolean foldable() {
8480

8581
@Override
8682
public Boolean fold() {
87-
if (value.dataType() == DataType.NULL) {
83+
// Optimization for early return and Query folding to LocalExec
84+
if (value.dataType() == DataType.NULL ||
85+
list.size() == 1 && list.get(0).dataType() == DataType.NULL) {
8886
return null;
8987
}
90-
if (list.size() == 1 && list.get(0).dataType() == DataType.NULL) {
91-
return false;
92-
}
93-
94-
Object foldedLeftValue = value.fold();
95-
Boolean result = false;
96-
for (Expression rightValue : list) {
97-
Boolean compResult = Comparisons.eq(foldedLeftValue, rightValue.fold());
98-
if (compResult == null) {
99-
result = null;
100-
} else if (compResult) {
101-
return true;
102-
}
103-
}
104-
return result;
88+
return InProcessor.apply(value.fold(), Foldables.valuesOf(list, value.dataType()));
10589
}
10690

10791
@Override
@@ -122,34 +106,18 @@ public Attribute toAttribute() {
122106

123107
@Override
124108
public ScriptTemplate asScript() {
125-
StringJoiner sj = new StringJoiner(" || ");
126109
ScriptTemplate leftScript = asScript(value);
127-
List<Params> rightParams = new ArrayList<>();
128-
String scriptPrefix = leftScript + "==";
129-
LinkedHashSet<Object> values = list.stream().map(Expression::fold).collect(Collectors.toCollection(LinkedHashSet::new));
130-
for (Object valueFromList : values) {
131-
// if checked against null => false
132-
if (valueFromList != null) {
133-
if (valueFromList instanceof Expression) {
134-
ScriptTemplate rightScript = asScript((Expression) valueFromList);
135-
sj.add(scriptPrefix + rightScript.template());
136-
rightParams.add(rightScript.params());
137-
} else {
138-
if (valueFromList instanceof String) {
139-
sj.add(scriptPrefix + '"' + valueFromList + '"');
140-
} else {
141-
sj.add(scriptPrefix + valueFromList.toString());
142-
}
143-
}
144-
}
145-
}
146-
147-
ParamsBuilder paramsBuilder = paramsBuilder().script(leftScript.params());
148-
for (Params p : rightParams) {
149-
paramsBuilder = paramsBuilder.script(p);
150-
}
151-
152-
return new ScriptTemplate(format(Locale.ROOT, "%s", sj.toString()), paramsBuilder.build(), dataType());
110+
// remove duplicates
111+
List<Object> values = new ArrayList<>(new LinkedHashSet<>(Foldables.valuesOf(list, value.dataType())));
112+
values.removeIf(Objects::isNull);
113+
114+
return new ScriptTemplate(
115+
formatTemplate(String.format(Locale.ROOT, "{sql}.in(%s, {})", leftScript.template())),
116+
paramsBuilder()
117+
.script(leftScript.params())
118+
.variable(values)
119+
.build(),
120+
dataType());
153121
}
154122

155123
@Override

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/InProcessor.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import org.elasticsearch.common.io.stream.StreamInput;
99
import org.elasticsearch.common.io.stream.StreamOutput;
10+
import org.elasticsearch.xpack.sql.expression.function.scalar.Processors;
1011
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
1112

1213
import java.io.IOException;
@@ -19,7 +20,7 @@ public class InProcessor implements Processor {
1920

2021
private final List<Processor> processsors;
2122

22-
public InProcessor(List<Processor> processors) {
23+
InProcessor(List<Processor> processors) {
2324
this.processsors = processors;
2425
}
2526

@@ -40,14 +41,17 @@ public final void writeTo(StreamOutput out) throws IOException {
4041
@Override
4142
public Object process(Object input) {
4243
Object leftValue = processsors.get(processsors.size() - 1).process(input);
43-
Boolean result = false;
44+
return apply(leftValue, Processors.process(processsors.subList(0, processsors.size() - 1), leftValue));
45+
}
4446

45-
for (int i = 0; i < processsors.size() - 1; i++) {
46-
Boolean compResult = Comparisons.eq(leftValue, processsors.get(i).process(input));
47+
public static Boolean apply(Object input, List<Object> values) {
48+
Boolean result = Boolean.FALSE;
49+
for (Object v : values) {
50+
Boolean compResult = Comparisons.eq(input, v);
4751
if (compResult == null) {
4852
result = null;
49-
} else if (compResult) {
50-
return true;
53+
} else if (compResult == Boolean.TRUE) {
54+
return Boolean.TRUE;
5155
}
5256
}
5357
return result;

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/optimizer/Optimizer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator;
4040
import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator.Negateable;
4141
import org.elasticsearch.xpack.sql.expression.predicate.BinaryPredicate;
42-
import org.elasticsearch.xpack.sql.expression.predicate.In;
4342
import org.elasticsearch.xpack.sql.expression.predicate.IsNotNull;
4443
import org.elasticsearch.xpack.sql.expression.predicate.Predicates;
4544
import org.elasticsearch.xpack.sql.expression.predicate.Range;
@@ -50,6 +49,7 @@
5049
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Equals;
5150
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThan;
5251
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.GreaterThanOrEqual;
52+
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.In;
5353
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThan;
5454
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.LessThanOrEqual;
5555
import org.elasticsearch.xpack.sql.plan.logical.Aggregate;

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.elasticsearch.xpack.sql.expression.function.Function;
2525
import org.elasticsearch.xpack.sql.expression.function.UnresolvedFunction;
2626
import org.elasticsearch.xpack.sql.expression.function.scalar.Cast;
27-
import org.elasticsearch.xpack.sql.expression.predicate.In;
27+
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.In;
2828
import org.elasticsearch.xpack.sql.expression.predicate.IsNotNull;
2929
import org.elasticsearch.xpack.sql.expression.predicate.Range;
3030
import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MatchQueryPredicate;

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryFolder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
3131
import org.elasticsearch.xpack.sql.expression.gen.pipeline.UnaryPipe;
3232
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
33-
import org.elasticsearch.xpack.sql.expression.predicate.In;
33+
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.In;
3434
import org.elasticsearch.xpack.sql.plan.physical.AggregateExec;
3535
import org.elasticsearch.xpack.sql.plan.physical.EsQueryExec;
3636
import org.elasticsearch.xpack.sql.plan.physical.FilterExec;

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/planner/QueryTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DateTimeFunction;
3232
import org.elasticsearch.xpack.sql.expression.function.scalar.datetime.DateTimeHistogramFunction;
3333
import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate;
34-
import org.elasticsearch.xpack.sql.expression.predicate.In;
34+
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.In;
3535
import org.elasticsearch.xpack.sql.expression.predicate.IsNotNull;
3636
import org.elasticsearch.xpack.sql.expression.predicate.Range;
3737
import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MatchQueryPredicate;

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/query/TermsQuery.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.elasticsearch.xpack.sql.expression.Expression;
1010
import org.elasticsearch.xpack.sql.expression.Foldables;
1111
import org.elasticsearch.xpack.sql.tree.Location;
12-
import org.elasticsearch.xpack.sql.type.DataType;
12+
import org.elasticsearch.xpack.sql.type.DataTypes;
1313

1414
import java.util.Collections;
1515
import java.util.LinkedHashSet;
@@ -27,7 +27,7 @@ public class TermsQuery extends LeafQuery {
2727
public TermsQuery(Location location, String term, List<Expression> values) {
2828
super(location);
2929
this.term = term;
30-
values.removeIf(e -> e.dataType() == DataType.NULL);
30+
values.removeIf(e -> DataTypes.isNull(e.dataType()));
3131
if (values.isEmpty()) {
3232
this.values = Collections.emptySet();
3333
} else {

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataTypeConversion.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ public static Conversion conversionFor(DataType from, DataType to) {
105105
if (to == DataType.NULL) {
106106
return Conversion.NULL;
107107
}
108+
if (from == DataType.NULL) {
109+
return Conversion.NULL;
110+
}
108111

109112
Conversion conversion = conversion(from, to);
110113
if (conversion == null) {

x-pack/plugin/sql/src/main/resources/org/elasticsearch/xpack/sql/plugin/sql_whitelist.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class org.elasticsearch.xpack.sql.expression.function.scalar.whitelist.InternalS
2424
Boolean lte(Object, Object)
2525
Boolean gt(Object, Object)
2626
Boolean gte(Object, Object)
27+
Boolean in(Object, java.util.List)
2728

2829
#
2930
# Logical
@@ -107,4 +108,4 @@ class org.elasticsearch.xpack.sql.expression.function.scalar.whitelist.InternalS
107108
String space(Number)
108109
String substring(String, Number, Number)
109110
String ucase(String)
110-
}
111+
}

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/InProcessorTests.java renamed to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/InProcessorTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
* or more contributor license agreements. Licensed under the Elastic License;
44
* you may not use this file except in compliance with the Elastic License.
55
*/
6-
package org.elasticsearch.xpack.sql.expression.predicate;
6+
package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison;
77

88
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
99
import org.elasticsearch.common.io.stream.Writeable.Reader;
1010
import org.elasticsearch.test.AbstractWireSerializingTestCase;
1111
import org.elasticsearch.xpack.sql.expression.Literal;
1212
import org.elasticsearch.xpack.sql.expression.function.scalar.Processors;
1313
import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor;
14-
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.InProcessor;
1514

1615
import java.util.Arrays;
1716

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/InTests.java renamed to x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/InTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* or more contributor license agreements. Licensed under the Elastic License;
44
* you may not use this file except in compliance with the Elastic License.
55
*/
6-
package org.elasticsearch.xpack.sql.expression.predicate;
6+
package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison;
77

88
import org.elasticsearch.test.ESTestCase;
99
import org.elasticsearch.xpack.sql.expression.Literal;

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/optimizer/OptimizerTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import org.elasticsearch.xpack.sql.expression.function.scalar.string.Ascii;
3636
import org.elasticsearch.xpack.sql.expression.function.scalar.string.Repeat;
3737
import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator;
38-
import org.elasticsearch.xpack.sql.expression.predicate.In;
38+
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.In;
3939
import org.elasticsearch.xpack.sql.expression.predicate.IsNotNull;
4040
import org.elasticsearch.xpack.sql.expression.predicate.Range;
4141
import org.elasticsearch.xpack.sql.expression.predicate.logical.And;
@@ -345,7 +345,7 @@ public void testConstantFoldingIn_LeftValueNotFoldable() {
345345
public void testConstantFoldingIn_RightValueIsNull() {
346346
In in = new In(EMPTY, getFieldAttribute(), Arrays.asList(NULL, NULL));
347347
Literal result= (Literal) new ConstantFolding().rule(in);
348-
assertEquals(false, result.value());
348+
assertNull(result.value());
349349
}
350350

351351
public void testConstantFoldingIn_LeftValueIsNull() {

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/planner/QueryTranslatorTests.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Map;
3434
import java.util.TimeZone;
3535

36+
import static org.hamcrest.Matchers.endsWith;
3637
import static org.hamcrest.core.StringStartsWith.startsWith;
3738

3839
public class QueryTranslatorTests extends ESTestCase {
@@ -208,12 +209,11 @@ public void testTranslateInExpression_WhereClause_Painless() {
208209
QueryTranslation translation = QueryTranslator.toQuery(condition, false);
209210
assertNull(translation.aggFilter);
210211
assertTrue(translation.query instanceof ScriptQuery);
211-
ScriptQuery sq = (ScriptQuery) translation.query;
212-
assertEquals("InternalSqlScriptUtils.nullSafeFilter(" +
213-
"InternalSqlScriptUtils.power(InternalSqlScriptUtils.docValue(doc,params.v0),params.v1)==10 || " +
214-
"InternalSqlScriptUtils.power(InternalSqlScriptUtils.docValue(doc,params.v0),params.v1)==20)",
215-
sq.script().toString());
216-
assertEquals("[{v=int}, {v=2}]", sq.script().params().toString());
212+
ScriptQuery sc = (ScriptQuery) translation.query;
213+
assertEquals("InternalSqlScriptUtils.nullSafeFilter(InternalSqlScriptUtils.in(" +
214+
"InternalSqlScriptUtils.power(InternalSqlScriptUtils.docValue(doc,params.v0),params.v1), params.v2))",
215+
sc.script().toString());
216+
assertEquals("[{v=int}, {v=2}, {v=[10.0, 20.0]}]", sc.script().params().toString());
217217
}
218218

219219
public void testTranslateInExpression_HavingClause_Painless() {
@@ -225,9 +225,10 @@ public void testTranslateInExpression_HavingClause_Painless() {
225225
QueryTranslation translation = QueryTranslator.toQuery(condition, true);
226226
assertNull(translation.query);
227227
AggFilter aggFilter = translation.aggFilter;
228-
assertEquals("InternalSqlScriptUtils.nullSafeFilter(params.a0==10 || params.a0==20)",
228+
assertEquals("InternalSqlScriptUtils.nullSafeFilter(InternalSqlScriptUtils.in(params.a0, params.v0))",
229229
aggFilter.scriptTemplate().toString());
230230
assertThat(aggFilter.scriptTemplate().params().toString(), startsWith("[{a=MAX(int){a->"));
231+
assertThat(aggFilter.scriptTemplate().params().toString(), endsWith(", {v=[10, 20]}]"));
231232
}
232233

233234
public void testTranslateInExpression_HavingClause_PainlessOneArg() {
@@ -239,9 +240,10 @@ public void testTranslateInExpression_HavingClause_PainlessOneArg() {
239240
QueryTranslation translation = QueryTranslator.toQuery(condition, true);
240241
assertNull(translation.query);
241242
AggFilter aggFilter = translation.aggFilter;
242-
assertEquals("InternalSqlScriptUtils.nullSafeFilter(params.a0==10)",
243+
assertEquals("InternalSqlScriptUtils.nullSafeFilter(InternalSqlScriptUtils.in(params.a0, params.v0))",
243244
aggFilter.scriptTemplate().toString());
244245
assertThat(aggFilter.scriptTemplate().params().toString(), startsWith("[{a=MAX(int){a->"));
246+
assertThat(aggFilter.scriptTemplate().params().toString(), endsWith(", {v=[10]}]"));
245247

246248
}
247249

@@ -254,8 +256,9 @@ public void testTranslateInExpression_HavingClause_PainlessAndNullHandling() {
254256
QueryTranslation translation = QueryTranslator.toQuery(condition, true);
255257
assertNull(translation.query);
256258
AggFilter aggFilter = translation.aggFilter;
257-
assertEquals("InternalSqlScriptUtils.nullSafeFilter(params.a0==10 || params.a0==20 || params.a0==30)",
259+
assertEquals("InternalSqlScriptUtils.nullSafeFilter(InternalSqlScriptUtils.in(params.a0, params.v0))",
258260
aggFilter.scriptTemplate().toString());
259261
assertThat(aggFilter.scriptTemplate().params().toString(), startsWith("[{a=MAX(int){a->"));
262+
assertThat(aggFilter.scriptTemplate().params().toString(), endsWith(", {v=[10, 20, 30]}]"));
260263
}
261264
}

0 commit comments

Comments
 (0)