Skip to content

Commit d7ce254

Browse files
committed
Initial implementation of earliest/latest
Signed-off-by: currantw <taylor.curran@improving.com>
1 parent b122f78 commit d7ce254

File tree

5 files changed

+53
-27
lines changed

5 files changed

+53
-27
lines changed

integ-test/src/integration/scala/org/opensearch/flint/spark/ppl/FlintSparkPPLBuiltInDateTimeFunctionITSuite.scala

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -406,30 +406,28 @@ class FlintSparkPPLBuiltInDateTimeFunctionITSuite
406406
assertSameRows(Seq(Row(true)), frame)
407407
}
408408

409-
// TODO #957: Support earliest
410-
ignore("test EARLIEST") {
409+
test("test EARLIEST") {
411410
var frame = sql(s"""
412411
| source=$testTable
413-
| | eval earliest_hour_before = earliest(now(), "-1h")
414-
| | eval earliest_now = earliest(now(), "now")
415-
| | eval earliest_hour_after = earliest(now(), "+1h")
416-
| | fields earliest_hour_before, earliest_now, earliest_hour_after
412+
| | eval earliest_second_before = earliest("-1s", now())
413+
| | eval earliest_now = earliest("now", now())
414+
| | eval earliest_second_after = earliest("+1s", now())
415+
| | fields earliest_second_before, earliest_now, earliest_second_after
417416
| | head 1
418417
| """.stripMargin)
419-
assertSameRows(Seq(Row(true), Row(true), Row(false)), frame)
418+
assertSameRows(Seq(Row(true, true, false)), frame)
420419
}
421420

422-
// TODO #957: Support latest
423-
ignore("test LATEST") {
421+
test("test LATEST") {
424422
var frame = sql(s"""
425423
| source=$testTable
426-
| | eval latest_hour_before = latest(now(), "-1h")
427-
| | eval latest_now = latest(now(), "now")
428-
| | eval latest_hour_after = latest(now(), "+1h")
429-
| | fields latest_hour_before, latest_now, latest_hour_after
424+
| | eval latest_second_before = latest("-1s", now())
425+
| | eval latest_now = latest("now", now())
426+
| | eval latest_second_after = latest("+1s", now())
427+
| | fields latest_second_before, latest_now, latest_second_after
430428
| | head 1
431429
| """.stripMargin)
432-
assertSameRows(Seq(Row(false), Row(true), Row(true)), frame)
430+
assertSameRows(Seq(Row(false, true, true)), frame)
433431
}
434432

435433
// TODO #957: Support earliest

ppl-spark-integration/src/main/antlr4/OpenSearchPPLLexer.g4

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -247,10 +247,6 @@ FIRST: 'FIRST';
247247
LAST: 'LAST';
248248
LIST: 'LIST';
249249
VALUES: 'VALUES';
250-
EARLIEST: 'EARLIEST';
251-
EARLIEST_TIME: 'EARLIEST_TIME';
252-
LATEST: 'LATEST';
253-
LATEST_TIME: 'LATEST_TIME';
254250
PER_DAY: 'PER_DAY';
255251
PER_HOUR: 'PER_HOUR';
256252
PER_MINUTE: 'PER_MINUTE';
@@ -338,7 +334,6 @@ MONTHNAME: 'MONTHNAME';
338334
NOW: 'NOW';
339335
PERIOD_ADD: 'PERIOD_ADD';
340336
PERIOD_DIFF: 'PERIOD_DIFF';
341-
RELATIVE_TIMESTAMP: 'RELATIVE_TIMESTAMP';
342337
SEC_TO_TIME: 'SEC_TO_TIME';
343338
STR_TO_DATE: 'STR_TO_DATE';
344339
SUBDATE: 'SUBDATE';
@@ -360,6 +355,11 @@ UTC_TIMESTAMP: 'UTC_TIMESTAMP';
360355
WEEKDAY: 'WEEKDAY';
361356
YEARWEEK: 'YEARWEEK';
362357

358+
// RELATIVE TIME FUNCTIONS
359+
RELATIVE_TIMESTAMP: 'RELATIVE_TIMESTAMP';
360+
EARLIEST: 'EARLIEST';
361+
LATEST: 'LATEST';
362+
363363
// TEXT FUNCTIONS
364364
SUBSTR: 'SUBSTR';
365365
SUBSTRING: 'SUBSTRING';

ppl-spark-integration/src/main/antlr4/OpenSearchPPLParser.g4

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,6 @@ dateTimeFunctionName
755755
| NOW
756756
| PERIOD_ADD
757757
| PERIOD_DIFF
758-
| RELATIVE_TIMESTAMP
759758
| QUARTER
760759
| SECOND
761760
| SECOND_OF_MINUTE
@@ -780,6 +779,13 @@ dateTimeFunctionName
780779
| WEEK_OF_YEAR
781780
| YEAR
782781
| YEARWEEK
782+
| relativeTimeFunctionName
783+
;
784+
785+
relativeTimeFunctionName
786+
: RELATIVE_TIMESTAMP
787+
| EARLIEST
788+
| LATEST
783789
;
784790

785791
getFormatFunction
@@ -1171,10 +1177,6 @@ keywordsCanBeId
11711177
| LAST
11721178
| LIST
11731179
| VALUES
1174-
| EARLIEST
1175-
| EARLIEST_TIME
1176-
| LATEST
1177-
| LATEST_TIME
11781180
| PER_DAY
11791181
| PER_HOUR
11801182
| PER_MINUTE

ppl-spark-integration/src/main/java/org/opensearch/sql/expression/function/BuiltinFunctionName.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,10 @@ public enum BuiltinFunctionName {
133133
LOCALTIMESTAMP(FunctionName.of("localtimestamp")),
134134
SYSDATE(FunctionName.of("sysdate")),
135135

136-
// Relative timestamp functions
136+
// Relative time functions
137137
RELATIVE_TIMESTAMP(FunctionName.of("relative_timestamp")),
138+
EARLIEST(FunctionName.of("earliest")),
139+
LATEST(FunctionName.of("latest")),
138140

139141
/** Text Functions. */
140142
TOSTRING(FunctionName.of("tostring")),

ppl-spark-integration/src/main/java/org/opensearch/sql/ppl/utils/BuiltinFunctionTransformer.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import org.apache.spark.sql.catalyst.expressions.CurrentTimestamp$;
1313
import org.apache.spark.sql.catalyst.expressions.DateAddInterval$;
1414
import org.apache.spark.sql.catalyst.expressions.Expression;
15+
import org.apache.spark.sql.catalyst.expressions.GreaterThanOrEqual$;
16+
import org.apache.spark.sql.catalyst.expressions.LessThanOrEqual$;
1517
import org.apache.spark.sql.catalyst.expressions.Literal$;
1618
import org.apache.spark.sql.catalyst.expressions.ScalaUDF;
1719
import org.apache.spark.sql.catalyst.expressions.TimestampAdd$;
@@ -37,13 +39,15 @@
3739
import static org.opensearch.sql.expression.function.BuiltinFunctionName.DATE_SUB;
3840
import static org.opensearch.sql.expression.function.BuiltinFunctionName.DAY_OF_MONTH;
3941
import static org.opensearch.sql.expression.function.BuiltinFunctionName.COALESCE;
42+
import static org.opensearch.sql.expression.function.BuiltinFunctionName.EARLIEST;
4043
import static org.opensearch.sql.expression.function.BuiltinFunctionName.JSON;
4144
import static org.opensearch.sql.expression.function.BuiltinFunctionName.JSON_ARRAY;
4245
import static org.opensearch.sql.expression.function.BuiltinFunctionName.JSON_ARRAY_LENGTH;
4346
import static org.opensearch.sql.expression.function.BuiltinFunctionName.JSON_EXTRACT;
4447
import static org.opensearch.sql.expression.function.BuiltinFunctionName.JSON_KEYS;
4548
import static org.opensearch.sql.expression.function.BuiltinFunctionName.JSON_OBJECT;
4649
import static org.opensearch.sql.expression.function.BuiltinFunctionName.JSON_VALID;
50+
import static org.opensearch.sql.expression.function.BuiltinFunctionName.LATEST;
4751
import static org.opensearch.sql.expression.function.BuiltinFunctionName.SUBTRACT;
4852
import static org.opensearch.sql.expression.function.BuiltinFunctionName.MULTIPLY;
4953
import static org.opensearch.sql.expression.function.BuiltinFunctionName.DIVIDE;
@@ -174,9 +178,23 @@ public interface BuiltinFunctionTransformer {
174178
args -> {
175179
return ToUTCTimestamp$.MODULE$.apply(CurrentTimestamp$.MODULE$.apply(), CurrentTimeZone$.MODULE$.apply());
176180
})
181+
182+
// Relative time functions
183+
.put(
184+
RELATIVE_TIMESTAMP,
185+
BuiltinFunctionTransformer::buildRelativeTimestampExpression)
186+
.put(
187+
EARLIEST,
188+
args ->
189+
LessThanOrEqual$.MODULE$.apply(
190+
buildRelativeTimestampExpression(List.of(args.get(0))),
191+
args.get(1)))
177192
.put(
178-
RELATIVE_TIMESTAMP,
179-
args -> SerializableUdf.visit("relative_timestamp", List.of(args.get(0), CurrentTimestamp$.MODULE$.apply(), CurrentTimeZone$.MODULE$.apply())))
193+
LATEST,
194+
args ->
195+
GreaterThanOrEqual$.MODULE$.apply(
196+
buildRelativeTimestampExpression(List.of(args.get(0))),
197+
args.get(1)))
180198
.build();
181199

182200
static Expression builtinFunction(org.opensearch.sql.ast.expression.Function function, List<Expression> args) {
@@ -218,4 +236,10 @@ static Expression[] createIntervalArgs(IntervalUnit unit, Expression value) {
218236
}
219237
return args;
220238
}
239+
240+
private static Expression buildRelativeTimestampExpression(List<Expression> args) {
241+
return SerializableUdf.visit(
242+
RELATIVE_TIMESTAMP.getName().getFunctionName(),
243+
List.of(args.get(0), CurrentTimestamp$.MODULE$.apply(), CurrentTimeZone$.MODULE$.apply()));
244+
}
221245
}

0 commit comments

Comments
 (0)