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]

Reply via email to