Skip to content

Commit fec8f3a

Browse files
Merge remote-tracking branch 'upstream/main' into integ-datetime-calculations
Signed-off-by: Yury-Fridlyand <yury.fridlyand@improving.com>
2 parents e8fb6bc + 1108379 commit fec8f3a

17 files changed

Lines changed: 845 additions & 294 deletions

File tree

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

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,10 @@ public static FunctionExpression dayname(Expression... expressions) {
310310
return compile(FunctionProperties.None, BuiltinFunctionName.DAYNAME, expressions);
311311
}
312312

313-
public static FunctionExpression dayofmonth(Expression... expressions) {
314-
return compile(FunctionProperties.None, BuiltinFunctionName.DAYOFMONTH, expressions);
313+
public static FunctionExpression dayofmonth(
314+
FunctionProperties functionProperties,
315+
Expression... expressions) {
316+
return compile(functionProperties, BuiltinFunctionName.DAYOFMONTH, expressions);
315317
}
316318

317319
public static FunctionExpression dayofweek(
@@ -323,8 +325,15 @@ public static FunctionExpression dayofyear(Expression... expressions) {
323325
return compile(FunctionProperties.None, BuiltinFunctionName.DAYOFYEAR, expressions);
324326
}
325327

326-
public static FunctionExpression day_of_year(Expression... expressions) {
327-
return compile(FunctionProperties.None, BuiltinFunctionName.DAY_OF_YEAR, expressions);
328+
public static FunctionExpression day_of_month(
329+
FunctionProperties functionProperties,
330+
Expression... expressions) {
331+
return compile(functionProperties, BuiltinFunctionName.DAY_OF_MONTH, expressions);
332+
}
333+
334+
public static FunctionExpression day_of_year(
335+
FunctionProperties functionProperties, Expression... expressions) {
336+
return compile(functionProperties, BuiltinFunctionName.DAY_OF_YEAR, expressions);
328337
}
329338

330339
public static FunctionExpression day_of_week(
@@ -360,8 +369,9 @@ public static FunctionExpression month(Expression... expressions) {
360369
return compile(FunctionProperties.None, BuiltinFunctionName.MONTH, expressions);
361370
}
362371

363-
public static FunctionExpression month_of_year(Expression... expressions) {
364-
return compile(FunctionProperties.None, BuiltinFunctionName.MONTH_OF_YEAR, expressions);
372+
public static FunctionExpression month_of_year(
373+
FunctionProperties functionProperties, Expression... expressions) {
374+
return compile(functionProperties, BuiltinFunctionName.MONTH_OF_YEAR, expressions);
365375
}
366376

367377
public static FunctionExpression monthname(Expression... expressions) {
@@ -400,12 +410,14 @@ public static FunctionExpression to_days(Expression... expressions) {
400410
return compile(FunctionProperties.None, BuiltinFunctionName.TO_DAYS, expressions);
401411
}
402412

403-
public static FunctionExpression week(Expression... expressions) {
404-
return compile(FunctionProperties.None, BuiltinFunctionName.WEEK, expressions);
413+
public static FunctionExpression week(
414+
FunctionProperties functionProperties, Expression... expressions) {
415+
return compile(functionProperties, BuiltinFunctionName.WEEK, expressions);
405416
}
406417

407-
public static FunctionExpression week_of_year(Expression... expressions) {
408-
return compile(FunctionProperties.None, BuiltinFunctionName.WEEK_OF_YEAR, expressions);
418+
public static FunctionExpression week_of_year(
419+
FunctionProperties functionProperties, Expression... expressions) {
420+
return compile(functionProperties, BuiltinFunctionName.WEEK_OF_YEAR, expressions);
409421
}
410422

411423
public static FunctionExpression year(Expression... expressions) {

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

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@
6868
import org.opensearch.sql.data.model.ExprValue;
6969
import org.opensearch.sql.data.type.ExprCoreType;
7070
import org.opensearch.sql.exception.ExpressionEvaluationException;
71-
import org.opensearch.sql.exception.SemanticCheckException;
7271
import org.opensearch.sql.expression.function.BuiltinFunctionName;
7372
import org.opensearch.sql.expression.function.BuiltinFunctionRepository;
7473
import org.opensearch.sql.expression.function.DefaultFunctionResolver;
@@ -97,6 +96,9 @@ public class DateTimeFunction {
9796
// 32536771199.999999, or equivalent '3001-01-18 23:59:59.999999' UTC
9897
private static final Double MYSQL_MAX_TIMESTAMP = 32536771200d;
9998

99+
// Mode used for week/week_of_year function by default when no argument is provided
100+
private static final ExprIntegerValue DEFAULT_WEEK_OF_YEAR_MODE = new ExprIntegerValue(0);
101+
100102
/**
101103
* Register Date and Time Functions.
102104
*
@@ -118,7 +120,8 @@ public void register(BuiltinFunctionRepository repository) {
118120
repository.register(date_sub());
119121
repository.register(day());
120122
repository.register(dayName());
121-
repository.register(dayOfMonth());
123+
repository.register(dayOfMonth(BuiltinFunctionName.DAYOFMONTH));
124+
repository.register(dayOfMonth(BuiltinFunctionName.DAY_OF_MONTH));
122125
repository.register(dayOfWeek(BuiltinFunctionName.DAYOFWEEK.getName()));
123126
repository.register(dayOfWeek(BuiltinFunctionName.DAY_OF_WEEK.getName()));
124127
repository.register(dayOfYear(BuiltinFunctionName.DAYOFYEAR));
@@ -453,12 +456,15 @@ private DefaultFunctionResolver dayName() {
453456
/**
454457
* DAYOFMONTH(STRING/DATE/DATETIME/TIMESTAMP). return the day of the month (1-31).
455458
*/
456-
private DefaultFunctionResolver dayOfMonth() {
457-
return define(BuiltinFunctionName.DAYOFMONTH.getName(),
459+
private DefaultFunctionResolver dayOfMonth(BuiltinFunctionName name) {
460+
return define(name.getName(),
461+
implWithProperties(nullMissingHandlingWithProperties(
462+
(functionProperties, arg) -> DateTimeFunction.dayOfMonthToday(
463+
functionProperties.getQueryStartClock())), INTEGER, TIME),
458464
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, DATE),
459465
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, DATETIME),
460-
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, TIMESTAMP),
461-
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, STRING)
466+
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, STRING),
467+
impl(nullMissingHandling(DateTimeFunction::exprDayOfMonth), INTEGER, TIMESTAMP)
462468
);
463469
}
464470

@@ -484,6 +490,9 @@ private DefaultFunctionResolver dayOfWeek(FunctionName name) {
484490
*/
485491
private DefaultFunctionResolver dayOfYear(BuiltinFunctionName dayOfYear) {
486492
return define(dayOfYear.getName(),
493+
implWithProperties(nullMissingHandlingWithProperties((functionProperties, arg)
494+
-> DateTimeFunction.dayOfYearToday(
495+
functionProperties.getQueryStartClock())), INTEGER, TIME),
487496
impl(nullMissingHandling(DateTimeFunction::exprDayOfYear), INTEGER, DATE),
488497
impl(nullMissingHandling(DateTimeFunction::exprDayOfYear), INTEGER, DATETIME),
489498
impl(nullMissingHandling(DateTimeFunction::exprDayOfYear), INTEGER, TIMESTAMP),
@@ -571,6 +580,9 @@ private DefaultFunctionResolver minute_of_day() {
571580
*/
572581
private DefaultFunctionResolver month(BuiltinFunctionName month) {
573582
return define(month.getName(),
583+
implWithProperties(nullMissingHandlingWithProperties((functionProperties, arg)
584+
-> DateTimeFunction.monthOfYearToday(
585+
functionProperties.getQueryStartClock())), INTEGER, TIME),
574586
impl(nullMissingHandling(DateTimeFunction::exprMonth), INTEGER, DATE),
575587
impl(nullMissingHandling(DateTimeFunction::exprMonth), INTEGER, DATETIME),
576588
impl(nullMissingHandling(DateTimeFunction::exprMonth), INTEGER, TIMESTAMP),
@@ -800,10 +812,18 @@ private DefaultFunctionResolver utc_timestamp() {
800812
*/
801813
private DefaultFunctionResolver week(BuiltinFunctionName week) {
802814
return define(week.getName(),
815+
implWithProperties(nullMissingHandlingWithProperties((functionProperties, arg)
816+
-> DateTimeFunction.weekOfYearToday(
817+
DEFAULT_WEEK_OF_YEAR_MODE,
818+
functionProperties.getQueryStartClock())), INTEGER, TIME),
803819
impl(nullMissingHandling(DateTimeFunction::exprWeekWithoutMode), INTEGER, DATE),
804820
impl(nullMissingHandling(DateTimeFunction::exprWeekWithoutMode), INTEGER, DATETIME),
805821
impl(nullMissingHandling(DateTimeFunction::exprWeekWithoutMode), INTEGER, TIMESTAMP),
806822
impl(nullMissingHandling(DateTimeFunction::exprWeekWithoutMode), INTEGER, STRING),
823+
implWithProperties(nullMissingHandlingWithProperties((functionProperties, time, modeArg)
824+
-> DateTimeFunction.weekOfYearToday(
825+
modeArg,
826+
functionProperties.getQueryStartClock())), INTEGER, TIME, INTEGER),
807827
impl(nullMissingHandling(DateTimeFunction::exprWeek), INTEGER, DATE, INTEGER),
808828
impl(nullMissingHandling(DateTimeFunction::exprWeek), INTEGER, DATETIME, INTEGER),
809829
impl(nullMissingHandling(DateTimeFunction::exprWeek), INTEGER, TIMESTAMP, INTEGER),
@@ -844,6 +864,20 @@ private DefaultFunctionResolver date_format() {
844864
);
845865
}
846866

867+
868+
private ExprValue dayOfMonthToday(Clock clock) {
869+
return new ExprIntegerValue(LocalDateTime.now(clock).getDayOfMonth());
870+
}
871+
872+
private ExprValue dayOfYearToday(Clock clock) {
873+
return new ExprIntegerValue(LocalDateTime.now(clock).getDayOfYear());
874+
}
875+
876+
private ExprValue weekOfYearToday(ExprValue mode, Clock clock) {
877+
return new ExprIntegerValue(
878+
CalendarLookup.getWeekNumber(mode.integerValue(), LocalDateTime.now(clock).toLocalDate()));
879+
}
880+
847881
/**
848882
* Day of Week implementation for ExprValue when passing in an arguemt of type TIME.
849883
*
@@ -1085,7 +1119,7 @@ private ExprValue exprDayName(ExprValue date) {
10851119
/**
10861120
* Day of Month implementation for ExprValue.
10871121
*
1088-
* @param date ExprValue of Date/String type.
1122+
* @param date ExprValue of Date/Datetime/String/Time/Timestamp type.
10891123
* @return ExprValue.
10901124
*/
10911125
private ExprValue exprDayOfMonth(ExprValue date) {
@@ -1572,6 +1606,10 @@ private ExprValue exprYear(ExprValue date) {
15721606
return new ExprIntegerValue(date.dateValue().getYear());
15731607
}
15741608

1609+
private ExprValue monthOfYearToday(Clock clock) {
1610+
return new ExprIntegerValue(LocalDateTime.now(clock).getMonthValue());
1611+
}
1612+
15751613
private LocalDateTime formatNow(Clock clock) {
15761614
return formatNow(clock, 0);
15771615
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public enum BuiltinFunctionName {
6969
DAY(FunctionName.of("day")),
7070
DAYNAME(FunctionName.of("dayname")),
7171
DAYOFMONTH(FunctionName.of("dayofmonth")),
72+
DAY_OF_MONTH(FunctionName.of("day_of_month")),
7273
DAYOFWEEK(FunctionName.of("dayofweek")),
7374
DAYOFYEAR(FunctionName.of("dayofyear")),
7475
DAY_OF_WEEK(FunctionName.of("day_of_week")),

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,11 @@ public String toString() {
141141
* Implementation of a function that takes two arguments, returns a value, and
142142
* requires FunctionProperties to complete.
143143
*
144-
* @param function {@link ExprValue} based unary function.
144+
* @param function {@link ExprValue} based Binary function.
145145
* @param returnType return type.
146146
* @param args1Type first argument type.
147147
* @param args2Type second argument type.
148-
* @return Unary Function Implementation.
148+
* @return Binary Function Implementation.
149149
*/
150150
public static SerializableFunction<FunctionName, Pair<FunctionSignature, FunctionBuilder>>
151151
implWithProperties(

core/src/main/java/org/opensearch/sql/expression/operator/arthmetic/MathematicalFunction.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,16 @@ private static DefaultFunctionResolver abs() {
119119
private static DefaultFunctionResolver ceil() {
120120
return FunctionDSL.define(BuiltinFunctionName.CEIL.getName(),
121121
FunctionDSL.impl(
122-
FunctionDSL.nullMissingHandling(v -> new ExprIntegerValue(Math.ceil(v.doubleValue()))),
123-
INTEGER, DOUBLE)
122+
FunctionDSL.nullMissingHandling(v -> new ExprLongValue(Math.ceil(v.doubleValue()))),
123+
LONG, DOUBLE)
124124
);
125125
}
126126

127127
private static DefaultFunctionResolver ceiling() {
128128
return FunctionDSL.define(BuiltinFunctionName.CEILING.getName(),
129129
FunctionDSL.impl(
130-
FunctionDSL.nullMissingHandling(v -> new ExprIntegerValue(Math.ceil(v.doubleValue()))),
131-
INTEGER, DOUBLE)
130+
FunctionDSL.nullMissingHandling(v -> new ExprLongValue(Math.ceil(v.doubleValue()))),
131+
LONG, DOUBLE)
132132
);
133133
}
134134

@@ -204,8 +204,8 @@ private static DefaultFunctionResolver exp() {
204204
private static DefaultFunctionResolver floor() {
205205
return FunctionDSL.define(BuiltinFunctionName.FLOOR.getName(),
206206
FunctionDSL.impl(
207-
FunctionDSL.nullMissingHandling(v -> new ExprIntegerValue(Math.floor(v.doubleValue()))),
208-
INTEGER, DOUBLE)
207+
FunctionDSL.nullMissingHandling(v -> new ExprLongValue(Math.floor(v.doubleValue()))),
208+
LONG, DOUBLE)
209209
);
210210
}
211211

0 commit comments

Comments
 (0)