Skip to content

Commit b869b6a

Browse files
author
Max Ksyunz
authored
Refactor relevance search functions (#746)
- Update QueryStringTest to check for SyntaxCheckException. SyntaxCheckException is correct when incorrect # of parameters See #604 (comment) for reference. - Introduce MultiFieldQuery and SingleFieldQuery base classes. - Extract FunctionResolver interface. FunctionResolver is now DefaultFunctionResolver. RelevanceFunctionResolver is a simplified function resolver for relevance search functions. - Removed tests from FilterQueryBuilderTest that verified exceptions thrown for invalid function calls. These scenarios are now handled by RelevanceQuery::build. Signed-off-by: MaxKsyunz <[email protected]> Signed-off-by: MaxKsyunz <[email protected]>
1 parent 8a7b329 commit b869b6a

39 files changed

+703
-550
lines changed

core/src/main/java/org/opensearch/sql/expression/aggregation/AggregatorFunction.java

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
import org.opensearch.sql.data.type.ExprCoreType;
2828
import org.opensearch.sql.expression.function.BuiltinFunctionName;
2929
import org.opensearch.sql.expression.function.BuiltinFunctionRepository;
30+
import org.opensearch.sql.expression.function.DefaultFunctionResolver;
3031
import org.opensearch.sql.expression.function.FunctionBuilder;
3132
import org.opensearch.sql.expression.function.FunctionName;
32-
import org.opensearch.sql.expression.function.FunctionResolver;
3333
import org.opensearch.sql.expression.function.FunctionSignature;
3434

3535
/**
@@ -44,6 +44,7 @@
4444
public class AggregatorFunction {
4545
/**
4646
* Register Aggregation Function.
47+
*
4748
* @param repository {@link BuiltinFunctionRepository}.
4849
*/
4950
public static void register(BuiltinFunctionRepository repository) {
@@ -58,9 +59,9 @@ public static void register(BuiltinFunctionRepository repository) {
5859
repository.register(stddevPop());
5960
}
6061

61-
private static FunctionResolver avg() {
62+
private static DefaultFunctionResolver avg() {
6263
FunctionName functionName = BuiltinFunctionName.AVG.getName();
63-
return new FunctionResolver(
64+
return new DefaultFunctionResolver(
6465
functionName,
6566
new ImmutableMap.Builder<FunctionSignature, FunctionBuilder>()
6667
.put(new FunctionSignature(functionName, Collections.singletonList(DOUBLE)),
@@ -69,18 +70,18 @@ private static FunctionResolver avg() {
6970
);
7071
}
7172

72-
private static FunctionResolver count() {
73+
private static DefaultFunctionResolver count() {
7374
FunctionName functionName = BuiltinFunctionName.COUNT.getName();
74-
FunctionResolver functionResolver = new FunctionResolver(functionName,
75+
DefaultFunctionResolver functionResolver = new DefaultFunctionResolver(functionName,
7576
ExprCoreType.coreTypes().stream().collect(Collectors.toMap(
7677
type -> new FunctionSignature(functionName, Collections.singletonList(type)),
7778
type -> arguments -> new CountAggregator(arguments, INTEGER))));
7879
return functionResolver;
7980
}
8081

81-
private static FunctionResolver sum() {
82+
private static DefaultFunctionResolver sum() {
8283
FunctionName functionName = BuiltinFunctionName.SUM.getName();
83-
return new FunctionResolver(
84+
return new DefaultFunctionResolver(
8485
functionName,
8586
new ImmutableMap.Builder<FunctionSignature, FunctionBuilder>()
8687
.put(new FunctionSignature(functionName, Collections.singletonList(INTEGER)),
@@ -95,9 +96,9 @@ private static FunctionResolver sum() {
9596
);
9697
}
9798

98-
private static FunctionResolver min() {
99+
private static DefaultFunctionResolver min() {
99100
FunctionName functionName = BuiltinFunctionName.MIN.getName();
100-
return new FunctionResolver(
101+
return new DefaultFunctionResolver(
101102
functionName,
102103
new ImmutableMap.Builder<FunctionSignature, FunctionBuilder>()
103104
.put(new FunctionSignature(functionName, Collections.singletonList(INTEGER)),
@@ -121,9 +122,9 @@ private static FunctionResolver min() {
121122
.build());
122123
}
123124

124-
private static FunctionResolver max() {
125+
private static DefaultFunctionResolver max() {
125126
FunctionName functionName = BuiltinFunctionName.MAX.getName();
126-
return new FunctionResolver(
127+
return new DefaultFunctionResolver(
127128
functionName,
128129
new ImmutableMap.Builder<FunctionSignature, FunctionBuilder>()
129130
.put(new FunctionSignature(functionName, Collections.singletonList(INTEGER)),
@@ -148,9 +149,9 @@ private static FunctionResolver max() {
148149
);
149150
}
150151

151-
private static FunctionResolver varSamp() {
152+
private static DefaultFunctionResolver varSamp() {
152153
FunctionName functionName = BuiltinFunctionName.VARSAMP.getName();
153-
return new FunctionResolver(
154+
return new DefaultFunctionResolver(
154155
functionName,
155156
new ImmutableMap.Builder<FunctionSignature, FunctionBuilder>()
156157
.put(new FunctionSignature(functionName, Collections.singletonList(DOUBLE)),
@@ -159,9 +160,9 @@ private static FunctionResolver varSamp() {
159160
);
160161
}
161162

162-
private static FunctionResolver varPop() {
163+
private static DefaultFunctionResolver varPop() {
163164
FunctionName functionName = BuiltinFunctionName.VARPOP.getName();
164-
return new FunctionResolver(
165+
return new DefaultFunctionResolver(
165166
functionName,
166167
new ImmutableMap.Builder<FunctionSignature, FunctionBuilder>()
167168
.put(new FunctionSignature(functionName, Collections.singletonList(DOUBLE)),
@@ -170,9 +171,9 @@ private static FunctionResolver varPop() {
170171
);
171172
}
172173

173-
private static FunctionResolver stddevSamp() {
174+
private static DefaultFunctionResolver stddevSamp() {
174175
FunctionName functionName = BuiltinFunctionName.STDDEV_SAMP.getName();
175-
return new FunctionResolver(
176+
return new DefaultFunctionResolver(
176177
functionName,
177178
new ImmutableMap.Builder<FunctionSignature, FunctionBuilder>()
178179
.put(new FunctionSignature(functionName, Collections.singletonList(DOUBLE)),
@@ -181,9 +182,9 @@ private static FunctionResolver stddevSamp() {
181182
);
182183
}
183184

184-
private static FunctionResolver stddevPop() {
185+
private static DefaultFunctionResolver stddevPop() {
185186
FunctionName functionName = BuiltinFunctionName.STDDEV_POP.getName();
186-
return new FunctionResolver(
187+
return new DefaultFunctionResolver(
187188
functionName,
188189
new ImmutableMap.Builder<FunctionSignature, FunctionBuilder>()
189190
.put(new FunctionSignature(functionName, Collections.singletonList(DOUBLE)),

core/src/main/java/org/opensearch/sql/expression/datetime/DateTimeFunction.java

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.opensearch.sql.data.model.ExprValue;
3838
import org.opensearch.sql.expression.function.BuiltinFunctionName;
3939
import org.opensearch.sql.expression.function.BuiltinFunctionRepository;
40+
import org.opensearch.sql.expression.function.DefaultFunctionResolver;
4041
import org.opensearch.sql.expression.function.FunctionName;
4142
import org.opensearch.sql.expression.function.FunctionResolver;
4243

@@ -94,7 +95,7 @@ public void register(BuiltinFunctionRepository repository) {
9495
* (STRING/DATETIME/TIMESTAMP, LONG) -> DATETIME
9596
*/
9697

97-
private FunctionResolver add_date(FunctionName functionName) {
98+
private DefaultFunctionResolver add_date(FunctionName functionName) {
9899
return define(functionName,
99100
impl(nullMissingHandling(DateTimeFunction::exprAddDateInterval),
100101
DATETIME, STRING, INTERVAL),
@@ -110,7 +111,7 @@ private FunctionResolver add_date(FunctionName functionName) {
110111
);
111112
}
112113

113-
private FunctionResolver adddate() {
114+
private DefaultFunctionResolver adddate() {
114115
return add_date(BuiltinFunctionName.ADDDATE.getName());
115116
}
116117

@@ -119,15 +120,15 @@ private FunctionResolver adddate() {
119120
* Also to construct a date type. The supported signatures:
120121
* STRING/DATE/DATETIME/TIMESTAMP -> DATE
121122
*/
122-
private FunctionResolver date() {
123+
private DefaultFunctionResolver date() {
123124
return define(BuiltinFunctionName.DATE.getName(),
124125
impl(nullMissingHandling(DateTimeFunction::exprDate), DATE, STRING),
125126
impl(nullMissingHandling(DateTimeFunction::exprDate), DATE, DATE),
126127
impl(nullMissingHandling(DateTimeFunction::exprDate), DATE, DATETIME),
127128
impl(nullMissingHandling(DateTimeFunction::exprDate), DATE, TIMESTAMP));
128129
}
129130

130-
private FunctionResolver date_add() {
131+
private DefaultFunctionResolver date_add() {
131132
return add_date(BuiltinFunctionName.DATE_ADD.getName());
132133
}
133134

@@ -138,7 +139,7 @@ private FunctionResolver date_add() {
138139
* (DATE, LONG) -> DATE
139140
* (STRING/DATETIME/TIMESTAMP, LONG) -> DATETIME
140141
*/
141-
private FunctionResolver sub_date(FunctionName functionName) {
142+
private DefaultFunctionResolver sub_date(FunctionName functionName) {
142143
return define(functionName,
143144
impl(nullMissingHandling(DateTimeFunction::exprSubDateInterval),
144145
DATETIME, STRING, INTERVAL),
@@ -154,14 +155,14 @@ private FunctionResolver sub_date(FunctionName functionName) {
154155
);
155156
}
156157

157-
private FunctionResolver date_sub() {
158+
private DefaultFunctionResolver date_sub() {
158159
return sub_date(BuiltinFunctionName.DATE_SUB.getName());
159160
}
160161

161162
/**
162163
* DAY(STRING/DATE/DATETIME/TIMESTAMP). return the day of the month (1-31).
163164
*/
164-
private FunctionResolver day() {
165+
private DefaultFunctionResolver day() {
165166
return define(BuiltinFunctionName.DAY.getName(),
166167
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, DATE),
167168
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, DATETIME),
@@ -175,7 +176,7 @@ private FunctionResolver day() {
175176
* return the name of the weekday for date, including Monday, Tuesday, Wednesday,
176177
* Thursday, Friday, Saturday and Sunday.
177178
*/
178-
private FunctionResolver dayName() {
179+
private DefaultFunctionResolver dayName() {
179180
return define(BuiltinFunctionName.DAYNAME.getName(),
180181
impl(nullMissingHandling(DateTimeFunction::exprDayName), STRING, DATE),
181182
impl(nullMissingHandling(DateTimeFunction::exprDayName), STRING, DATETIME),
@@ -187,7 +188,7 @@ private FunctionResolver dayName() {
187188
/**
188189
* DAYOFMONTH(STRING/DATE/DATETIME/TIMESTAMP). return the day of the month (1-31).
189190
*/
190-
private FunctionResolver dayOfMonth() {
191+
private DefaultFunctionResolver dayOfMonth() {
191192
return define(BuiltinFunctionName.DAYOFMONTH.getName(),
192193
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, DATE),
193194
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, DATETIME),
@@ -200,7 +201,7 @@ private FunctionResolver dayOfMonth() {
200201
* DAYOFWEEK(STRING/DATE/DATETIME/TIMESTAMP).
201202
* return the weekday index for date (1 = Sunday, 2 = Monday, …, 7 = Saturday).
202203
*/
203-
private FunctionResolver dayOfWeek() {
204+
private DefaultFunctionResolver dayOfWeek() {
204205
return define(BuiltinFunctionName.DAYOFWEEK.getName(),
205206
impl(nullMissingHandling(DateTimeFunction::exprDayOfWeek), INTEGER, DATE),
206207
impl(nullMissingHandling(DateTimeFunction::exprDayOfWeek), INTEGER, DATETIME),
@@ -213,7 +214,7 @@ private FunctionResolver dayOfWeek() {
213214
* DAYOFYEAR(STRING/DATE/DATETIME/TIMESTAMP).
214215
* return the day of the year for date (1-366).
215216
*/
216-
private FunctionResolver dayOfYear() {
217+
private DefaultFunctionResolver dayOfYear() {
217218
return define(BuiltinFunctionName.DAYOFYEAR.getName(),
218219
impl(nullMissingHandling(DateTimeFunction::exprDayOfYear), INTEGER, DATE),
219220
impl(nullMissingHandling(DateTimeFunction::exprDayOfYear), INTEGER, DATETIME),
@@ -225,15 +226,15 @@ private FunctionResolver dayOfYear() {
225226
/**
226227
* FROM_DAYS(LONG). return the date value given the day number N.
227228
*/
228-
private FunctionResolver from_days() {
229+
private DefaultFunctionResolver from_days() {
229230
return define(BuiltinFunctionName.FROM_DAYS.getName(),
230231
impl(nullMissingHandling(DateTimeFunction::exprFromDays), DATE, LONG));
231232
}
232233

233234
/**
234235
* HOUR(STRING/TIME/DATETIME/TIMESTAMP). return the hour value for time.
235236
*/
236-
private FunctionResolver hour() {
237+
private DefaultFunctionResolver hour() {
237238
return define(BuiltinFunctionName.HOUR.getName(),
238239
impl(nullMissingHandling(DateTimeFunction::exprHour), INTEGER, STRING),
239240
impl(nullMissingHandling(DateTimeFunction::exprHour), INTEGER, TIME),
@@ -255,7 +256,7 @@ private FunctionResolver maketime() {
255256
/**
256257
* MICROSECOND(STRING/TIME/DATETIME/TIMESTAMP). return the microsecond value for time.
257258
*/
258-
private FunctionResolver microsecond() {
259+
private DefaultFunctionResolver microsecond() {
259260
return define(BuiltinFunctionName.MICROSECOND.getName(),
260261
impl(nullMissingHandling(DateTimeFunction::exprMicrosecond), INTEGER, STRING),
261262
impl(nullMissingHandling(DateTimeFunction::exprMicrosecond), INTEGER, TIME),
@@ -267,7 +268,7 @@ private FunctionResolver microsecond() {
267268
/**
268269
* MINUTE(STRING/TIME/DATETIME/TIMESTAMP). return the minute value for time.
269270
*/
270-
private FunctionResolver minute() {
271+
private DefaultFunctionResolver minute() {
271272
return define(BuiltinFunctionName.MINUTE.getName(),
272273
impl(nullMissingHandling(DateTimeFunction::exprMinute), INTEGER, STRING),
273274
impl(nullMissingHandling(DateTimeFunction::exprMinute), INTEGER, TIME),
@@ -279,7 +280,7 @@ private FunctionResolver minute() {
279280
/**
280281
* MONTH(STRING/DATE/DATETIME/TIMESTAMP). return the month for date (1-12).
281282
*/
282-
private FunctionResolver month() {
283+
private DefaultFunctionResolver month() {
283284
return define(BuiltinFunctionName.MONTH.getName(),
284285
impl(nullMissingHandling(DateTimeFunction::exprMonth), INTEGER, DATE),
285286
impl(nullMissingHandling(DateTimeFunction::exprMonth), INTEGER, DATETIME),
@@ -291,7 +292,7 @@ private FunctionResolver month() {
291292
/**
292293
* MONTHNAME(STRING/DATE/DATETIME/TIMESTAMP). return the full name of the month for date.
293294
*/
294-
private FunctionResolver monthName() {
295+
private DefaultFunctionResolver monthName() {
295296
return define(BuiltinFunctionName.MONTHNAME.getName(),
296297
impl(nullMissingHandling(DateTimeFunction::exprMonthName), STRING, DATE),
297298
impl(nullMissingHandling(DateTimeFunction::exprMonthName), STRING, DATETIME),
@@ -303,7 +304,7 @@ private FunctionResolver monthName() {
303304
/**
304305
* QUARTER(STRING/DATE/DATETIME/TIMESTAMP). return the month for date (1-4).
305306
*/
306-
private FunctionResolver quarter() {
307+
private DefaultFunctionResolver quarter() {
307308
return define(BuiltinFunctionName.QUARTER.getName(),
308309
impl(nullMissingHandling(DateTimeFunction::exprQuarter), INTEGER, DATE),
309310
impl(nullMissingHandling(DateTimeFunction::exprQuarter), INTEGER, DATETIME),
@@ -315,7 +316,7 @@ private FunctionResolver quarter() {
315316
/**
316317
* SECOND(STRING/TIME/DATETIME/TIMESTAMP). return the second value for time.
317318
*/
318-
private FunctionResolver second() {
319+
private DefaultFunctionResolver second() {
319320
return define(BuiltinFunctionName.SECOND.getName(),
320321
impl(nullMissingHandling(DateTimeFunction::exprSecond), INTEGER, STRING),
321322
impl(nullMissingHandling(DateTimeFunction::exprSecond), INTEGER, TIME),
@@ -324,7 +325,7 @@ private FunctionResolver second() {
324325
);
325326
}
326327

327-
private FunctionResolver subdate() {
328+
private DefaultFunctionResolver subdate() {
328329
return sub_date(BuiltinFunctionName.SUBDATE.getName());
329330
}
330331

@@ -333,7 +334,7 @@ private FunctionResolver subdate() {
333334
* Also to construct a time type. The supported signatures:
334335
* STRING/DATE/DATETIME/TIME/TIMESTAMP -> TIME
335336
*/
336-
private FunctionResolver time() {
337+
private DefaultFunctionResolver time() {
337338
return define(BuiltinFunctionName.TIME.getName(),
338339
impl(nullMissingHandling(DateTimeFunction::exprTime), TIME, STRING),
339340
impl(nullMissingHandling(DateTimeFunction::exprTime), TIME, DATE),
@@ -345,7 +346,7 @@ private FunctionResolver time() {
345346
/**
346347
* TIME_TO_SEC(STRING/TIME/DATETIME/TIMESTAMP). return the time argument, converted to seconds.
347348
*/
348-
private FunctionResolver time_to_sec() {
349+
private DefaultFunctionResolver time_to_sec() {
349350
return define(BuiltinFunctionName.TIME_TO_SEC.getName(),
350351
impl(nullMissingHandling(DateTimeFunction::exprTimeToSec), LONG, STRING),
351352
impl(nullMissingHandling(DateTimeFunction::exprTimeToSec), LONG, TIME),
@@ -359,7 +360,7 @@ private FunctionResolver time_to_sec() {
359360
* Also to construct a date type. The supported signatures:
360361
* STRING/DATE/DATETIME/TIMESTAMP -> DATE
361362
*/
362-
private FunctionResolver timestamp() {
363+
private DefaultFunctionResolver timestamp() {
363364
return define(BuiltinFunctionName.TIMESTAMP.getName(),
364365
impl(nullMissingHandling(DateTimeFunction::exprTimestamp), TIMESTAMP, STRING),
365366
impl(nullMissingHandling(DateTimeFunction::exprTimestamp), TIMESTAMP, DATE),
@@ -370,7 +371,7 @@ private FunctionResolver timestamp() {
370371
/**
371372
* TO_DAYS(STRING/DATE/DATETIME/TIMESTAMP). return the day number of the given date.
372373
*/
373-
private FunctionResolver to_days() {
374+
private DefaultFunctionResolver to_days() {
374375
return define(BuiltinFunctionName.TO_DAYS.getName(),
375376
impl(nullMissingHandling(DateTimeFunction::exprToDays), LONG, STRING),
376377
impl(nullMissingHandling(DateTimeFunction::exprToDays), LONG, TIMESTAMP),
@@ -381,7 +382,7 @@ private FunctionResolver to_days() {
381382
/**
382383
* WEEK(DATE[,mode]). return the week number for date.
383384
*/
384-
private FunctionResolver week() {
385+
private DefaultFunctionResolver week() {
385386
return define(BuiltinFunctionName.WEEK.getName(),
386387
impl(nullMissingHandling(DateTimeFunction::exprWeekWithoutMode), INTEGER, DATE),
387388
impl(nullMissingHandling(DateTimeFunction::exprWeekWithoutMode), INTEGER, DATETIME),
@@ -397,7 +398,7 @@ private FunctionResolver week() {
397398
/**
398399
* YEAR(STRING/DATE/DATETIME/TIMESTAMP). return the year for date (1000-9999).
399400
*/
400-
private FunctionResolver year() {
401+
private DefaultFunctionResolver year() {
401402
return define(BuiltinFunctionName.YEAR.getName(),
402403
impl(nullMissingHandling(DateTimeFunction::exprYear), INTEGER, DATE),
403404
impl(nullMissingHandling(DateTimeFunction::exprYear), INTEGER, DATETIME),
@@ -414,7 +415,7 @@ private FunctionResolver year() {
414415
* (DATETIME, STRING) -> STRING
415416
* (TIMESTAMP, STRING) -> STRING
416417
*/
417-
private FunctionResolver date_format() {
418+
private DefaultFunctionResolver date_format() {
418419
return define(BuiltinFunctionName.DATE_FORMAT.getName(),
419420
impl(nullMissingHandling(DateTimeFormatterUtil::getFormattedDate),
420421
STRING, STRING, STRING),
@@ -711,6 +712,7 @@ private ExprValue exprToDays(ExprValue date) {
711712

712713
/**
713714
* Week for date implementation for ExprValue.
715+
*
714716
* @param date ExprValue of Date/Datetime/Timestamp/String type.
715717
* @param mode ExprValue of Integer type.
716718
*/
@@ -722,6 +724,7 @@ private ExprValue exprWeek(ExprValue date, ExprValue mode) {
722724
/**
723725
* Week for date implementation for ExprValue.
724726
* When mode is not specified default value mode 0 is used for default_week_format.
727+
*
725728
* @param date ExprValue of Date/Datetime/Timestamp/String type.
726729
* @return ExprValue.
727730
*/

0 commit comments

Comments
 (0)