Skip to content

Commit 38c5141

Browse files
committed
ESQL: Move some mappers into their expressions (elastic#128342)
This moves half of the remaining centralized expression mapper logic into the individual expressions. This is how all but 3 of the remaining expressions work. Let's try and be fully consistent.
1 parent 10d873b commit 38c5141

File tree

6 files changed

+138
-138
lines changed

6 files changed

+138
-138
lines changed
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/EvalMapper.java

Lines changed: 1 addition & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import org.elasticsearch.compute.data.Page;
1818
import org.elasticsearch.compute.data.Vector;
1919
import org.elasticsearch.compute.operator.DriverContext;
20-
import org.elasticsearch.compute.operator.EvalOperator;
2120
import org.elasticsearch.compute.operator.EvalOperator.ExpressionEvaluator;
2221
import org.elasticsearch.core.Releasables;
2322
import org.elasticsearch.xpack.esql.core.QlIllegalArgumentException;
@@ -28,9 +27,6 @@
2827
import org.elasticsearch.xpack.esql.evaluator.mapper.EvaluatorMapper;
2928
import org.elasticsearch.xpack.esql.evaluator.mapper.ExpressionMapper;
3029
import org.elasticsearch.xpack.esql.expression.predicate.logical.BinaryLogic;
31-
import org.elasticsearch.xpack.esql.expression.predicate.logical.Not;
32-
import org.elasticsearch.xpack.esql.expression.predicate.nulls.IsNotNull;
33-
import org.elasticsearch.xpack.esql.expression.predicate.nulls.IsNull;
3430
import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.InsensitiveEqualsMapper;
3531
import org.elasticsearch.xpack.esql.planner.EsPhysicalOperationProviders.ShardContext;
3632
import org.elasticsearch.xpack.esql.planner.Layout;
@@ -42,11 +38,8 @@ public final class EvalMapper {
4238
private static final List<ExpressionMapper<?>> MAPPERS = List.of(
4339
new InsensitiveEqualsMapper(),
4440
new BooleanLogic(),
45-
new Nots(),
4641
new Attributes(),
47-
new Literals(),
48-
new IsNotNulls(),
49-
new IsNulls()
42+
new Literals()
5043
);
5144

5245
private EvalMapper() {}
@@ -174,18 +167,6 @@ public void close() {
174167
}
175168
}
176169

177-
static class Nots extends ExpressionMapper<Not> {
178-
@Override
179-
public ExpressionEvaluator.Factory map(FoldContext foldCtx, Not not, Layout layout, List<ShardContext> shardContexts) {
180-
var expEval = toEvaluator(foldCtx, not.field(), layout, shardContexts);
181-
return dvrCtx -> new org.elasticsearch.xpack.esql.evaluator.predicate.operator.logical.NotEvaluator(
182-
not.source(),
183-
expEval.get(dvrCtx),
184-
dvrCtx
185-
);
186-
}
187-
}
188-
189170
static class Attributes extends ExpressionMapper<Attribute> {
190171
@Override
191172
public ExpressionEvaluator.Factory map(FoldContext foldCtx, Attribute attr, Layout layout, List<ShardContext> shardContexts) {
@@ -276,101 +257,4 @@ private static Block block(Literal lit, BlockFactory blockFactory, int positions
276257
return BlockUtils.constantBlock(blockFactory, value, positions);
277258
}
278259
}
279-
280-
static class IsNulls extends ExpressionMapper<IsNull> {
281-
282-
@Override
283-
public ExpressionEvaluator.Factory map(FoldContext foldCtx, IsNull isNull, Layout layout, List<ShardContext> shardContexts) {
284-
var field = toEvaluator(foldCtx, isNull.field(), layout, shardContexts);
285-
return new IsNullEvaluatorFactory(field);
286-
}
287-
288-
record IsNullEvaluatorFactory(EvalOperator.ExpressionEvaluator.Factory field) implements ExpressionEvaluator.Factory {
289-
@Override
290-
public ExpressionEvaluator get(DriverContext context) {
291-
return new IsNullEvaluator(context, field.get(context));
292-
}
293-
294-
@Override
295-
public String toString() {
296-
return "IsNullEvaluator[field=" + field + ']';
297-
}
298-
}
299-
300-
record IsNullEvaluator(DriverContext driverContext, EvalOperator.ExpressionEvaluator field) implements ExpressionEvaluator {
301-
@Override
302-
public Block eval(Page page) {
303-
try (Block fieldBlock = field.eval(page)) {
304-
if (fieldBlock.asVector() != null) {
305-
return driverContext.blockFactory().newConstantBooleanBlockWith(false, page.getPositionCount());
306-
}
307-
try (var builder = driverContext.blockFactory().newBooleanVectorFixedBuilder(page.getPositionCount())) {
308-
for (int p = 0; p < page.getPositionCount(); p++) {
309-
builder.appendBoolean(p, fieldBlock.isNull(p));
310-
}
311-
return builder.build().asBlock();
312-
}
313-
}
314-
}
315-
316-
@Override
317-
public void close() {
318-
Releasables.closeExpectNoException(field);
319-
}
320-
321-
@Override
322-
public String toString() {
323-
return "IsNullEvaluator[field=" + field + ']';
324-
}
325-
}
326-
}
327-
328-
static class IsNotNulls extends ExpressionMapper<IsNotNull> {
329-
330-
@Override
331-
public ExpressionEvaluator.Factory map(FoldContext foldCtx, IsNotNull isNotNull, Layout layout, List<ShardContext> shardContexts) {
332-
return new IsNotNullEvaluatorFactory(toEvaluator(foldCtx, isNotNull.field(), layout, shardContexts));
333-
}
334-
335-
record IsNotNullEvaluatorFactory(EvalOperator.ExpressionEvaluator.Factory field) implements ExpressionEvaluator.Factory {
336-
@Override
337-
public ExpressionEvaluator get(DriverContext context) {
338-
return new IsNotNullEvaluator(context, field.get(context));
339-
}
340-
341-
@Override
342-
public String toString() {
343-
return "IsNotNullEvaluator[field=" + field + ']';
344-
}
345-
}
346-
347-
record IsNotNullEvaluator(DriverContext driverContext, EvalOperator.ExpressionEvaluator field)
348-
implements
349-
EvalOperator.ExpressionEvaluator {
350-
@Override
351-
public Block eval(Page page) {
352-
try (Block fieldBlock = field.eval(page)) {
353-
if (fieldBlock.asVector() != null) {
354-
return driverContext.blockFactory().newConstantBooleanBlockWith(true, page.getPositionCount());
355-
}
356-
try (var builder = driverContext.blockFactory().newBooleanVectorFixedBuilder(page.getPositionCount())) {
357-
for (int p = 0; p < page.getPositionCount(); p++) {
358-
builder.appendBoolean(p, fieldBlock.isNull(p) == false);
359-
}
360-
return builder.build().asBlock();
361-
}
362-
}
363-
}
364-
365-
@Override
366-
public void close() {
367-
Releasables.closeExpectNoException(field);
368-
}
369-
370-
@Override
371-
public String toString() {
372-
return "IsNotNullEvaluator[field=" + field + ']';
373-
}
374-
}
375-
}
376260
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/predicate/operator/logical/Not.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/predicate/logical/Not.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
1010
import org.elasticsearch.common.io.stream.StreamInput;
11+
import org.elasticsearch.compute.ann.Evaluator;
12+
import org.elasticsearch.compute.operator.DriverContext;
13+
import org.elasticsearch.compute.operator.EvalOperator;
1114
import org.elasticsearch.xpack.esql.capabilities.TranslationAware;
1215
import org.elasticsearch.xpack.esql.core.QlIllegalArgumentException;
1316
import org.elasticsearch.xpack.esql.core.expression.Expression;
@@ -18,6 +21,7 @@
1821
import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
1922
import org.elasticsearch.xpack.esql.core.tree.Source;
2023
import org.elasticsearch.xpack.esql.core.type.DataType;
24+
import org.elasticsearch.xpack.esql.evaluator.mapper.EvaluatorMapper;
2125
import org.elasticsearch.xpack.esql.optimizer.rules.physical.local.LucenePushdownPredicates;
2226
import org.elasticsearch.xpack.esql.planner.TranslatorHandler;
2327

@@ -26,7 +30,7 @@
2630
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT;
2731
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isBoolean;
2832

29-
public class Not extends UnaryScalarFunction implements Negatable<Expression>, TranslationAware {
33+
public class Not extends UnaryScalarFunction implements EvaluatorMapper, Negatable<Expression>, TranslationAware {
3034
public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Not", Not::new);
3135

3236
public Not(Source source, Expression child) {
@@ -77,6 +81,16 @@ private static Boolean apply(Object input) {
7781
return ((Boolean) input).booleanValue() ? Boolean.FALSE : Boolean.TRUE;
7882
}
7983

84+
@Override
85+
public EvalOperator.ExpressionEvaluator.Factory toEvaluator(ToEvaluator toEvaluator) {
86+
return new NotEvaluatorFactory(source(), toEvaluator.apply(field()));
87+
}
88+
89+
@Evaluator
90+
static boolean process(boolean v) {
91+
return false == v;
92+
}
93+
8094
@Override
8195
protected Expression canonicalize() {
8296
if (field() instanceof Negatable) {
@@ -108,4 +122,18 @@ public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
108122
public Query asQuery(LucenePushdownPredicates pushdownPredicates, TranslatorHandler handler) {
109123
return handler.asQuery(pushdownPredicates, field()).negate(source());
110124
}
125+
126+
record NotEvaluatorFactory(Source source, EvalOperator.ExpressionEvaluator.Factory field)
127+
implements
128+
EvalOperator.ExpressionEvaluator.Factory {
129+
@Override
130+
public EvalOperator.ExpressionEvaluator get(DriverContext context) {
131+
return new NotEvaluator(source, field.get(context), context);
132+
}
133+
134+
@Override
135+
public String toString() {
136+
return "NotEvaluator[field=" + field + ']';
137+
}
138+
}
111139
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/predicate/nulls/IsNotNull.java

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88

99
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
1010
import org.elasticsearch.common.io.stream.StreamInput;
11+
import org.elasticsearch.compute.data.Block;
12+
import org.elasticsearch.compute.data.Page;
13+
import org.elasticsearch.compute.operator.DriverContext;
14+
import org.elasticsearch.compute.operator.EvalOperator;
15+
import org.elasticsearch.core.Releasables;
1116
import org.elasticsearch.xpack.esql.capabilities.TranslationAware;
1217
import org.elasticsearch.xpack.esql.core.expression.Expression;
1318
import org.elasticsearch.xpack.esql.core.expression.FoldContext;
@@ -19,12 +24,13 @@
1924
import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
2025
import org.elasticsearch.xpack.esql.core.tree.Source;
2126
import org.elasticsearch.xpack.esql.core.type.DataType;
27+
import org.elasticsearch.xpack.esql.evaluator.mapper.EvaluatorMapper;
2228
import org.elasticsearch.xpack.esql.optimizer.rules.physical.local.LucenePushdownPredicates;
2329
import org.elasticsearch.xpack.esql.planner.TranslatorHandler;
2430

2531
import java.io.IOException;
2632

27-
public class IsNotNull extends UnaryScalarFunction implements Negatable<UnaryScalarFunction>, TranslationAware {
33+
public class IsNotNull extends UnaryScalarFunction implements EvaluatorMapper, Negatable<UnaryScalarFunction>, TranslationAware {
2834
public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(
2935
Expression.class,
3036
"IsNotNull",
@@ -59,6 +65,12 @@ public Object fold(FoldContext ctx) {
5965
return DataType.isNull(field().dataType()) == false && field().fold(ctx) != null;
6066
}
6167

68+
@Override
69+
public EvalOperator.ExpressionEvaluator.Factory toEvaluator(ToEvaluator toEvaluator) {
70+
return new IsNotNullEvaluatorFactory(toEvaluator.apply(field()));
71+
72+
}
73+
6274
@Override
6375
public Nullability nullable() {
6476
return Nullability.FALSE;
@@ -83,4 +95,45 @@ public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
8395
public Query asQuery(LucenePushdownPredicates pushdownPredicates, TranslatorHandler handler) {
8496
return new ExistsQuery(source(), handler.nameOf(field()));
8597
}
98+
99+
record IsNotNullEvaluatorFactory(EvalOperator.ExpressionEvaluator.Factory field) implements EvalOperator.ExpressionEvaluator.Factory {
100+
@Override
101+
public EvalOperator.ExpressionEvaluator get(DriverContext context) {
102+
return new IsNotNullEvaluator(context, field.get(context));
103+
}
104+
105+
@Override
106+
public String toString() {
107+
return "IsNotNullEvaluator[field=" + field + ']';
108+
}
109+
}
110+
111+
record IsNotNullEvaluator(DriverContext driverContext, EvalOperator.ExpressionEvaluator field)
112+
implements
113+
EvalOperator.ExpressionEvaluator {
114+
@Override
115+
public Block eval(Page page) {
116+
try (Block fieldBlock = field.eval(page)) {
117+
if (fieldBlock.asVector() != null) {
118+
return driverContext.blockFactory().newConstantBooleanBlockWith(true, page.getPositionCount());
119+
}
120+
try (var builder = driverContext.blockFactory().newBooleanVectorFixedBuilder(page.getPositionCount())) {
121+
for (int p = 0; p < page.getPositionCount(); p++) {
122+
builder.appendBoolean(p, fieldBlock.isNull(p) == false);
123+
}
124+
return builder.build().asBlock();
125+
}
126+
}
127+
}
128+
129+
@Override
130+
public void close() {
131+
Releasables.closeExpectNoException(field);
132+
}
133+
134+
@Override
135+
public String toString() {
136+
return "IsNotNullEvaluator[field=" + field + ']';
137+
}
138+
}
86139
}

0 commit comments

Comments
 (0)