Skip to content

Commit 78247a6

Browse files
committed
ESQL: Reenable text == pushdown
Reenables `text ==` pushdown and adds support for `text !=` pushdown.
1 parent 203861b commit 78247a6

File tree

27 files changed

+308
-99
lines changed

27 files changed

+308
-99
lines changed

x-pack/plugin/esql/qa/testFixtures/src/main/resources/data/mv_text.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
2023-10-23T13:55:01.544Z,Connected to 10.1.0.1
44
2023-10-23T13:55:01.545Z,[Connected to 10.1.0.1, More than one hundred characters long so it isn't indexed by the sub keyword field with ignore_above:100]
55
2023-10-23T13:55:01.546Z,More than one hundred characters long so it isn't indexed by the sub keyword field with ignore_above:100
6+
2023-10-23T13:55:01.547Z,[More than one hundred characters long so it isn't indexed by the sub keyword field with ignore_above:100,Second than one hundred characters long so it isn't indexed by the sub keyword field with ignore_above:100]

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/capabilities/TranslationAware.java

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,14 @@ public interface TranslationAware {
2020
* Indicates whether the expression can be translated or not.
2121
* Usually checks whether the expression arguments are actual fields that exist in Lucene.
2222
*/
23-
boolean translatable(LucenePushdownPredicates pushdownPredicates);
23+
Translatable translatable(LucenePushdownPredicates pushdownPredicates);
24+
25+
static TranslationAware.Translatable translatable(Expression exp, LucenePushdownPredicates lucenePushdownPredicates) {
26+
if (exp instanceof TranslationAware aware) {
27+
return aware.translatable(lucenePushdownPredicates);
28+
}
29+
return TranslationAware.Translatable.NO;
30+
}
2431

2532
/**
2633
* Translates the implementing expression into a Query.
@@ -42,4 +49,56 @@ interface SingleValueTranslationAware extends TranslationAware {
4249
*/
4350
Expression singleValueField();
4451
}
52+
53+
enum Translatable {
54+
NO(FinishedTranslatable.NO),
55+
YES(FinishedTranslatable.YES),
56+
RECHECK(FinishedTranslatable.RECHECK),
57+
YES_BUT_RECHECK_NEGATED(FinishedTranslatable.YES);
58+
59+
private final FinishedTranslatable finish;
60+
61+
Translatable(FinishedTranslatable finish) {
62+
this.finish = finish;
63+
}
64+
65+
public FinishedTranslatable finish() {
66+
return finish;
67+
}
68+
69+
public Translatable negate() {
70+
if (this == YES_BUT_RECHECK_NEGATED) {
71+
return RECHECK;
72+
}
73+
return this;
74+
}
75+
76+
public Translatable and(Translatable rhs) {
77+
return switch (this) {
78+
case NO -> NO;
79+
case YES -> switch (rhs) {
80+
case NO -> NO;
81+
case YES -> YES;
82+
case RECHECK -> RECHECK;
83+
case YES_BUT_RECHECK_NEGATED -> YES_BUT_RECHECK_NEGATED;
84+
};
85+
case RECHECK -> switch (rhs) {
86+
case NO -> NO;
87+
case YES, RECHECK, YES_BUT_RECHECK_NEGATED -> RECHECK;
88+
};
89+
case YES_BUT_RECHECK_NEGATED -> switch (rhs) {
90+
case NO -> NO;
91+
case YES, YES_BUT_RECHECK_NEGATED -> YES_BUT_RECHECK_NEGATED;
92+
case RECHECK -> RECHECK;
93+
};
94+
};
95+
}
96+
97+
}
98+
99+
enum FinishedTranslatable {
100+
YES,
101+
NO,
102+
RECHECK;
103+
}
45104
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,9 @@ public boolean equals(Object obj) {
156156
}
157157

158158
@Override
159-
public boolean translatable(LucenePushdownPredicates pushdownPredicates) {
159+
public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
160160
// In isolation, full text functions are pushable to source. We check if there are no disjunctions in Or conditions
161-
return true;
161+
return Translatable.YES;
162162
}
163163

164164
@Override

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/ip/CIDRMatch.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ protected NodeInfo<? extends Expression> info() {
179179
}
180180

181181
@Override
182-
public boolean translatable(LucenePushdownPredicates pushdownPredicates) {
183-
return pushdownPredicates.isPushableFieldAttribute(ipField) && Expressions.foldable(matches);
182+
public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
183+
return pushdownPredicates.isPushableFieldAttribute(ipField) && Expressions.foldable(matches) ? Translatable.YES : Translatable.NO;
184184
}
185185

186186
@Override

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/spatial/BinarySpatialFunction.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.elasticsearch.common.io.stream.StreamOutput;
1414
import org.elasticsearch.geometry.Geometry;
1515
import org.elasticsearch.lucene.spatial.CoordinateEncoder;
16+
import org.elasticsearch.xpack.esql.capabilities.TranslationAware;
1617
import org.elasticsearch.xpack.esql.core.expression.Expression;
1718
import org.elasticsearch.xpack.esql.core.expression.FieldAttribute;
1819
import org.elasticsearch.xpack.esql.core.expression.TypeResolutions;
@@ -273,12 +274,14 @@ protected Geometry fromBytesRef(BytesRef bytesRef) {
273274
/**
274275
* Push-down to Lucene is only possible if one field is an indexed spatial field, and the other is a constant spatial or string column.
275276
*/
276-
public boolean translatable(LucenePushdownPredicates pushdownPredicates) {
277+
public TranslationAware.Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
277278
// The use of foldable here instead of SpatialEvaluatorFieldKey.isConstant is intentional to match the behavior of the
278279
// Lucene pushdown code in EsqlTranslationHandler::SpatialRelatesTranslator
279280
// We could enhance both places to support ReferenceAttributes that refer to constants, but that is a larger change
280281
return isPushableSpatialAttribute(left(), pushdownPredicates) && right().foldable()
281-
|| isPushableSpatialAttribute(right(), pushdownPredicates) && left().foldable();
282+
|| isPushableSpatialAttribute(right(), pushdownPredicates) && left().foldable()
283+
? TranslationAware.Translatable.YES
284+
: TranslationAware.Translatable.NO;
282285

283286
}
284287

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/spatial/SpatialRelatesFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ protected void processPointDocValuesAndSource(
181181
}
182182

183183
@Override
184-
public boolean translatable(LucenePushdownPredicates pushdownPredicates) {
184+
public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
185185
return super.translatable(pushdownPredicates); // only for the explicit Override, as only this subclass implements TranslationAware
186186
}
187187

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/EndsWith.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ public ExpressionEvaluator.Factory toEvaluator(ToEvaluator toEvaluator) {
139139
}
140140

141141
@Override
142-
public boolean translatable(LucenePushdownPredicates pushdownPredicates) {
143-
return pushdownPredicates.isPushableAttribute(str) && suffix.foldable();
142+
public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
143+
return pushdownPredicates.isPushableAttribute(str) && suffix.foldable() ? Translatable.YES : Translatable.NO;
144144
}
145145

146146
@Override

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/RLike.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ public EvalOperator.ExpressionEvaluator.Factory toEvaluator(ToEvaluator toEvalua
107107
}
108108

109109
@Override
110-
public boolean translatable(LucenePushdownPredicates pushdownPredicates) {
111-
return pushdownPredicates.isPushableFieldAttribute(field());
110+
public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
111+
return pushdownPredicates.isPushableFieldAttribute(field()) ? Translatable.YES : Translatable.NO;
112112
}
113113

114114
@Override

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/StartsWith.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ public ExpressionEvaluator.Factory toEvaluator(ToEvaluator toEvaluator) {
136136
}
137137

138138
@Override
139-
public boolean translatable(LucenePushdownPredicates pushdownPredicates) {
140-
return pushdownPredicates.isPushableAttribute(str) && prefix.foldable();
139+
public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
140+
return pushdownPredicates.isPushableAttribute(str) && prefix.foldable() ? Translatable.YES : Translatable.NO;
141141
}
142142

143143
@Override

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/WildcardLike.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ public EvalOperator.ExpressionEvaluator.Factory toEvaluator(ToEvaluator toEvalua
119119
}
120120

121121
@Override
122-
public boolean translatable(LucenePushdownPredicates pushdownPredicates) {
123-
return pushdownPredicates.isPushableAttribute(field());
122+
public Translatable translatable(LucenePushdownPredicates pushdownPredicates) {
123+
return pushdownPredicates.isPushableAttribute(field()) ? Translatable.YES : Translatable.NO;
124124
}
125125

126126
@Override

0 commit comments

Comments
 (0)