Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/main' into integ-datetime-adds…
Browse files Browse the repository at this point in the history
…ubtime-functions

Signed-off-by: Yury-Fridlyand <yury.fridlyand@improving.com>
  • Loading branch information
Yury-Fridlyand committed Jan 7, 2023
2 parents 43cd6de + aae57a0 commit 1b46be4
Show file tree
Hide file tree
Showing 10 changed files with 557 additions and 73 deletions.
18 changes: 16 additions & 2 deletions core/src/main/java/org/opensearch/sql/expression/DSL.java
Original file line number Diff line number Diff line change
Expand Up @@ -326,8 +326,9 @@ public static FunctionExpression dayofmonth(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.DAYOFMONTH, expressions);
}

public static FunctionExpression dayofweek(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.DAYOFWEEK, expressions);
public static FunctionExpression dayofweek(
FunctionProperties functionProperties, Expression... expressions) {
return compile(functionProperties, BuiltinFunctionName.DAYOFWEEK, expressions);
}

public static FunctionExpression dayofyear(Expression... expressions) {
Expand All @@ -338,6 +339,11 @@ public static FunctionExpression day_of_year(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.DAY_OF_YEAR, expressions);
}

public static FunctionExpression day_of_week(
FunctionProperties functionProperties, Expression... expressions) {
return compile(functionProperties, BuiltinFunctionName.DAY_OF_WEEK, expressions);
}

public static FunctionExpression from_days(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.FROM_DAYS, expressions);
}
Expand All @@ -358,6 +364,10 @@ public static FunctionExpression minute_of_day(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.MINUTE_OF_DAY, expressions);
}

public static FunctionExpression minute_of_hour(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.MINUTE_OF_HOUR, expressions);
}

public static FunctionExpression month(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.MONTH, expressions);
}
Expand All @@ -378,6 +388,10 @@ public static FunctionExpression second(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.SECOND, expressions);
}

public static FunctionExpression second_of_minute(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.SECOND_OF_MINUTE, expressions);
}

