Skip to content

Commit 9259f49

Browse files
committed
Refactor parameters resolution
1 parent 7a6d56a commit 9259f49

File tree

3 files changed

+39
-48
lines changed

3 files changed

+39
-48
lines changed

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

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -72,34 +72,25 @@ protected final TypeResolution resolveType() {
7272
return new TypeResolution("Unresolved children");
7373
}
7474

75-
return resolveNonQueryParamTypes().and(resolveQueryParamType().and(checkParamCompatibility()));
75+
return resolveParams();
7676
}
7777

7878
/**
79-
* Checks parameter specific compatibility, to be overriden by subclasses
79+
* Resolves the type for the function parameters, as part of the type resolution for the function
8080
*
81-
* @return TypeResolution for param compatibility
81+
* @return type resolution for the function parameters
8282
*/
83-
protected TypeResolution checkParamCompatibility() {
84-
return TypeResolution.TYPE_RESOLVED;
83+
protected TypeResolution resolveParams() {
84+
return resolveQuery(DEFAULT);
8585
}
8686

8787
/**
8888
* Resolves the type for the query parameter, as part of the type resolution for the function
8989
*
90-
* @return type resolution for query parameter
90+
* @return type resolution for the query parameter
9191
*/
92-
protected TypeResolution resolveQueryParamType() {
93-
return isString(query(), sourceText(), queryParamOrdinal()).and(isNotNullAndFoldable(query(), sourceText(), queryParamOrdinal()));
94-
}
95-
96-
/**
97-
* Subclasses can override this method for custom type resolution for additional function parameters
98-
*
99-
* @return type resolution for non-query parameter types
100-
*/
101-
protected TypeResolution resolveNonQueryParamTypes() {
102-
return TypeResolution.TYPE_RESOLVED;
92+
protected TypeResolution resolveQuery(TypeResolutions.ParamOrdinal queryOrdinal) {
93+
return isString(query(), sourceText(), queryOrdinal).and(isNotNullAndFoldable(query(), sourceText(), queryOrdinal));
10394
}
10495

10596
public Expression query() {
@@ -120,15 +111,6 @@ public Object queryAsObject() {
120111
return queryAsObject;
121112
}
122113

123-
/**
124-
* Returns the param ordinal for the query parameter so it can be used in error messages
125-
*
126-
* @return Query ordinal for the
127-
*/
128-
protected TypeResolutions.ParamOrdinal queryParamOrdinal() {
129-
return DEFAULT;
130-
}
131-
132114
@Override
133115
public Nullability nullable() {
134116
return Nullability.FALSE;

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

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import static org.elasticsearch.index.query.MatchQueryBuilder.ZERO_TERMS_QUERY_FIELD;
6969
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST;
7070
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND;
71+
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.THIRD;
7172
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isFoldable;
7273
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isMapExpression;
7374
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNull;
@@ -277,8 +278,12 @@ public String getWriteableName() {
277278
}
278279

279280
@Override
280-
protected TypeResolution resolveNonQueryParamTypes() {
281-
TypeResolution resolution = isNotNull(field, sourceText(), FIRST).and(
281+
protected TypeResolution resolveParams() {
282+
return resolveField().and(resolveQuery()).and(resolveOptions()).and(checkParamCompatibility());
283+
}
284+
285+
private TypeResolution resolveField() {
286+
return isNotNull(field, sourceText(), FIRST).and(
282287
isType(
283288
field,
284289
FIELD_DATA_TYPES::contains,
@@ -287,14 +292,16 @@ protected TypeResolution resolveNonQueryParamTypes() {
287292
"keyword, text, boolean, date, date_nanos, double, integer, ip, long, unsigned_long, version"
288293
)
289294
);
290-
if (resolution.unresolved()) {
291-
return resolution;
292-
}
295+
}
293296

294-
// TODO Extract common logic for validating options
297+
private TypeResolution resolveOptions() {
295298
if (options() != null && EsqlCapabilities.Cap.MATCH_FUNCTION_OPTIONS.isEnabled()) {
299+
TypeResolution resolution = isNotNull(options(), sourceText(), THIRD);
300+
if (resolution.unresolved()) {
301+
return resolution;
302+
}
296303
// MapExpression does not have a DataType associated with it
297-
resolution = isMapExpression(options(), sourceText(), SECOND);
304+
resolution = isMapExpression(options(), sourceText(), THIRD);
298305
if (resolution.unresolved()) {
299306
return resolution;
300307
}
@@ -308,6 +315,16 @@ protected TypeResolution resolveNonQueryParamTypes() {
308315
return TypeResolution.TYPE_RESOLVED;
309316
}
310317

318+
private TypeResolution resolveQuery() {
319+
return isType(
320+
query(),
321+
QUERY_DATA_TYPES::contains,
322+
sourceText(),
323+
queryParamOrdinal(),
324+
"keyword, boolean, date, date_nanos, double, integer, ip, long, unsigned_long, version"
325+
).and(isNotNullAndFoldable(query(), sourceText(), SECOND));
326+
}
327+
311328
private Map<String, Object> parseOptions() throws InvalidArgumentException {
312329
Map<String, Object> matchOptions = new HashMap<>();
313330
// Match is lenient by default to avoid failing on incompatible types
@@ -347,19 +364,7 @@ private Map<String, Object> parseOptions() throws InvalidArgumentException {
347364
return matchOptions;
348365
}
349366

350-
@Override
351-
protected TypeResolution resolveQueryParamType() {
352-
return isType(
353-
query(),
354-
QUERY_DATA_TYPES::contains,
355-
sourceText(),
356-
queryParamOrdinal(),
357-
"keyword, boolean, date, date_nanos, double, integer, ip, long, unsigned_long, version"
358-
).and(isNotNullAndFoldable(query(), sourceText(), queryParamOrdinal()));
359-
}
360-
361-
@Override
362-
protected TypeResolution checkParamCompatibility() {
367+
private TypeResolution checkParamCompatibility() {
363368
DataType fieldType = field().dataType();
364369
DataType queryType = query().dataType();
365370

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,12 @@ public String getWriteableName() {
9595
}
9696

9797
@Override
98-
protected TypeResolution resolveNonQueryParamTypes() {
99-
return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST)).and(super.resolveNonQueryParamTypes());
98+
protected TypeResolution resolveParams() {
99+
return resolveField().and(resolveQuery(SECOND));
100+
}
101+
102+
private TypeResolution resolveField() {
103+
return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST));
100104
}
101105

102106
@Override

0 commit comments

Comments
 (0)