From df2f248712cf7f3bd890108e49e7ef68c2bb7f50 Mon Sep 17 00:00:00 2001 From: mch_ucchi <41606806+sohardforaname@users.noreply.github.com> Date: Wed, 22 Feb 2023 20:27:49 +0800 Subject: [PATCH] [feature](planner) add dayofweek for FEFunctions to support fold constant (#16993) add dayofweek for FEFunctions to support fold constant. use Zellar algorithm --- .../org/apache/doris/rewrite/FEFunctions.java | 21 +++++++++++++++++++ .../apache/doris/rewrite/FEFunctionsTest.java | 18 ++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java index f6e60a38cf..314a8f300b 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java @@ -77,6 +77,27 @@ public class FEFunctions { return new IntLiteral(datediff, Type.INT); } + @FEFunction(name = "dayofweek", argTypes = {"DATETIME"}, returnType = "INT") + public static IntLiteral dayOfWeek(LiteralExpr date) throws AnalysisException { + // use zellar algorithm. + long year = ((DateLiteral) date).getYear(); + long month = ((DateLiteral) date).getMonth(); + long day = ((DateLiteral) date).getDay(); + if (month < 3) { + month += 12; + year -= 1; + } + long c = year / 100; + long y = year % 100; + long t; + if (date.compareTo(new DateLiteral(1582, 10, 4)) > 0) { + t = (y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1) % 7; + } else { + t = (y + y / 4 - c + 26 * (month + 1) / 10 + day + 4) % 7; + } + return new IntLiteral(t + 1); + } + @FEFunction(name = "date_add", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") public static DateLiteral dateAdd(LiteralExpr date, LiteralExpr day) throws AnalysisException { return daysAdd(date, day); diff --git a/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java b/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java index 70ec805e64..210a8635bc 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java @@ -214,6 +214,24 @@ public class FEFunctionsTest { Assert.assertEquals(expectedResult, actualResult); } + @Test + public void dayOfWeekTest() throws AnalysisException { + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2019-06-23", Type.DATE)).getStringValue(), "1"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2019-06-24", Type.DATE)).getStringValue(), "2"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2019-06-25", Type.DATE)).getStringValue(), "3"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2019-06-26", Type.DATE)).getStringValue(), "4"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2019-06-27", Type.DATE)).getStringValue(), "5"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2019-06-28", Type.DATE)).getStringValue(), "6"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2019-06-29", Type.DATE)).getStringValue(), "7"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2023-02-13", Type.DATE)).getStringValue(), "2"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2023-02-14", Type.DATE)).getStringValue(), "3"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2023-02-15", Type.DATE)).getStringValue(), "4"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2023-02-16", Type.DATE)).getStringValue(), "5"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2023-02-17", Type.DATE)).getStringValue(), "6"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2023-02-18", Type.DATE)).getStringValue(), "7"); + Assert.assertEquals(FEFunctions.dayOfWeek(new DateLiteral("2023-02-19", Type.DATE)).getStringValue(), "1"); + } + @Test public void fromUnixTimeTest() throws AnalysisException { StringLiteral actualResult = FEFunctions.fromUnixTime(new IntLiteral(100000));