This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 535986cfdc1c4184cb7d55177efbe74c1def2258 Author: 谢健 <[email protected]> AuthorDate: Mon Oct 9 21:52:44 2023 +0800 [feature](Nereids) fold weeks_sub/add on fe (#25155) support folding weeks_sub/add on fe --- .../functions/executable/DateTimeArithmetic.java | 48 +++++++++++++++++++++- .../trees/expressions/literal/DateLiteral.java | 5 +++ .../trees/expressions/literal/DateTimeLiteral.java | 5 +++ .../expressions/literal/DateTimeV2Literal.java | 7 ++++ .../trees/expressions/literal/DateV2Literal.java | 5 +++ .../nereids/rules/expression/FoldConstantTest.java | 5 ++- 6 files changed, 73 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeArithmetic.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeArithmetic.java index aa1d1d0a1db..033bff2afd3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeArithmetic.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeArithmetic.java @@ -30,7 +30,7 @@ import java.time.temporal.ChronoUnit; /** * executable function: - * date_add/sub, years/months/days/hours/minutes/seconds_add/sub, datediff + * date_add/sub, years/months/week/days/hours/minutes/seconds_add/sub, datediff */ public class DateTimeArithmetic { /** @@ -125,6 +125,29 @@ public class DateTimeArithmetic { return date.plusMonths(month.getValue()); } + /** + * datetime arithmetic function weeks-add. + */ + @ExecFunction(name = "weeks_add", argTypes = {"DATE", "INT"}, returnType = "DATE") + public static Expression weeksAdd(DateLiteral date, IntegerLiteral weeks) { + return date.plusWeeks(weeks.getValue()); + } + + @ExecFunction(name = "weeks_add", argTypes = {"DATETIME", "INT"}, returnType = "DATETIME") + public static Expression weeksAdd(DateTimeLiteral date, IntegerLiteral weeks) { + return date.plusWeeks(weeks.getValue()); + } + + @ExecFunction(name = "weeks_add", argTypes = {"DATEV2", "INT"}, returnType = "DATEV2") + public static Expression weeksAdd(DateV2Literal date, IntegerLiteral weeks) { + return date.plusWeeks(weeks.getValue()); + } + + @ExecFunction(name = "weeks_add", argTypes = {"DATETIMEV2", "INT"}, returnType = "DATETIMEV2") + public static Expression weeksAdd(DateTimeV2Literal date, IntegerLiteral weeks) { + return date.plusWeeks(weeks.getValue()); + } + /** * datetime arithmetic function days-add. */ @@ -241,6 +264,29 @@ public class DateTimeArithmetic { return monthsAdd(date, new IntegerLiteral(-month.getValue())); } + /** + * datetime arithmetic function weeks-sub. + */ + @ExecFunction(name = "weeks_sub", argTypes = {"DATE", "INT"}, returnType = "DATE") + public static Expression weeksSub(DateLiteral date, IntegerLiteral weeks) { + return date.plusWeeks(-weeks.getValue()); + } + + @ExecFunction(name = "weeks_sub", argTypes = {"DATETIME", "INT"}, returnType = "DATETIME") + public static Expression weeksSub(DateTimeLiteral date, IntegerLiteral weeks) { + return date.plusWeeks(-weeks.getValue()); + } + + @ExecFunction(name = "weeks_sub", argTypes = {"DATEV2", "INT"}, returnType = "DATEV2") + public static Expression weeksSub(DateV2Literal date, IntegerLiteral weeks) { + return date.plusWeeks(-weeks.getValue()); + } + + @ExecFunction(name = "weeks_sub", argTypes = {"DATETIMEV2", "INT"}, returnType = "DATETIMEV2") + public static Expression weeksSub(DateTimeV2Literal date, IntegerLiteral weeks) { + return date.plusWeeks(-weeks.getValue()); + } + /** * datetime arithmetic function days-sub */ diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java index eef80b6020c..036b4bacb3f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java @@ -343,6 +343,11 @@ public class DateLiteral extends Literal { DateUtils.getTime(StandardDateFormat.DATE_FORMATTER, getStringValue()).plusMonths(months)); } + public Expression plusWeeks(long weeks) { + return fromJavaDateType( + DateUtils.getTime(StandardDateFormat.DATE_FORMATTER, getStringValue()).plusWeeks(weeks)); + } + public Expression plusYears(long years) { return fromJavaDateType( DateUtils.getTime(StandardDateFormat.DATE_FORMATTER, getStringValue()).plusYears(years)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java index 2d5ea77072b..1bf2ac7e736 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java @@ -209,6 +209,11 @@ public class DateTimeLiteral extends DateLiteral { DateUtils.getTime(StandardDateFormat.DATE_TIME_FORMATTER, getStringValue()).plusMonths(months)); } + public Expression plusWeeks(long weeks) { + return fromJavaDateType( + DateUtils.getTime(StandardDateFormat.DATE_TIME_FORMATTER, getStringValue()).plusWeeks(weeks)); + } + public Expression plusDays(long days) { return fromJavaDateType( DateUtils.getTime(StandardDateFormat.DATE_TIME_FORMATTER, getStringValue()).plusDays(days)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java index 87b881074f1..7471fc829fc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java @@ -120,6 +120,13 @@ public class DateTimeV2Literal extends DateTimeLiteral { .plusMonths(months), getDataType().getScale()); } + @Override + public Expression plusWeeks(long weeks) { + return fromJavaDateType( + DateUtils.getTime(StandardDateFormat.DATE_TIME_FORMATTER_TO_MICRO_SECOND, getStringValue()) + .plusWeeks(weeks), getDataType().getScale()); + } + @Override public Expression plusDays(long days) { return fromJavaDateType( diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateV2Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateV2Literal.java index c57607892e3..54de4a76a07 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateV2Literal.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateV2Literal.java @@ -60,6 +60,11 @@ public class DateV2Literal extends DateLiteral { DateUtils.getTime(StandardDateFormat.DATE_FORMATTER, getStringValue()).plusMonths(months)); } + public Expression plusWeeks(long weeks) { + return fromJavaDateType( + DateUtils.getTime(StandardDateFormat.DATE_FORMATTER, getStringValue()).plusWeeks(weeks)); + } + public Expression plusYears(long years) { return fromJavaDateType( DateUtils.getTime(StandardDateFormat.DATE_FORMATTER, getStringValue()).plusYears(years)); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java index 4f89f77937d..5529101473c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java @@ -309,7 +309,8 @@ public class FoldConstantTest extends ExpressionRewriteTestHelper { String[] answer = { "2000-01-30", "1999-12-01", "2029-12-31", "1969-12-31", - "2002-06-30", "1997-06-30", "2000-01-30", "1999-12-01", + "2002-06-30", "1997-06-30", "2000-07-28", "1999-06-04", + "2000-01-30", "1999-12-01", "1999", "4", "12", "6", "31", "365", "31", "'1999-12-31'", "1999-12-27", "1999-12-31" }; @@ -321,6 +322,8 @@ public class FoldConstantTest extends ExpressionRewriteTestHelper { Assertions.assertEquals(DateTimeArithmetic.yearsSub(dateLiteral, integerLiteral).toSql(), answer[answerIdx++]); Assertions.assertEquals(DateTimeArithmetic.monthsAdd(dateLiteral, integerLiteral).toSql(), answer[answerIdx++]); Assertions.assertEquals(DateTimeArithmetic.monthsSub(dateLiteral, integerLiteral).toSql(), answer[answerIdx++]); + Assertions.assertEquals(DateTimeArithmetic.weeksAdd(dateLiteral, integerLiteral).toSql(), answer[answerIdx++]); + Assertions.assertEquals(DateTimeArithmetic.weeksSub(dateLiteral, integerLiteral).toSql(), answer[answerIdx++]); Assertions.assertEquals(DateTimeArithmetic.daysAdd(dateLiteral, integerLiteral).toSql(), answer[answerIdx++]); Assertions.assertEquals(DateTimeArithmetic.daysSub(dateLiteral, integerLiteral).toSql(), answer[answerIdx++]); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
