Skip to content

Commit 67f9404

Browse files
authored
SQL: Small code improvements of Pipes & Processors (#40909)
- Remove superfluous methods that are already defined in superclasses. - Improve tests for null folding on conditionals
1 parent 675bf3c commit 67f9404

File tree

5 files changed

+45
-77
lines changed

5 files changed

+45
-77
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/Pipe.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import org.elasticsearch.xpack.sql.expression.Attribute;
1313
import org.elasticsearch.xpack.sql.expression.Expression;
1414
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
15-
import org.elasticsearch.xpack.sql.tree.Source;
1615
import org.elasticsearch.xpack.sql.tree.Node;
16+
import org.elasticsearch.xpack.sql.tree.Source;
1717

1818
import java.util.ArrayList;
1919
import java.util.List;
@@ -53,13 +53,7 @@ public void collectFields(SqlSourceBuilder sourceBuilder) {
5353

5454
@Override
5555
public boolean supportedByAggsOnlyQuery() {
56-
for (Pipe pipe : children()) {
57-
if (pipe.supportedByAggsOnlyQuery()) {
58-
return true;
59-
}
60-
}
61-
62-
return false;
56+
return children().stream().anyMatch(Pipe::supportedByAggsOnlyQuery);
6357
}
6458

6559
public abstract Processor asProcessor();
@@ -83,4 +77,4 @@ public Pipe resolveAttributes(AttributeResolver resolver) {
8377
public interface AttributeResolver {
8478
FieldExtraction resolve(Attribute attribute);
8579
}
86-
}
80+
}

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/conditional/NullIf.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@
88

99
import org.elasticsearch.xpack.sql.expression.Expression;
1010
import org.elasticsearch.xpack.sql.expression.Expressions;
11-
import org.elasticsearch.xpack.sql.expression.Nullability;
1211
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
1312
import org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder;
1413
import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate;
15-
import org.elasticsearch.xpack.sql.tree.Source;
1614
import org.elasticsearch.xpack.sql.tree.NodeInfo;
17-
import org.elasticsearch.xpack.sql.type.DataType;
15+
import org.elasticsearch.xpack.sql.tree.Source;
1816

1917
import java.util.Arrays;
2018
import java.util.List;
@@ -47,21 +45,6 @@ protected TypeResolution resolveType() {
4745
return TypeResolution.TYPE_RESOLVED;
4846
}
4947

50-
@Override
51-
public DataType dataType() {
52-
return dataType;
53-
}
54-
55-
@Override
56-
public boolean foldable() {
57-
return Expressions.foldable(children());
58-
}
59-
60-
@Override
61-
public Nullability nullable() {
62-
return Nullability.UNKNOWN;
63-
}
64-
6548
@Override
6649
public Object fold() {
6750
return NullIfProcessor.apply(children().get(0).fold(), children().get(1).fold());

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/conditional/NullIfProcessor.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,12 @@ public static Object apply(Object leftValue, Object rightValue) {
5959

6060
@Override
6161
public boolean equals(Object o) {
62-
if (this == o) return true;
63-
if (o == null || getClass() != o.getClass()) return false;
62+
if (this == o) {
63+
return true;
64+
}
65+
if (o == null || getClass() != o.getClass()) {
66+
return false;
67+
}
6468
NullIfProcessor that = (NullIfProcessor) o;
6569
return Objects.equals(leftProcessor, that.leftProcessor) &&
6670
Objects.equals(rightProcessor, that.rightProcessor);

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

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,20 @@
55
*/
66
package org.elasticsearch.xpack.sql.expression.predicate.operator.comparison;
77

8-
import org.elasticsearch.xpack.sql.capabilities.Resolvables;
9-
import org.elasticsearch.xpack.sql.execution.search.FieldExtraction;
10-
import org.elasticsearch.xpack.sql.execution.search.SqlSourceBuilder;
118
import org.elasticsearch.xpack.sql.expression.Expression;
9+
import org.elasticsearch.xpack.sql.expression.gen.pipeline.MultiPipe;
1210
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
13-
import org.elasticsearch.xpack.sql.tree.Source;
11+
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
1412
import org.elasticsearch.xpack.sql.tree.NodeInfo;
13+
import org.elasticsearch.xpack.sql.tree.Source;
1514

16-
import java.util.ArrayList;
1715
import java.util.List;
1816
import java.util.Objects;
19-
import java.util.stream.Collectors;
2017

21-
public class InPipe extends Pipe {
22-
23-
private List<Pipe> pipes;
18+
public class InPipe extends MultiPipe {
2419

2520
public InPipe(Source source, Expression expression, List<Pipe> pipes) {
2621
super(source, expression, pipes);
27-
this.pipes = pipes;
2822
}
2923

3024
@Override
@@ -37,36 +31,12 @@ public final Pipe replaceChildren(List<Pipe> newChildren) {
3731

3832
@Override
3933
protected NodeInfo<InPipe> info() {
40-
return NodeInfo.create(this, InPipe::new, expression(), pipes);
41-
}
42-
43-
@Override
44-
public boolean supportedByAggsOnlyQuery() {
45-
return pipes.stream().allMatch(FieldExtraction::supportedByAggsOnlyQuery);
46-
}
47-
48-
@Override
49-
public final Pipe resolveAttributes(AttributeResolver resolver) {
50-
List<Pipe> newPipes = new ArrayList<>(pipes.size());
51-
for (Pipe p : pipes) {
52-
newPipes.add(p.resolveAttributes(resolver));
53-
}
54-
return replaceChildren(newPipes);
55-
}
56-
57-
@Override
58-
public boolean resolved() {
59-
return Resolvables.resolved(pipes);
60-
}
61-
62-
@Override
63-
public final void collectFields(SqlSourceBuilder sourceBuilder) {
64-
pipes.forEach(p -> p.collectFields(sourceBuilder));
34+
return NodeInfo.create(this, InPipe::new, expression(), children());
6535
}
6636

6737
@Override
6838
public int hashCode() {
69-
return Objects.hash(pipes);
39+
return Objects.hash(children());
7040
}
7141

7242
@Override
@@ -80,11 +50,11 @@ public boolean equals(Object obj) {
8050
}
8151

8252
InPipe other = (InPipe) obj;
83-
return Objects.equals(pipes, other.pipes);
53+
return Objects.equals(children(), other.children());
8454
}
8555

8656
@Override
87-
public InProcessor asProcessor() {
88-
return new InProcessor(pipes.stream().map(Pipe::asProcessor).collect(Collectors.toList()));
57+
public InProcessor asProcessor(List<Processor> processors) {
58+
return new InProcessor(processors);
8959
}
9060
}

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

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@
4343
import org.elasticsearch.xpack.sql.expression.function.scalar.string.Repeat;
4444
import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator;
4545
import org.elasticsearch.xpack.sql.expression.predicate.Range;
46+
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ArbitraryConditionalFunction;
4647
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Coalesce;
48+
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ConditionalFunction;
4749
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Greatest;
4850
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfNull;
4951
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Least;
@@ -97,6 +99,7 @@
9799
import org.elasticsearch.xpack.sql.util.CollectionUtils;
98100
import org.elasticsearch.xpack.sql.util.StringUtils;
99101

102+
import java.lang.reflect.Constructor;
100103
import java.util.Arrays;
101104
import java.util.Collections;
102105
import java.util.List;
@@ -445,18 +448,32 @@ public void testNullFoldingDoesNotApplyOnLogicalExpressions() {
445448
assertEquals(and, rule.rule(and));
446449
}
447450

448-
public void testNullFoldingDoesNotApplyOnConditionals() {
451+
@SuppressWarnings("unchecked")
452+
public void testNullFoldingDoesNotApplyOnConditionals() throws Exception {
449453
FoldNull rule = new FoldNull();
450454

451-
Coalesce coalesce = new Coalesce(EMPTY, Arrays.asList(Literal.NULL, ONE, TWO));
452-
assertEquals(coalesce, rule.rule(coalesce));
453-
coalesce = new Coalesce(EMPTY, Arrays.asList(Literal.NULL, NULL, NULL));
454-
assertEquals(coalesce, rule.rule(coalesce));
455+
Class<ConditionalFunction> clazz =
456+
(Class<ConditionalFunction>) randomFrom(IfNull.class, NullIf.class);
457+
Constructor<ConditionalFunction> ctor = clazz.getConstructor(Source.class, Expression.class, Expression.class);
458+
ConditionalFunction conditionalFunction = ctor.newInstance(EMPTY, Literal.NULL, ONE);
459+
assertEquals(conditionalFunction, rule.rule(conditionalFunction));
460+
conditionalFunction = ctor.newInstance(EMPTY, ONE, Literal.NULL);
461+
assertEquals(conditionalFunction, rule.rule(conditionalFunction));
462+
conditionalFunction = ctor.newInstance(EMPTY, Literal.NULL, Literal.NULL);
463+
assertEquals(conditionalFunction, rule.rule(conditionalFunction));
464+
}
465+
466+
@SuppressWarnings("unchecked")
467+
public void testNullFoldingDoesNotApplyOnArbitraryConditionals() throws Exception {
468+
FoldNull rule = new FoldNull();
455469

456-
Greatest greatest = new Greatest(EMPTY, Arrays.asList(Literal.NULL, ONE, TWO));
457-
assertEquals(greatest, rule.rule(greatest));
458-
greatest = new Greatest(EMPTY, Arrays.asList(Literal.NULL, ONE, TWO));
459-
assertEquals(greatest, rule.rule(greatest));
470+
Class<ArbitraryConditionalFunction> clazz =
471+
(Class<ArbitraryConditionalFunction>) randomFrom(Coalesce.class, Greatest.class, Least.class);
472+
Constructor<ArbitraryConditionalFunction> ctor = clazz.getConstructor(Source.class, List.class);
473+
ArbitraryConditionalFunction conditionalFunction = ctor.newInstance(EMPTY, Arrays.asList(Literal.NULL, ONE, TWO));
474+
assertEquals(conditionalFunction, rule.rule(conditionalFunction));
475+
conditionalFunction = ctor.newInstance(EMPTY, Arrays.asList(Literal.NULL, NULL, NULL));
476+
assertEquals(conditionalFunction, rule.rule(conditionalFunction));
460477
}
461478

462479
public void testSimplifyCoalesceNulls() {

0 commit comments

Comments
 (0)