From 37551a016304a58945d5f9c29631fdc463fa91ed Mon Sep 17 00:00:00 2001 From: morrySnow <101034200+morrySnow@users.noreply.github.com> Date: Tue, 28 Feb 2023 14:51:38 +0800 Subject: [PATCH] [enhancement](Nereids) implement to legacy literal for datetimev2 literal (#17177) --- .../glue/translator/ExpressionTranslator.java | 11 ++++---- .../functions/scalar/ArrayMax.java | 6 +++++ .../functions/scalar/ArrayMin.java | 6 +++++ .../literal/DateTimeV2Literal.java | 26 ++++++++++++++++--- .../expressions/literal/DateV2Literal.java | 6 +++++ .../trees/expressions/literal/Literal.java | 3 ++- .../visitor/ExpressionVisitor.java | 10 +++++++ .../doris/nereids/types/DateTimeV2Type.java | 5 ++++ 8 files changed, 63 insertions(+), 10 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java index 72ab64cc0e..b944d460e7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java @@ -36,6 +36,7 @@ import org.apache.doris.analysis.SlotRef; import org.apache.doris.analysis.StringLiteral; import org.apache.doris.analysis.TimestampArithmeticExpr; import org.apache.doris.catalog.Function.NullableMode; +import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.trees.expressions.AggregateExpression; @@ -74,7 +75,6 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.JsonArray; import org.apache.doris.nereids.trees.expressions.functions.scalar.JsonObject; import org.apache.doris.nereids.trees.expressions.functions.scalar.ScalarFunction; import org.apache.doris.nereids.trees.expressions.functions.window.WindowFunction; -import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral; import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal; import org.apache.doris.nereids.trees.expressions.literal.Literal; import org.apache.doris.nereids.trees.expressions.literal.NullLiteral; @@ -208,12 +208,11 @@ public class ExpressionTranslator extends DefaultExpressionVisitor R accept(ExpressionVisitor visitor, C context) { + return visitor.visitDateTimeV2Literal(this, context); + } + + @Override + public LiteralExpr toLegacyLiteral() { + return new org.apache.doris.analysis.DateLiteral(year, month, day, hour, minute, second, microSecond, + getDataType().toCatalogDataType()); + } + @Override public String toString() { - return String.format("%04d-%02d-%02d %02d:%02d:%02d.%06d", year, month, day, hour, minute, second, microSecond); + return getStringValue(); } @Override public String getStringValue() { - return String.format("%04d-%02d-%02d %02d:%02d:%02d.%06d", year, month, day, hour, minute, second, microSecond); + return String.format("%04d-%02d-%02d %02d:%02d:%02d" + + (getDataType().getScale() > 0 ? ".%0" + getDataType().getScale() + "d" : ""), + year, month, day, hour, minute, second, + (int) (microSecond / Math.pow(10, DateTimeV2Type.MAX_SCALE - getDataType().getScale()))); } @Override 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 f70454a942..985a4a3d0c 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 @@ -20,6 +20,7 @@ package org.apache.doris.nereids.trees.expressions.literal; import org.apache.doris.analysis.LiteralExpr; import org.apache.doris.catalog.Type; import org.apache.doris.nereids.exceptions.AnalysisException; +import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.DateV2Type; import org.apache.doris.nereids.util.DateUtils; @@ -43,6 +44,11 @@ public class DateV2Literal extends DateLiteral { return new org.apache.doris.analysis.DateLiteral(year, month, day, Type.DATEV2); } + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitDateV2Literal(this, context); + } + public DateV2Literal plusDays(int days) { LocalDateTime dateTime = DateUtils.getTime(DATE_FORMATTER, getStringValue()).plusDays(days); return new DateV2Literal(dateTime.getYear(), dateTime.getMonthValue(), dateTime.getDayOfMonth()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java index d2e7011989..70b795acc5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java @@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.expressions.shape.LeafExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.CharType; import org.apache.doris.nereids.types.DataType; +import org.apache.doris.nereids.types.DateTimeV2Type; import org.apache.doris.nereids.types.LargeIntType; import org.apache.commons.lang3.StringUtils; @@ -253,7 +254,7 @@ public abstract class Literal extends Expression implements LeafExpression, Comp } else if (targetType.isDateV2Type()) { return new DateV2Literal(desc); } else if (targetType.isDateTimeV2Type()) { - return new DateTimeV2Literal(desc); + return new DateTimeV2Literal((DateTimeV2Type) targetType, desc); } throw new AnalysisException("no support cast!"); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java index e47a38790a..977070fa86 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java @@ -85,6 +85,8 @@ import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; import org.apache.doris.nereids.trees.expressions.literal.CharLiteral; import org.apache.doris.nereids.trees.expressions.literal.DateLiteral; import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral; +import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal; +import org.apache.doris.nereids.trees.expressions.literal.DateV2Literal; import org.apache.doris.nereids.trees.expressions.literal.DecimalLiteral; import org.apache.doris.nereids.trees.expressions.literal.DoubleLiteral; import org.apache.doris.nereids.trees.expressions.literal.FloatLiteral; @@ -257,10 +259,18 @@ public abstract class ExpressionVisitor return visitLiteral(dateLiteral, context); } + public R visitDateV2Literal(DateV2Literal dateV2Literal, C context) { + return visitLiteral(dateV2Literal, context); + } + public R visitDateTimeLiteral(DateTimeLiteral dateTimeLiteral, C context) { return visitLiteral(dateTimeLiteral, context); } + public R visitDateTimeV2Literal(DateTimeV2Literal dateTimeV2Literal, C context) { + return visitLiteral(dateTimeV2Literal, context); + } + public R visitArrayLiteral(ArrayLiteral arrayLiteral, C context) { return visitLiteral(arrayLiteral, context); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java index b046df7c9f..f724e90c74 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java @@ -64,6 +64,11 @@ public class DateTimeV2Type extends DateLikeType { return t2; } + @Override + public String toSql() { + return super.toSql() + "(" + scale + ")"; + } + @Override public Type toCatalogDataType() { return ScalarType.createDatetimeV2Type(scale);