public static FunctionExpression subdate(Expression... expressions) {
return compile(FunctionProperties.None, BuiltinFunctionName.SUBDATE, expressions);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static java.time.temporal.ChronoUnit.DAYS;
import static java.time.temporal.ChronoUnit.MINUTES;
import static java.time.temporal.ChronoUnit.MONTHS;
import static java.time.temporal.ChronoUnit.SECONDS;
import static org.opensearch.sql.data.type.ExprCoreType.DATE;
import static org.opensearch.sql.data.type.ExprCoreType.DATETIME;
import static org.opensearch.sql.data.type.ExprCoreType.DOUBLE;
Expand Down Expand Up @@ -110,7 +111,8 @@ public void register(BuiltinFunctionRepository repository) {
repository.register(day());
repository.register(dayName());
repository.register(dayOfMonth());
repository.register(dayOfWeek());
repository.register(dayOfWeek(BuiltinFunctionName.DAYOFWEEK.getName()));
repository.register(dayOfWeek(BuiltinFunctionName.DAY_OF_WEEK.getName()));
repository.register(dayOfYear(BuiltinFunctionName.DAYOFYEAR));
repository.register(dayOfYear(BuiltinFunctionName.DAY_OF_YEAR));
repository.register(from_days());
Expand All @@ -121,16 +123,18 @@ public void register(BuiltinFunctionRepository repository) {
repository.register(makedate());
repository.register(maketime());
repository.register(microsecond());
repository.register(minute());
repository.register(minute(BuiltinFunctionName.MINUTE));
repository.register(minute_of_day());
repository.register(minute(BuiltinFunctionName.MINUTE_OF_HOUR));
repository.register(month(BuiltinFunctionName.MONTH));
repository.register(month(BuiltinFunctionName.MONTH_OF_YEAR));
repository.register(monthName());
repository.register(now());
repository.register(period_add());
repository.register(period_diff());
repository.register(quarter());
repository.register(second());
repository.register(second(BuiltinFunctionName.SECOND));
repository.register(second(BuiltinFunctionName.SECOND_OF_MINUTE));
repository.register(subdate());
repository.register(subtime());
repository.register(sysdate());
Expand Down Expand Up @@ -447,11 +451,14 @@ private DefaultFunctionResolver dayOfMonth() {
}

/**
* DAYOFWEEK(STRING/DATE/DATETIME/TIMESTAMP).
* DAYOFWEEK(STRING/DATE/DATETIME/TIME/TIMESTAMP).
* return the weekday index for date (1 = Sunday, 2 = Monday, …, 7 = Saturday).
*/
private DefaultFunctionResolver dayOfWeek() {
return define(BuiltinFunctionName.DAYOFWEEK.getName(),
private DefaultFunctionResolver dayOfWeek(FunctionName name) {
return define(name,
implWithProperties(nullMissingHandlingWithProperties(
(functionProperties, arg) -> DateTimeFunction.dayOfWeekToday(
functionProperties.getQueryStartClock())), INTEGER, TIME),
impl(nullMissingHandling(DateTimeFunction::exprDayOfWeek), INTEGER, DATE),
impl(nullMissingHandling(DateTimeFunction::exprDayOfWeek), INTEGER, DATETIME),
impl(nullMissingHandling(DateTimeFunction::exprDayOfWeek), INTEGER, TIMESTAMP),
Expand Down Expand Up @@ -524,11 +531,12 @@ private DefaultFunctionResolver microsecond() {
/**
* MINUTE(STRING/TIME/DATETIME/TIMESTAMP). return the minute value for time.
*/
private DefaultFunctionResolver minute() {
return define(BuiltinFunctionName.MINUTE.getName(),
private DefaultFunctionResolver minute(BuiltinFunctionName name) {
return define(name.getName(),
impl(nullMissingHandling(DateTimeFunction::exprMinute), INTEGER, STRING),
impl(nullMissingHandling(DateTimeFunction::exprMinute), INTEGER, TIME),
impl(nullMissingHandling(DateTimeFunction::exprMinute), INTEGER, DATETIME),
impl(nullMissingHandling(DateTimeFunction::exprMinute), INTEGER, DATE),
impl(nullMissingHandling(DateTimeFunction::exprMinute), INTEGER, TIMESTAMP)
);
}
Expand Down Expand Up @@ -606,10 +614,11 @@ private DefaultFunctionResolver quarter() {
/**
* SECOND(STRING/TIME/DATETIME/TIMESTAMP). return the second value for time.
*/
private DefaultFunctionResolver second() {
return define(BuiltinFunctionName.SECOND.getName(),
private DefaultFunctionResolver second(BuiltinFunctionName name) {
return define(name.getName(),
impl(nullMissingHandling(DateTimeFunction::exprSecond), INTEGER, STRING),
impl(nullMissingHandling(DateTimeFunction::exprSecond), INTEGER, TIME),
impl(nullMissingHandling(DateTimeFunction::exprSecond), INTEGER, DATE),
impl(nullMissingHandling(DateTimeFunction::exprSecond), INTEGER, DATETIME),
impl(nullMissingHandling(DateTimeFunction::exprSecond), INTEGER, TIMESTAMP)
);
Expand Down Expand Up @@ -818,6 +827,16 @@ private DefaultFunctionResolver date_format() {
);
}

/**
* Day of Week implementation for ExprValue when passing in an arguemt of type TIME.
*
* @param clock Current clock taken from function properties
* @return ExprValue.
*/
private ExprValue dayOfWeekToday(Clock clock) {
return new ExprIntegerValue((formatNow(clock).getDayOfWeek().getValue() % 7) + 1);
}

/**
* ADDDATE function implementation for ExprValue.
*
Expand Down Expand Up @@ -1023,7 +1042,7 @@ private ExprValue exprDayOfMonth(ExprValue date) {
/**
* Day of Week implementation for ExprValue.
*
* @param date ExprValue of Date/String type.
* @param date ExprValue of Date/Datetime/String/Timstamp type.
* @return ExprValue.
*/
private ExprValue exprDayOfWeek(ExprValue date) {
Expand Down Expand Up @@ -1151,7 +1170,8 @@ private ExprValue exprMicrosecond(ExprValue time) {
* @return ExprValue.
*/
private ExprValue exprMinute(ExprValue time) {
return new ExprIntegerValue(time.timeValue().getMinute());
return new ExprIntegerValue(
(MINUTES.between(LocalTime.MIN, time.timeValue()) % 60));
}

/**
Expand Down Expand Up @@ -1259,7 +1279,8 @@ private ExprValue exprQuarter(ExprValue date) {
* @return ExprValue.
*/
private ExprValue exprSecond(ExprValue time) {
return new ExprIntegerValue(time.timeValue().getSecond());
return new ExprIntegerValue(
(SECONDS.between(LocalTime.MIN, time.timeValue()) % 60));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ public enum BuiltinFunctionName {
DAYOFMONTH(FunctionName.of("dayofmonth")),
DAYOFWEEK(FunctionName.of("dayofweek")),
DAYOFYEAR(FunctionName.of("dayofyear")),
DAY_OF_WEEK(FunctionName.of("day_of_week")),
DAY_OF_YEAR(FunctionName.of("day_of_year")),
FROM_DAYS(FunctionName.of("from_days")),
FROM_UNIXTIME(FunctionName.of("from_unixtime")),
Expand All @@ -80,13 +81,15 @@ public enum BuiltinFunctionName {
MICROSECOND(FunctionName.of("microsecond")),
MINUTE(FunctionName.of("minute")),
MINUTE_OF_DAY(FunctionName.of("minute_of_day")),
MINUTE_OF_HOUR(FunctionName.of("minute_of_hour")),
MONTH(FunctionName.of("month")),
MONTH_OF_YEAR(FunctionName.of("month_of_year")),
MONTHNAME(FunctionName.of("monthname")),
PERIOD_ADD(FunctionName.of("period_add")),
PERIOD_DIFF(FunctionName.of("period_diff")),
QUARTER(FunctionName.of("quarter")),
SECOND(FunctionName.of("second")),
SECOND_OF_MINUTE(FunctionName.of("second_of_minute")),
SUBDATE(FunctionName.of("subdate")),
SUBTIME(FunctionName.of("subtime")),
TIME(FunctionName.of("time")),
Expand Down
Loading

0 comments on commit 1b46be4

Please sign in to comment.