Skip to content

Commit aafa278

Browse files
committed
Fix merge
1 parent a0eaf7b commit aafa278

File tree

10 files changed

+108
-102
lines changed

10 files changed

+108
-102
lines changed

docs/reference/esql/functions/kibana/docs/match_operator.md

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

docs/reference/esql/functions/layout/match.asciidoc

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

docs/reference/esql/functions/types/match_operator.asciidoc

Lines changed: 30 additions & 30 deletions
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/expression/function/fulltext/AbstractMatchFullTextFunction.java

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
package org.elasticsearch.xpack.esql.expression.function.fulltext;
99

1010
import org.apache.lucene.util.BytesRef;
11+
import org.elasticsearch.TransportVersions;
12+
import org.elasticsearch.common.io.stream.StreamOutput;
1113
import org.elasticsearch.index.query.QueryBuilder;
1214
import org.elasticsearch.xpack.esql.capabilities.PostOptimizationVerificationAware;
1315
import org.elasticsearch.xpack.esql.common.Failure;
@@ -25,11 +27,12 @@
2527
import org.elasticsearch.xpack.esql.querydsl.query.MatchQuery;
2628
import org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter;
2729

30+
import java.io.IOException;
2831
import java.util.List;
2932
import java.util.Map;
33+
import java.util.Objects;
3034
import java.util.Set;
3135

32-
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal;
3336
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST;
3437
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND;
3538
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNull;
@@ -98,7 +101,21 @@ public Expression field() {
98101
}
99102

