morrySnow commented on code in PR #47319:
URL: https://github.com/apache/doris/pull/47319#discussion_r1955883501


##########
fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java:
##########
@@ -0,0 +1,269 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.analysis;
+
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.common.FormatOptions;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.thrift.TExprNode;
+import org.apache.doris.thrift.TExprNodeType;
+import org.apache.doris.thrift.TTimeV2Literal;
+
+public class TimeV2Literal extends LiteralExpr {
+
+    public static final TimeV2Literal MIN_TIME = new TimeV2Literal(-838, 0, 0, 
0, 0);
+    public static final TimeV2Literal MAX_TIME = new TimeV2Literal(838, 59, 
59, 999999, 6);
+
+    protected float hour;
+    protected long minute;
+    protected long second;
+    protected long microsecond;
+
+    /**
+     * C'tor forcing type, e.g., due to implicit cast
+     */
+    // for restore
+    private TimeV2Literal() {
+        this.type = Type.TIMEV2;
+        this.hour = 0;
+        this.minute = 0;
+        this.second = 0;
+        this.microsecond = 0;
+    }
+
+    public TimeV2Literal(float hour, long minute, long second) {
+        super();
+        this.type = Type.TIMEV2;
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = 0;
+        analysisDone();
+    }
+
+    public TimeV2Literal(float hour, long minute, long second, long 
microsecond, long scale) {
+        super();
+        this.type = ScalarType.createTimeV2Type((int) scale);
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = microsecond;
+        while (microsecond != 0 && this.microsecond < 100000) {
+            this.microsecond *= 10;
+        }
+        analysisDone();
+    }
+
+    public TimeV2Literal(String s) throws AnalysisException {
+        super();
+        init(s);
+        analysisDone();
+    }
+
+    protected TimeV2Literal(TimeV2Literal other) {
+        super(other);
+        this.type = ScalarType.createTimeV2Type(((ScalarType) 
other.type).getScalarScale());
+        this.hour = other.getHour();
+        this.minute = other.getMinute();
+        this.second = other.getSecond();
+        this.microsecond = other.getMicroSecond();
+    }
+
+    @Override
+    public Expr clone() {
+        return new TimeV2Literal(this);
+    }
+
+    protected void init(String s) throws AnalysisException {
+        // should like be/src/vec/runtime/time_value.h 
timev2_to_double_from_str
+        if (!s.contains(":")) {
+            boolean sign = false;
+            String tail = "";

Review Comment:
   could u split this function into two functions: normalize string and parse 
string



##########
fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java:
##########
@@ -0,0 +1,269 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.analysis;
+
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.common.FormatOptions;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.thrift.TExprNode;
+import org.apache.doris.thrift.TExprNodeType;
+import org.apache.doris.thrift.TTimeV2Literal;
+
+public class TimeV2Literal extends LiteralExpr {
+
+    public static final TimeV2Literal MIN_TIME = new TimeV2Literal(-838, 0, 0, 
0, 0);
+    public static final TimeV2Literal MAX_TIME = new TimeV2Literal(838, 59, 
59, 999999, 6);
+
+    protected float hour;
+    protected long minute;
+    protected long second;
+    protected long microsecond;
+
+    /**
+     * C'tor forcing type, e.g., due to implicit cast
+     */
+    // for restore
+    private TimeV2Literal() {
+        this.type = Type.TIMEV2;
+        this.hour = 0;
+        this.minute = 0;
+        this.second = 0;
+        this.microsecond = 0;
+    }
+
+    public TimeV2Literal(float hour, long minute, long second) {
+        super();
+        this.type = Type.TIMEV2;
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = 0;
+        analysisDone();
+    }
+
+    public TimeV2Literal(float hour, long minute, long second, long 
microsecond, long scale) {
+        super();
+        this.type = ScalarType.createTimeV2Type((int) scale);
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = microsecond;
+        while (microsecond != 0 && this.microsecond < 100000) {
+            this.microsecond *= 10;
+        }
+        analysisDone();
+    }
+
+    public TimeV2Literal(String s) throws AnalysisException {
+        super();
+        init(s);
+        analysisDone();
+    }
+
+    protected TimeV2Literal(TimeV2Literal other) {
+        super(other);
+        this.type = ScalarType.createTimeV2Type(((ScalarType) 
other.type).getScalarScale());
+        this.hour = other.getHour();
+        this.minute = other.getMinute();
+        this.second = other.getSecond();
+        this.microsecond = other.getMicroSecond();
+    }
+
+    @Override
+    public Expr clone() {
+        return new TimeV2Literal(this);
+    }
+
+    protected void init(String s) throws AnalysisException {
+        // should like be/src/vec/runtime/time_value.h 
timev2_to_double_from_str
+        if (!s.contains(":")) {

Review Comment:
   do we need do trim before parse string?



##########
fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java:
##########
@@ -0,0 +1,269 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.analysis;
+
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.common.FormatOptions;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.thrift.TExprNode;
+import org.apache.doris.thrift.TExprNodeType;
+import org.apache.doris.thrift.TTimeV2Literal;
+
+public class TimeV2Literal extends LiteralExpr {
+
+    public static final TimeV2Literal MIN_TIME = new TimeV2Literal(-838, 0, 0, 
0, 0);
+    public static final TimeV2Literal MAX_TIME = new TimeV2Literal(838, 59, 
59, 999999, 6);
+
+    protected float hour;
+    protected long minute;
+    protected long second;
+    protected long microsecond;
+
+    /**
+     * C'tor forcing type, e.g., due to implicit cast
+     */
+    // for restore
+    private TimeV2Literal() {
+        this.type = Type.TIMEV2;
+        this.hour = 0;
+        this.minute = 0;
+        this.second = 0;
+        this.microsecond = 0;
+    }
+
+    public TimeV2Literal(float hour, long minute, long second) {
+        super();
+        this.type = Type.TIMEV2;
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = 0;
+        analysisDone();
+    }
+
+    public TimeV2Literal(float hour, long minute, long second, long 
microsecond, long scale) {
+        super();
+        this.type = ScalarType.createTimeV2Type((int) scale);
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = microsecond;
+        while (microsecond != 0 && this.microsecond < 100000) {
+            this.microsecond *= 10;
+        }
+        analysisDone();
+    }
+
+    public TimeV2Literal(String s) throws AnalysisException {
+        super();
+        init(s);
+        analysisDone();
+    }
+
+    protected TimeV2Literal(TimeV2Literal other) {
+        super(other);
+        this.type = ScalarType.createTimeV2Type(((ScalarType) 
other.type).getScalarScale());
+        this.hour = other.getHour();
+        this.minute = other.getMinute();
+        this.second = other.getSecond();
+        this.microsecond = other.getMicroSecond();
+    }
+
+    @Override
+    public Expr clone() {
+        return new TimeV2Literal(this);
+    }
+
+    protected void init(String s) throws AnalysisException {
+        // should like be/src/vec/runtime/time_value.h 
timev2_to_double_from_str
+        if (!s.contains(":")) {
+            boolean sign = false;
+            String tail = "";
+            if (s.charAt(0) == '-') {
+                s = s.substring(1);
+                sign = true;
+            }
+            if (s.contains(".")) {
+                tail = s.substring(s.indexOf("."));
+                s = s.substring(0, s.indexOf("."));
+            }
+            int len = s.length();
+            if (len == 1) {
+                s = "00:00:0" + s;
+            } else if (len == 2) {
+                s = "00:00:" + s;
+            } else if (len == 3) {
+                s = "00:0" + s.charAt(0) + ":" + s.substring(1);
+            } else if (len == 4) {
+                s = "00:" + s.substring(0, 2) + ":" + s.substring(2);
+            } else {
+                s = s.substring(0, len - 4) + ":" + s.substring(len - 4, len - 
2) + ":" + s.substring(len - 2);
+            }
+            if (sign) {
+                s = '-' + s;
+            }
+            s = s + tail;
+        }
+        if (s.indexOf(':') == s.lastIndexOf(':')) {
+            s = s + ":00";
+        }
+        String[] parts = s.split(":");
+        if (parts.length != 3) {
+            throw new AnalysisException("Invalid format, must have 3 parts 
separated by ':'");
+        }
+        int scale = 0;
+        try {
+            hour = Float.parseFloat(parts[0]);
+        } catch (NumberFormatException e) {
+            throw new AnalysisException("Invalid hour format", e);
+        }
+
+        try {
+            minute = Long.parseLong(parts[1]);
+        } catch (NumberFormatException e) {
+            throw new AnalysisException("Invalid minute format", e);
+        }
+
+        String[] secondParts = parts[2].split("\\.");
+        if (secondParts.length > 2) {
+            throw new AnalysisException("Invalid second format");
+        }
+
+        try {
+            second = Long.parseLong(secondParts[0]);
+        } catch (NumberFormatException e) {
+            throw new AnalysisException("Invalid second format", e);
+        }
+
+        if (secondParts.length == 2) {
+            String microStr = secondParts[1];
+            scale = microStr.length();
+
+            if (scale > 6) {
+                microStr = microStr.substring(0, 6);
+            }
+
+            StringBuilder sb = new StringBuilder(microStr);
+            while (sb.length() < 6) {
+                sb.append('0');
+            }
+
+            try {
+                microsecond = Long.parseLong(sb.toString());
+            } catch (NumberFormatException e) {
+                throw new AnalysisException("Invalid microsecond format", e);
+            }
+        } else {
+            microsecond = 0L;
+            scale = 0;
+        }
+
+        this.type = ScalarType.createTimeV2Type(scale);
+        if (checkRange(hour, minute, second, microsecond)) {
+            throw new AnalysisException("time literal [" + s + "] is out of 
range");
+        }
+    }
+
+    @Override
+    protected String toSqlImpl() {
+        return "\"" + getStringValue() + "\"";
+    }
+
+    @Override
+    protected void toThrift(TExprNode msg) {
+        msg.node_type = TExprNodeType.TIMEV2_LITERAL;
+        msg.timev2_literal = new TTimeV2Literal(getStringValue());

Review Comment:
   why use string to do SerDe, why not use four attr to present from hour to 
microsecond? this will lead to be do some useless parsing job



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/TimeV2Literal.java:
##########
@@ -0,0 +1,265 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions.literal;
+
+import org.apache.doris.analysis.LiteralExpr;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.TimeV2Type;
+
+import java.time.LocalDateTime;
+
+/**
+ * Time literal in Nereids.
+ */
+public class TimeV2Literal extends Literal {
+    private static final LocalDateTime START_OF_A_DAY = LocalDateTime.of(0, 1, 
1, 0, 0, 0);
+    private static final LocalDateTime END_OF_A_DAY = LocalDateTime.of(9999, 
12, 31, 23, 59, 59, 999999000);
+    private static final TimeV2Literal MIN_TIME = new TimeV2Literal(-838, 0, 
0, 0, 0);
+    private static final TimeV2Literal MAX_TIME = new TimeV2Literal(838, 59, 
59, 999999, 6);
+
+    protected float hour;
+    protected long minute;
+    protected long second;
+    protected long microsecond;
+    protected long scale;
+
+    public TimeV2Literal(String s) throws AnalysisException {
+        this(TimeV2Type.INSTANCE, s);
+    }
+
+    protected TimeV2Literal(TimeV2Type dataType, String s) throws 
AnalysisException {
+        super(dataType);
+        init(s);
+    }
+
+    /**
+     * C'tor time literal.
+     */
+    public TimeV2Literal(float hour, long minute, long second) {
+        this(TimeV2Type.INSTANCE, hour, minute, second);
+    }
+
+    /**
+     * C'tor for time type.
+     */
+    public TimeV2Literal(TimeV2Type dataType, float hour, long minute, long 
second) {
+        super(dataType);
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = 0;
+        this.scale = dataType.getScale();
+    }
+
+    /**
+     * C'tor for time type.
+     */
+    public TimeV2Literal(float hour, long minute, long second, long 
microsecond, int scale) {
+        super(TimeV2Type.INSTANCE);
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = microsecond;
+        while (microsecond != 0 && this.microsecond < 100000) {
+            this.microsecond *= 10;
+        }
+        this.scale = scale;
+    }
+
+    protected void init(String s) throws AnalysisException {

Review Comment:
   same as legacy planner's time literal



##########
fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java:
##########
@@ -0,0 +1,269 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.analysis;
+
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.common.FormatOptions;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.thrift.TExprNode;
+import org.apache.doris.thrift.TExprNodeType;
+import org.apache.doris.thrift.TTimeV2Literal;
+
+public class TimeV2Literal extends LiteralExpr {
+
+    public static final TimeV2Literal MIN_TIME = new TimeV2Literal(-838, 0, 0, 
0, 0);
+    public static final TimeV2Literal MAX_TIME = new TimeV2Literal(838, 59, 
59, 999999, 6);
+
+    protected float hour;
+    protected long minute;
+    protected long second;
+    protected long microsecond;

Review Comment:
   why hour is float and others are long? could u add some comment to explain 
it?



##########
fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java:
##########
@@ -0,0 +1,269 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.analysis;
+
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.common.FormatOptions;
+import org.apache.doris.nereids.exceptions.AnalysisException;
+import org.apache.doris.thrift.TExprNode;
+import org.apache.doris.thrift.TExprNodeType;
+import org.apache.doris.thrift.TTimeV2Literal;
+
+public class TimeV2Literal extends LiteralExpr {
+
+    public static final TimeV2Literal MIN_TIME = new TimeV2Literal(-838, 0, 0, 
0, 0);
+    public static final TimeV2Literal MAX_TIME = new TimeV2Literal(838, 59, 
59, 999999, 6);
+
+    protected float hour;
+    protected long minute;
+    protected long second;
+    protected long microsecond;
+
+    /**
+     * C'tor forcing type, e.g., due to implicit cast
+     */
+    // for restore
+    private TimeV2Literal() {
+        this.type = Type.TIMEV2;
+        this.hour = 0;
+        this.minute = 0;
+        this.second = 0;
+        this.microsecond = 0;
+    }
+
+    public TimeV2Literal(float hour, long minute, long second) {
+        super();
+        this.type = Type.TIMEV2;
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = 0;
+        analysisDone();
+    }
+
+    public TimeV2Literal(float hour, long minute, long second, long 
microsecond, long scale) {
+        super();
+        this.type = ScalarType.createTimeV2Type((int) scale);
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.microsecond = microsecond;
+        while (microsecond != 0 && this.microsecond < 100000) {
+            this.microsecond *= 10;
+        }
+        analysisDone();
+    }
+
+    public TimeV2Literal(String s) throws AnalysisException {
+        super();
+        init(s);
+        analysisDone();
+    }
+
+    protected TimeV2Literal(TimeV2Literal other) {
+        super(other);
+        this.type = ScalarType.createTimeV2Type(((ScalarType) 
other.type).getScalarScale());
+        this.hour = other.getHour();
+        this.minute = other.getMinute();
+        this.second = other.getSecond();
+        this.microsecond = other.getMicroSecond();
+    }
+
+    @Override
+    public Expr clone() {
+        return new TimeV2Literal(this);
+    }
+
+    protected void init(String s) throws AnalysisException {
+        // should like be/src/vec/runtime/time_value.h 
timev2_to_double_from_str
+        if (!s.contains(":")) {
+            boolean sign = false;
+            String tail = "";
+            if (s.charAt(0) == '-') {
+                s = s.substring(1);
+                sign = true;
+            }
+            if (s.contains(".")) {
+                tail = s.substring(s.indexOf("."));
+                s = s.substring(0, s.indexOf("."));
+            }
+            int len = s.length();
+            if (len == 1) {
+                s = "00:00:0" + s;
+            } else if (len == 2) {
+                s = "00:00:" + s;
+            } else if (len == 3) {
+                s = "00:0" + s.charAt(0) + ":" + s.substring(1);
+            } else if (len == 4) {
+                s = "00:" + s.substring(0, 2) + ":" + s.substring(2);
+            } else {
+                s = s.substring(0, len - 4) + ":" + s.substring(len - 4, len - 
2) + ":" + s.substring(len - 2);
+            }
+            if (sign) {
+                s = '-' + s;
+            }
+            s = s + tail;
+        }
+        if (s.indexOf(':') == s.lastIndexOf(':')) {

Review Comment:
   if `s` does not contain `':'`, if statement will be true, and then append 
`":00"` on `s`?



##########
fe/fe-core/src/test/java/org/apache/doris/analysis/TimeV2LiteralTest.java:
##########
@@ -15,36 +15,29 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.types;
-
-import org.apache.doris.catalog.Type;
-import org.apache.doris.nereids.types.coercion.PrimitiveType;
-import org.apache.doris.nereids.types.coercion.RangeScalable;
-
-/**
- * Datetime type in Nereids.
- */
-public class TimeType extends PrimitiveType implements RangeScalable {
-
-    public static final TimeType INSTANCE = new TimeType();
-
-    private static final int WIDTH = 8;
-
-    private TimeType() {
+package org.apache.doris.analysis;
+
+import org.apache.doris.common.AnalysisException;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TimeV2LiteralTest {
+
+    @Test
+    public void testTimeLiteralCreate() throws AnalysisException {
+        TimeV2Literal literal = new TimeV2Literal("12:12:12");

Review Comment:
   need test parameter without `':'`



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to