Skip to content

Commit 13474e3

Browse files
Adding UTC_DATE, UTC_TIME, UTC_TIMESTAMP (#1193) (#1198)
* Updated UTC TIME Functions for like now FunctionProperties. Signed-off-by: MitchellGale-BitQuill <[email protected]> * Finished updates to tests. Signed-off-by: MitchellGale-BitQuill <[email protected]> * Removed unused import. Signed-off-by: MitchellGale-BitQuill <[email protected]> * Addressed PR comments. Signed-off-by: MitchellGale-BitQuill <[email protected]> * Removed extra import. Signed-off-by: MitchellGale-BitQuill <[email protected]> * removed `DateTimeFunction` used within class. Signed-off-by: MitchellGale-BitQuill <[email protected]> Signed-off-by: MitchellGale-BitQuill <[email protected]> (cherry picked from commit 94b6bec) Co-authored-by: MitchellGale-BitQuill <[email protected]>
1 parent 7edc72e commit 13474e3

File tree

13 files changed

+330
-6
lines changed

13 files changed

+330
-6
lines changed

core/src/main/java/org/opensearch/sql/expression/DSL.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,22 @@ public static FunctionExpression current_date(FunctionProperties functionPropert
768768
return compile(functionProperties, BuiltinFunctionName.CURRENT_DATE, args);
769769
}
770770

771+
public static FunctionExpression utc_date(FunctionProperties functionProperties,
772+
Expression... args) {
773+
return compile(functionProperties, BuiltinFunctionName.UTC_DATE, args);
774+
}
775+
776+
public static FunctionExpression utc_time(FunctionProperties functionProperties,
777+
Expression... args) {
778+
return compile(functionProperties, BuiltinFunctionName.UTC_TIME, args);
779+
}
780+
781+
public static FunctionExpression utc_timestamp(FunctionProperties functionProperties,
782+
Expression... args) {
783+
return compile(functionProperties, BuiltinFunctionName.UTC_TIMESTAMP, args);
784+
785+
}
786+
771787
@SuppressWarnings("unchecked")
772788
private static <T extends FunctionImplementation>
773789
T compile(FunctionProperties functionProperties,

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.opensearch.sql.expression.function.DefaultFunctionResolver;
6464
import org.opensearch.sql.expression.function.FunctionDSL;
6565
import org.opensearch.sql.expression.function.FunctionName;
66+
import org.opensearch.sql.expression.function.FunctionProperties;
6667
import org.opensearch.sql.expression.function.FunctionResolver;
6768
import org.opensearch.sql.utils.DateTimeUtils;
6869

@@ -126,6 +127,9 @@ public void register(BuiltinFunctionRepository repository) {
126127
repository.register(time());
127128
repository.register(time_to_sec());
128129
repository.register(timestamp());
130+
repository.register(utc_date());
131+
repository.register(utc_time());
132+
repository.register(utc_timestamp());
129133
repository.register(date_format());
130134
repository.register(to_days());
131135
repository.register(unix_timestamp());
@@ -566,6 +570,33 @@ private FunctionResolver unix_timestamp() {
566570
);
567571
}
568572

573+
/**
574+
* UTC_DATE(). return the current UTC Date in format yyyy-MM-dd
575+
*/
576+
private DefaultFunctionResolver utc_date() {
577+
return define(BuiltinFunctionName.UTC_DATE.getName(),
578+
implWithProperties(functionProperties
579+
-> exprUtcDate(functionProperties), DATE));
580+
}
581+
582+
/**
583+
* UTC_TIME(). return the current UTC Time in format HH:mm:ss
584+
*/
585+
private DefaultFunctionResolver utc_time() {
586+
return define(BuiltinFunctionName.UTC_TIME.getName(),
587+
implWithProperties(functionProperties
588+
-> exprUtcTime(functionProperties), TIME));
589+
}
590+
591+
/**
592+
* UTC_TIMESTAMP(). return the current UTC TimeStamp in format yyyy-MM-dd HH:mm:ss
593+
*/
594+
private DefaultFunctionResolver utc_timestamp() {
595+
return define(BuiltinFunctionName.UTC_TIMESTAMP.getName(),
596+
implWithProperties(functionProperties
597+
-> exprUtcTimeStamp(functionProperties), DATETIME));
598+
}
599+
569600
/**
570601
* WEEK(DATE[,mode]). return the week number for date.
571602
*/
@@ -1063,6 +1094,38 @@ private ExprValue exprTimeToSec(ExprValue time) {
10631094
return new ExprLongValue(time.timeValue().toSecondOfDay());
10641095
}
10651096

1097+
/**
1098+
* UTC_DATE implementation for ExprValue.
1099+
*
1100+
* @param functionProperties FunctionProperties.
1101+
* @return ExprValue.
1102+
*/
1103+
private ExprValue exprUtcDate(FunctionProperties functionProperties) {
1104+
return new ExprDateValue(exprUtcTimeStamp(functionProperties).dateValue());
1105+
}
1106+
1107+
/**
1108+
* UTC_TIME implementation for ExprValue.
1109+
*
1110+
* @param functionProperties FunctionProperties.
1111+
* @return ExprValue.
1112+
*/
1113+
private ExprValue exprUtcTime(FunctionProperties functionProperties) {
1114+
return new ExprTimeValue(exprUtcTimeStamp(functionProperties).timeValue());
1115+
}
1116+
1117+
/**
1118+
* UTC_TIMESTAMP implementation for ExprValue.
1119+
*
1120+
* @param functionProperties FunctionProperties.
1121+
* @return ExprValue.
1122+
*/
1123+
private ExprValue exprUtcTimeStamp(FunctionProperties functionProperties) {
1124+
var zdt = ZonedDateTime.now(functionProperties.getQueryStartClock())
1125+
.withZoneSameInstant(ZoneId.of("UTC"));
1126+
return new ExprDatetimeValue(zdt.toLocalDateTime());
1127+
}
1128+
10661129
/**
10671130
* To_days implementation for ExprValue.
10681131
*

core/src/main/java/org/opensearch/sql/expression/function/BuiltinFunctionName.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ public enum BuiltinFunctionName {
9090
TIMESTAMP(FunctionName.of("timestamp")),
9191
DATE_FORMAT(FunctionName.of("date_format")),
9292
TO_DAYS(FunctionName.of("to_days")),
93+
UTC_DATE(FunctionName.of("utc_date")),
94+
UTC_TIME(FunctionName.of("utc_time")),
95+
UTC_TIMESTAMP(FunctionName.of("utc_timestamp")),
9396
UNIX_TIMESTAMP(FunctionName.of("unix_timestamp")),
9497
WEEK(FunctionName.of("week")),
9598
WEEK_OF_YEAR(FunctionName.of("week_of_year")),

core/src/test/java/org/opensearch/sql/expression/datetime/NowLikeFunctionTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
import java.time.LocalDateTime;
2020
import java.time.LocalTime;
2121
import java.time.Period;
22+
import java.time.ZoneId;
23+
import java.time.ZonedDateTime;
2224
import java.time.temporal.ChronoUnit;
2325
import java.time.temporal.Temporal;
2426
import java.time.temporal.TemporalUnit;
2527
import java.util.List;
28+
import java.util.TimeZone;
2629
import java.util.concurrent.Callable;
2730
import java.util.function.BiFunction;
2831
import java.util.function.Function;
@@ -103,6 +106,31 @@ void current_date() {
103106
() -> LocalDate.now(functionProperties.getQueryStartClock()));
104107
}
105108

109+
@Test
110+
void utc_date() {
111+
test_now_like_functions(DSL::utc_date, DATE, false,
112+
() -> utcDateTimeNow(functionProperties).toLocalDate());
113+
}
114+
115+
@Test
116+
void utc_time() {
117+
test_now_like_functions(DSL::utc_time, TIME, false,
118+
() -> utcDateTimeNow(functionProperties).toLocalTime());
119+
}
120+
121+
@Test
122+
void utc_timestamp() {
123+
test_now_like_functions(DSL::utc_timestamp, DATETIME, false,
124+
() -> utcDateTimeNow(functionProperties));
125+
}
126+
127+
private static LocalDateTime utcDateTimeNow(FunctionProperties functionProperties) {
128+
ZonedDateTime zonedDateTime =
129+
LocalDateTime.now(functionProperties.getQueryStartClock())
130+
.atZone(TimeZone.getDefault().toZoneId());
131+
return zonedDateTime.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime();
132+
}
133+
106134
/**
107135
* Check how NOW-like functions are processed.
108136
*

docs/user/dql/functions.rst

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2119,6 +2119,74 @@ Examples::
21192119
+----------------------------------------------------+
21202120

21212121

2122+
UTC_DATE
2123+
--------
2124+
2125+
Description
2126+
>>>>>>>>>>>
2127+
2128+
Returns the current UTC date as a value in 'YYYY-MM-DD'.
2129+
2130+
Return type: DATE
2131+
2132+
Specification: UTC_DATE() -> DATE
2133+
2134+
Example::
2135+
2136+
> SELECT UTC_DATE();
2137+
fetched rows / total rows = 1/1
2138+
+--------------+
2139+
| utc_date() |
2140+
|--------------|
2141+
| 2022-10-03 |
2142+
+--------------+
2143+
2144+
2145+
UTC_TIME
2146+
--------
2147+
2148+
Description
2149+
>>>>>>>>>>>
2150+
2151+
Returns the current UTC time as a value in 'hh:mm:ss'.
2152+
2153+
Return type: TIME
2154+
2155+
Specification: UTC_TIME() -> TIME
2156+
2157+
Example::
2158+
2159+
> SELECT UTC_TIME();
2160+
fetched rows / total rows = 1/1
2161+
+--------------+
2162+
| utc_time() |
2163+
|--------------|
2164+
| 17:54:27 |
2165+
+--------------+
2166+
2167+
2168+
UTC_TIMESTAMP
2169+
-------------
2170+
2171+
Description
2172+
>>>>>>>>>>>
2173+
2174+
Returns the current UTC timestamp as a value in 'YYYY-MM-DD hh:mm:ss'.
2175+
2176+
Return type: DATETIME
2177+
2178+
Specification: UTC_TIMESTAMP() -> DATETIME
2179+
2180+
Example::
2181+
2182+
> SELECT UTC_TIMESTAMP();
2183+
fetched rows / total rows = 1/1
2184+
+---------------------+
2185+
| utc_timestamp() |
2186+
|---------------------|
2187+
| 2022-10-03 17:54:28 |
2188+
+---------------------+
2189+
21222190
WEEK
21232191
----
21242192

docs/user/ppl/functions/datetime.rst

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,6 +1251,75 @@ Example::
12511251
+--------------------------+-----------------------------+
12521252

12531253

1254+
UTC_DATE
1255+
--------
1256+
1257+
Description
1258+
>>>>>>>>>>>
1259+
1260+
Returns the current UTC date as a value in 'YYYY-MM-DD'.
1261+
1262+
Return type: DATE
1263+
1264+
Specification: UTC_DATE() -> DATE
1265+
1266+
Example::
1267+
1268+
> source=people | eval `UTC_DATE()` = UTC_DATE() | fields `UTC_DATE()`
1269+
fetched rows / total rows = 1/1
1270+
+--------------+
1271+
| UTC_DATE() |
1272+
|--------------|
1273+
| 2022-10-03 |
1274+
+--------------+
1275+
1276+
1277+
UTC_TIME
1278+
--------
1279+
1280+
Description
1281+
>>>>>>>>>>>
1282+
1283+
Returns the current UTC time as a value in 'hh:mm:ss'.
1284+
1285+
Return type: TIME
1286+
1287+
Specification: UTC_TIME() -> TIME
1288+
1289+
Example::
1290+
1291+
> source=people | eval `UTC_TIME()` = UTC_TIME() | fields `UTC_TIME()`
1292+
fetched rows / total rows = 1/1
1293+
+--------------+
1294+
| UTC_TIME() |
1295+
|--------------|
1296+
| 17:54:27 |
1297+
+--------------+
1298+
1299+
1300+
UTC_TIMESTAMP
1301+
-------------
1302+
1303+
Description
1304+
>>>>>>>>>>>
1305+
1306+
Returns the current UTC timestamp as a value in 'YYYY-MM-DD hh:mm:ss'.
1307+
1308+
Return type: DATETIME
1309+
1310+
Specification: UTC_TIMESTAMP() -> DATETIME
1311+
1312+
Example::
1313+
1314+
> source=people | eval `UTC_TIMESTAMP()` = UTC_TIMESTAMP() | fields `UTC_TIMESTAMP()`
1315+
fetched rows / total rows = 1/1
1316+
+---------------------+
1317+
| UTC_TIMESTAMP() |
1318+
|---------------------|
1319+
| 2022-10-03 17:54:28 |
1320+
+---------------------+
1321+
1322+
12541323
WEEK
12551324
----
12561325

integ-test/src/test/java/org/opensearch/sql/ppl/DateTimeFunctionIT.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66

77
package org.opensearch.sql.ppl;
88

9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.assertTrue;
911
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_DATE;
1012
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_PEOPLE2;
13+
import static org.opensearch.sql.sql.DateTimeFunctionIT.utcDateTimeNow;
1114
import static org.opensearch.sql.util.MatcherUtils.rows;
1215
import static org.opensearch.sql.util.MatcherUtils.schema;
1316
import static org.opensearch.sql.util.MatcherUtils.verifySchema;
@@ -754,6 +757,33 @@ private List<ImmutableMap<Object, Object>> nowLikeFunctionsData() {
754757
.put("referenceGetter", (Supplier<Temporal>) LocalDate::now)
755758
.put("parser", (BiFunction<CharSequence, DateTimeFormatter, Temporal>) LocalDate::parse)
756759
.put("serializationPattern", "uuuu-MM-dd")
760+
.build(),
761+
ImmutableMap.builder()
762+
.put("name", "utc_date")
763+
.put("hasFsp", false)
764+
.put("hasShortcut", false)
765+
.put("constValue", true)
766+
.put("referenceGetter", (Supplier<Temporal>) ()-> utcDateTimeNow().toLocalDate())
767+
.put("parser", (BiFunction<CharSequence, DateTimeFormatter, Temporal>) LocalDate::parse)
768+
.put("serializationPattern", "uuuu-MM-dd")
769+
.build(),
770+
ImmutableMap.builder()
771+
.put("name", "utc_time")
772+
.put("hasFsp", false)
773+
.put("hasShortcut", false)
774+
.put("constValue", true)
775+
.put("referenceGetter", (Supplier<Temporal>) ()-> utcDateTimeNow().toLocalTime())
776+
.put("parser", (BiFunction<CharSequence, DateTimeFormatter, Temporal>) LocalTime::parse)
777+
.put("serializationPattern", "HH:mm:ss")
778+
.build(),
779+
ImmutableMap.builder()
780+
.put("name", "utc_timestamp")
781+
.put("hasFsp", false)
782+
.put("hasShortcut", false)
783+
.put("constValue", true)
784+
.put("referenceGetter", (Supplier<Temporal>) ()-> utcDateTimeNow())
785+
.put("parser", (BiFunction<CharSequence, DateTimeFormatter, Temporal>) LocalDateTime::parse)
786+
.put("serializationPattern", "uuuu-MM-dd HH:mm:ss")
757787
.build()
758788
);
759789
}

0 commit comments

Comments
 (0)