100103
@Override
101-
protected TypeResolution resolveNonQueryParamTypes() {
104+
public void writeTo(StreamOutput out) throws IOException {
105+
source().writeTo(out);
106+
out.writeNamedWriteable(field());
107+
out.writeNamedWriteable(query());
108+
if (out.getTransportVersion().onOrAfter(TransportVersions.ESQL_QUERY_BUILDER_IN_SEARCH_FUNCTIONS)) {
109+
out.writeOptionalNamedWriteable(queryBuilder());
110+
}
111+
}
112+
113+
@Override
114+
protected TypeResolution resolveParams() {
115+
return resolveField().and(resolveQuery()).and(checkParamCompatibility());
116+
}
117+
118+
protected TypeResolution resolveField() {
102119
return isNotNull(field, sourceText(), FIRST).and(
103120
isType(
104121
field,
@@ -110,18 +127,16 @@ protected TypeResolution resolveNonQueryParamTypes() {
110127
);
111128
}
112129

113-
@Override
114-
protected TypeResolution resolveQueryParamType() {
130+
protected TypeResolution resolveQuery() {
115131
return isType(
116132
query(),
117133
QUERY_DATA_TYPES::contains,
118134
sourceText(),
119-
queryParamOrdinal(),
135+
SECOND,
120136
"keyword, boolean, date, date_nanos, double, integer, ip, long, unsigned_long, version"
121-
).and(isNotNullAndFoldable(query(), sourceText(), queryParamOrdinal()));
137+
).and(isNotNullAndFoldable(query(), sourceText(), SECOND));
122138
}
123139

124-
@Override
125140
protected TypeResolution checkParamCompatibility() {
126141
DataType fieldType = field().dataType();
127142
DataType queryType = query().dataType();
@@ -206,14 +221,4 @@ protected Query translate(TranslatorHandler handler) {
206221

207222
throw new IllegalArgumentException("Match must have a field attribute as the first argument");
208223
}
209-
210-
@Override
211-
public Expression replaceQueryBuilder(QueryBuilder queryBuilder) {
212-
return new Match(source(), field, query(), queryBuilder);
213-
}
214-
215-
protected ParamOrdinal queryParamOrdinal() {
216-
return SECOND;
217-
}
218-
219224
}

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

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

88
package org.elasticsearch.xpack.esql.expression.function.fulltext;
99

10+
import org.apache.lucene.util.BytesRef;
1011
import org.elasticsearch.TransportVersions;
1112
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
1213
import org.elasticsearch.common.io.stream.StreamInput;
13-
import org.elasticsearch.common.io.stream.StreamOutput;
1414
import org.elasticsearch.common.unit.Fuzziness;
1515
import org.elasticsearch.index.query.QueryBuilder;
16-
import org.elasticsearch.xpack.esql.capabilities.PostOptimizationVerificationAware;
17-
import org.elasticsearch.xpack.esql.common.Failure;
18-
import org.elasticsearch.xpack.esql.common.Failures;
1916
import org.elasticsearch.xpack.esql.core.InvalidArgumentException;
2017
import org.elasticsearch.xpack.esql.core.expression.EntryExpression;
2118
import org.elasticsearch.xpack.esql.core.expression.Expression;
22-
import org.elasticsearch.xpack.esql.core.expression.FieldAttribute;
23-
import org.elasticsearch.xpack.esql.core.expression.FoldContext;
2419
import org.elasticsearch.xpack.esql.core.expression.Literal;
2520
import org.elasticsearch.xpack.esql.core.expression.MapExpression;
26-
import org.elasticsearch.xpack.esql.core.expression.TypeResolutions;
27-
import org.elasticsearch.xpack.esql.core.querydsl.query.Query;
28-
import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery;
2921
import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
3022
import org.elasticsearch.xpack.esql.core.tree.Source;
3123
import org.elasticsearch.xpack.esql.core.type.DataType;
3224
import org.elasticsearch.xpack.esql.core.type.DataTypeConverter;
33-
import org.elasticsearch.xpack.esql.core.type.MultiTypeEsField;
34-
import org.elasticsearch.xpack.esql.core.util.NumericUtils;
3525
import org.elasticsearch.xpack.esql.expression.function.Example;
3626
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
3727
import org.elasticsearch.xpack.esql.expression.function.MapParam;
@@ -42,10 +32,8 @@
4232
import java.io.IOException;
4333
import java.util.HashMap;
4434
import java.util.List;
45-
import java.util.Locale;
4635
import java.util.Map;
4736
import java.util.Objects;
48-
import java.util.Set;
4937

5038
import static java.util.Map.entry;
5139
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
@@ -60,33 +48,20 @@
6048
import static org.elasticsearch.index.query.MatchQueryBuilder.OPERATOR_FIELD;
6149
import static org.elasticsearch.index.query.MatchQueryBuilder.PREFIX_LENGTH_FIELD;
6250
import static org.elasticsearch.index.query.MatchQueryBuilder.ZERO_TERMS_QUERY_FIELD;
63-
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST;
6451
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND;
6552
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.THIRD;
6653
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isFoldable;
6754
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isMapExpression;
6855
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNull;
69-
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNullAndFoldable;
70-
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isType;
7156
import static org.elasticsearch.xpack.esql.core.type.DataType.BOOLEAN;
72-
import static org.elasticsearch.xpack.esql.core.type.DataType.DATETIME;
73-
import static org.elasticsearch.xpack.esql.core.type.DataType.DATE_NANOS;
74-
import static org.elasticsearch.xpack.esql.core.type.DataType.DOUBLE;
7557
import static org.elasticsearch.xpack.esql.core.type.DataType.FLOAT;
7658
import static org.elasticsearch.xpack.esql.core.type.DataType.INTEGER;
77-
import static org.elasticsearch.xpack.esql.core.type.DataType.IP;
7859
import static org.elasticsearch.xpack.esql.core.type.DataType.KEYWORD;
79-
import static org.elasticsearch.xpack.esql.core.type.DataType.LONG;
80-
import static org.elasticsearch.xpack.esql.core.type.DataType.SEMANTIC_TEXT;
81-
import static org.elasticsearch.xpack.esql.core.type.DataType.TEXT;
82-
import static org.elasticsearch.xpack.esql.core.type.DataType.UNSIGNED_LONG;
83-
import static org.elasticsearch.xpack.esql.core.type.DataType.VERSION;
84-
import static org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.EsqlBinaryComparison.formatIncompatibleTypesMessage;
8560

8661
/**
8762
* Full text function that performs a {@link org.elasticsearch.xpack.esql.querydsl.query.MatchQuery} .
8863
*/
89-
public class Match extends AbstractMatchFullTextFunction, OptionalArgument {
64+
public class Match extends AbstractMatchFullTextFunction implements OptionalArgument {
9065

9166
public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Match", Match::readFrom);
9267

@@ -225,7 +200,7 @@ public Match(
225200
}
226201

227202
public Match(Source source, Expression field, Expression matchQuery, Expression options, QueryBuilder queryBuilder) {
228-
super(source, matchQuery, options == null ? List.of(field, matchQuery) : List.of(field, matchQuery, options), queryBuilder);
203+
super(source, matchQuery, options == null ? List.of(field, matchQuery) : List.of(field, matchQuery, options), queryBuilder, field);
229204
this.options = options;
230205
}
231206

@@ -311,6 +286,9 @@ private Map<String, Object> parseOptions() throws InvalidArgumentException {
311286
return matchOptions;
312287
}
313288

289+
private Expression options() {
290+
return options;
291+
}
314292

315293
@Override
316294
public Expression replaceChildren(List<Expression> newChildren) {
@@ -325,11 +303,12 @@ public Expression replaceChildren(List<Expression> newChildren) {
325303

326304
@Override
327305
protected NodeInfo<? extends Expression> info() {
328-
return NodeInfo.create(this, Match::new, field(), query(), queryBuilder());
306+
return NodeInfo.create(this, Match::new, field(), query(), options(), queryBuilder());
329307
}
330308

331-
private Expression options() {
332-
return options;
309+
@Override
310+
public Expression replaceQueryBuilder(QueryBuilder queryBuilder) {
311+
return new Match(source(), field, query(), options(), queryBuilder);
333312
}
334313

335314
@Override

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

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

88
package org.elasticsearch.xpack.esql.expression.function.fulltext;
99

10+
import org.elasticsearch.TransportVersions;
1011
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
1112
import org.elasticsearch.common.io.stream.StreamInput;
13+
import org.elasticsearch.index.query.QueryBuilder;
1214
import org.elasticsearch.xpack.esql.core.expression.Expression;
1315
import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
1416
import org.elasticsearch.xpack.esql.core.tree.Source;
@@ -23,7 +25,7 @@
2325
/**
2426
* This class performs a {@link org.elasticsearch.xpack.esql.querydsl.query.MatchQuery} using an operator.
2527
*/
26-
public class MatchOperator extends Match {
28+
public class MatchOperator extends AbstractMatchFullTextFunction {
2729

2830
public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(
2931
Expression.class,
@@ -60,15 +62,22 @@ public MatchOperator(
6062
description = "Value to find in the provided field."
6163
) Expression matchQuery
6264
) {
63-
super(source, field, matchQuery);
65+
this(source, field, matchQuery, null);
6466
}
6567

66-
private static Match readFrom(StreamInput in) throws IOException {
68+
public MatchOperator(Source source, Expression field, Expression matchQuery, QueryBuilder queryBuilder) {
69+
super(source, matchQuery, List.of(field, matchQuery), queryBuilder, field);
70+
}
71+
72+
private static MatchOperator readFrom(StreamInput in) throws IOException {
6773
Source source = Source.readFrom((PlanStreamInput) in);
6874
Expression field = in.readNamedWriteable(Expression.class);
6975
Expression query = in.readNamedWriteable(Expression.class);
70-
71-
return new MatchOperator(source, field, query);
76+
QueryBuilder queryBuilder = null;
77+
if (in.getTransportVersion().onOrAfter(TransportVersions.ESQL_QUERY_BUILDER_IN_SEARCH_FUNCTIONS)) {
78+
queryBuilder = in.readOptionalNamedWriteable(QueryBuilder.class);
79+
}
80+
return new MatchOperator(source, field, query, queryBuilder);
7281
}
7382

7483
@Override
@@ -95,4 +104,9 @@ protected NodeInfo<? extends Expression> info() {
95104
public Expression replaceChildren(List<Expression> newChildren) {
96105
return new MatchOperator(source(), newChildren.get(0), newChildren.get(1));
97106
}
107+
108+
@Override
109+
public Expression replaceQueryBuilder(QueryBuilder queryBuilder) {
110+
return new MatchOperator(source(), field(), query(), queryBuilder);
111+
}
98112
}

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/AbstractMatchFullTextFunctionTests.java

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

88
package org.elasticsearch.xpack.esql.expression.function.fulltext;
99

10-
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
11-
1210
import org.elasticsearch.xpack.esql.core.expression.Expression;
1311
import org.elasticsearch.xpack.esql.core.type.DataType;
1412
import org.elasticsearch.xpack.esql.core.util.NumericUtils;
@@ -23,17 +21,16 @@
2321
import static org.hamcrest.Matchers.equalTo;
2422

2523
public abstract class AbstractMatchFullTextFunctionTests extends AbstractFunctionTestCase {
26-
@ParametersFactory
27-
public static Iterable<Object[]> parameters() {
24+
25+
protected static List<TestCaseSupplier> testCaseSuppliers() {
2826
List<TestCaseSupplier> suppliers = new ArrayList<>();
2927

3028
AbstractMatchFullTextFunctionTests.addUnsignedLongCases(suppliers);
3129
AbstractMatchFullTextFunctionTests.addNumericCases(suppliers);
3230
AbstractMatchFullTextFunctionTests.addNonNumericCases(suppliers);
3331
AbstractMatchFullTextFunctionTests.addQueryAsStringTestCases(suppliers);
3432
AbstractMatchFullTextFunctionTests.addStringTestCases(suppliers);
35-
36-
return parameterSuppliersFromTypedData(suppliers);
33+
return suppliers;
3734
}
3835

3936
private static void addNonNumericCases(List<TestCaseSupplier> suppliers) {

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchErrorTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@
2828
import static org.hamcrest.Matchers.equalTo;
2929

3030
public class MatchErrorTests extends ErrorsForCasesWithoutExamplesTestCase {
31+
3132
@Override
3233
protected List<TestCaseSupplier> cases() {
33-
return paramsToSuppliers(AbstractMatchFullTextFunctionTests.parameters());
34+
return paramsToSuppliers(MatchTests.parameters());
3435
}
3536

3637
@Override

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchOperatorTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
public class MatchOperatorTests extends AbstractMatchFullTextFunctionTests {
2626

2727
public MatchOperatorTests(@Name("TestCase") Supplier<TestCaseSupplier.TestCase> testCaseSupplier) {
28-
super(testCaseSupplier);
28+
this.testCase = testCaseSupplier.get();
2929
}
3030

3131
@ParametersFactory
3232
public static Iterable<Object[]> parameters() {
33-
return AparameterSuppliersFromTypedData(parametersWithoutFunctionNamedParams());
33+
return parameterSuppliersFromTypedData(testCaseSuppliers());
3434
}
3535

3636
@Override

0 commit comments

Comments
 (0)