[enhancement](Nereids) implement to legacy literal for datetimev2 literal (#17177)

This commit is contained in:
morrySnow
2023-02-28 14:51:38 +08:00
committed by GitHub
parent 3e40467ce6
commit 37551a0163
8 changed files with 63 additions and 10 deletions

View File

@ -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<Expr, PlanTra
}
@Override
public Expr visitDateTimeLiteral(DateTimeLiteral dateTimeLiteral, PlanTranslatorContext context) {
public Expr visitDateTimeV2Literal(DateTimeV2Literal dateTimeV2Literal, PlanTranslatorContext context) {
// BE not support date v2 literal and datetime v2 literal
if (dateTimeLiteral instanceof DateTimeV2Literal) {
return new CastExpr(Type.DATETIMEV2, new StringLiteral(dateTimeLiteral.toString()));
}
return super.visitDateTimeLiteral(dateTimeLiteral, context);
int scale = dateTimeV2Literal.getDataType().getScale();
return new CastExpr(ScalarType.createDatetimeV2Type(scale),
new StringLiteral(dateTimeV2Literal.getStringValue()));
}
@Override

View File

@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.ArrayType;
import org.apache.doris.nereids.types.BigIntType;
import org.apache.doris.nereids.types.BooleanType;
import org.apache.doris.nereids.types.DataType;
import org.apache.doris.nereids.types.DateTimeType;
import org.apache.doris.nereids.types.DateTimeV2Type;
import org.apache.doris.nereids.types.DateType;
@ -71,6 +72,11 @@ public class ArrayMax extends CompatibleTypeArrayFunction
super("array_max", arg);
}
@Override
public DataType getDataType() {
return ((ArrayType) (child().getDataType())).getItemType();
}
/**
* withChildren.
*/

View File

@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.ArrayType;
import org.apache.doris.nereids.types.BigIntType;
import org.apache.doris.nereids.types.BooleanType;
import org.apache.doris.nereids.types.DataType;
import org.apache.doris.nereids.types.DateTimeType;
import org.apache.doris.nereids.types.DateTimeV2Type;
import org.apache.doris.nereids.types.DateType;
@ -71,6 +72,11 @@ public class ArrayMin extends CompatibleTypeArrayFunction
super("array_min", arg);
}
@Override
public DataType getDataType() {
return ((ArrayType) (child().getDataType())).getItemType();
}
/**
* withChildren.
*/

View File

@ -17,7 +17,9 @@
package org.apache.doris.nereids.trees.expressions.literal;
import org.apache.doris.analysis.LiteralExpr;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeV2Type;
import org.apache.doris.nereids.util.DateUtils;
@ -29,7 +31,11 @@ import java.time.LocalDateTime;
public class DateTimeV2Literal extends DateTimeLiteral {
public DateTimeV2Literal(String s) {
super(DateTimeV2Type.MAX, s);
this(DateTimeV2Type.MAX, s);
}
public DateTimeV2Literal(DateTimeV2Type dateType, String s) {
super(dateType, s);
}
public DateTimeV2Literal(long year, long month, long day, long hour, long minute, long second, long microSecond) {
@ -46,14 +52,28 @@ public class DateTimeV2Literal extends DateTimeLiteral {
return (DateTimeV2Type) super.getDataType();
}
@Override
public <R, C> R accept(ExpressionVisitor<R, C> 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

View File

@ -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, C> R accept(ExpressionVisitor<R, C> 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());

View File

@ -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!");
}

View File

@ -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<R, C>
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);
}

View File

@ -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);