Skip to content

Commit 42994f6

Browse files
committed
Add support of iso 8601 date string to date and time
- add an IT for date time comparison with iso 8601 formatted literal Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 82be518 commit 42994f6

4 files changed

Lines changed: 54 additions & 3 deletions

File tree

core/src/main/java/org/opensearch/sql/data/model/ExprDateValue.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.google.common.base.Objects;
99
import java.time.Instant;
1010
import java.time.LocalDate;
11+
import java.time.LocalDateTime;
1112
import java.time.LocalTime;
1213
import java.time.ZoneOffset;
1314
import java.time.ZonedDateTime;
@@ -32,7 +33,14 @@ public class ExprDateValue extends AbstractExprValue {
3233
*/
3334
public ExprDateValue(String date) {
3435
try {
35-
this.date = LocalDate.parse(date, DateTimeFormatters.DATE_TIMESTAMP_FORMATTER);
36+
LocalDateTime ldt;
37+
try {
38+
ldt = LocalDateTime.parse(date, DateTimeFormatters.DATE_TIMESTAMP_FORMATTER);
39+
} catch (DateTimeParseException ignored) {
40+
ZonedDateTime zdt = ZonedDateTime.parse(date, DateTimeFormatter.ISO_DATE_TIME);
41+
ldt = zdt.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
42+
}
43+
this.date = ldt.toLocalDate();
3644
} catch (DateTimeParseException e) {
3745
throw new ExpressionEvaluationException(
3846
String.format("date:%s in unsupported format, please use 'yyyy-MM-dd'", date));

core/src/main/java/org/opensearch/sql/data/model/ExprTimeValue.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import java.time.Instant;
1111
import java.time.LocalDate;
1212
import java.time.LocalTime;
13+
import java.time.OffsetTime;
1314
import java.time.ZoneOffset;
1415
import java.time.ZonedDateTime;
16+
import java.time.format.DateTimeFormatter;
1517
import java.time.format.DateTimeParseException;
1618
import java.util.Objects;
1719
import lombok.RequiredArgsConstructor;
@@ -34,7 +36,23 @@ public class ExprTimeValue extends AbstractExprValue {
3436
*/
3537
public ExprTimeValue(String time) {
3638
try {
37-
this.time = LocalTime.parse(time, DateTimeFormatters.TIME_TIMESTAMP_FORMATTER);
39+
LocalTime lt;
40+
try {
41+
lt = LocalTime.parse(time, DateTimeFormatters.TIME_TIMESTAMP_FORMATTER);
42+
} catch (DateTimeParseException ignore) {
43+
try {
44+
lt =
45+
ZonedDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME)
46+
.withZoneSameInstant(ZoneOffset.UTC)
47+
.toLocalTime();
48+
} catch (DateTimeParseException ignore2) {
49+
lt =
50+
OffsetTime.parse(time, DateTimeFormatter.ISO_TIME)
51+
.withOffsetSameInstant(ZoneOffset.UTC)
52+
.toLocalTime();
53+
}
54+
}
55+
this.time = lt;
3856
} catch (DateTimeParseException e) {
3957
throw new ExpressionEvaluationException(
4058
String.format("time:%s in unsupported format, please use 'HH:mm:ss[.SSSSSSSSS]'", time));

core/src/main/java/org/opensearch/sql/executor/QueryService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,11 @@ public RelNode optimize(RelNode plan, CalcitePlanContext context) {
265265

266266
private boolean isCalciteFallbackAllowed() {
267267
if (settings != null) {
268-
return settings.getSettingValue(Settings.Key.CALCITE_FALLBACK_ALLOWED);
268+
Boolean fallback_allowed = settings.getSettingValue(Settings.Key.CALCITE_FALLBACK_ALLOWED);
269+
if (fallback_allowed == null) {
270+
return false;
271+
}
272+
return fallback_allowed;
269273
} else {
270274
return true;
271275
}

integ-test/src/test/java/org/opensearch/sql/calcite/standalone/CalcitePPLDateTimeBuiltinFunctionIT.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,27 @@ public void testComparisonBetweenDateAndTimestamp() throws IOException {
707707
verifyDataRows(actual, rows(2));
708708
}
709709

710+
@Test
711+
public void testComparisonWithIso8601DateLiteral() {
712+
Object[][] tests = {
713+
{"date_optional_time = '1984-04-12T09:07:42.000Z'", 2},
714+
{"date_time = '1984-04-12T07:07:42-02:00'", 2},
715+
{"date = '1984-04-12'", 2},
716+
{"date = '1984-04-12T09:07:42.000Z'", 2},
717+
{"basic_t_time = '1984-04-12T09:07:42.000Z'", 2},
718+
{"basic_t_time = '10:07:42.000+01:00'", 2}
719+
};
720+
for (Object[] pair : tests) {
721+
String query = (String) pair[0];
722+
int result = (int) pair[1];
723+
JSONObject actual =
724+
executeQuery(
725+
String.format(
726+
"source=%s | where %s | stats COUNT() AS cnt", TEST_INDEX_DATE_FORMATS, query));
727+
verifyDataRows(actual, rows(result));
728+
}
729+
}
730+
710731
@Test
711732
public void testAddSubTime() throws IOException {
712733
JSONObject actual =

0 commit comments

Comments
 (0)