Anthrino commented on code in PR #3677:
URL: https://github.com/apache/calcite/pull/3677#discussion_r1556274714
##########
core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java:
##########
@@ -647,58 +541,225 @@ private static Expression checkExpressionPadTruncate(
}
}
+ private Expression translateCastToDate(RelDataType sourceType,
+ Expression operand, ConstantExpression format,
+ Supplier<Expression> defaultExpression) {
+
+ switch (sourceType.getSqlTypeName()) {
+ case CHAR:
+ case VARCHAR:
+ // If format string is supplied, parse formatted string into date
+ return Expressions.isConstantNull(format)
+ ? Expressions.call(BuiltInMethod.STRING_TO_DATE.method, operand)
+ :
Expressions.call(Expressions.new_(BuiltInMethod.PARSE_DATE.method.getDeclaringClass()),
+ BuiltInMethod.PARSE_DATE.method, format, operand);
+
+ case TIMESTAMP:
+ return
+ Expressions.convert_(
+ Expressions.call(BuiltInMethod.FLOOR_DIV.method,
+ operand, Expressions.constant(DateTimeUtils.MILLIS_PER_DAY)),
+ int.class);
+
+ case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
+ return
+ RexImpTable.optimize2(
+ operand, Expressions.call(
+ BuiltInMethod.TIMESTAMP_WITH_LOCAL_TIME_ZONE_TO_DATE.method,
+ operand,
+ Expressions.call(BuiltInMethod.TIME_ZONE.method, root)));
+
+ default:
+ return defaultExpression.get();
+ }
+ }
+
private Expression translateCastToTime(RelDataType sourceType,
- Expression operand, Supplier<Expression> defaultExpression) {
+ Expression operand, ConstantExpression format, Supplier<Expression>
defaultExpression) {
+
switch (sourceType.getSqlTypeName()) {
case CHAR:
case VARCHAR:
- return Expressions.call(BuiltInMethod.STRING_TO_TIME.method, operand);
+ // If format string is supplied, parse formatted string into time
+ return Expressions.isConstantNull(format)
+ ? Expressions.call(BuiltInMethod.STRING_TO_TIME.method, operand)
+ :
Expressions.call(Expressions.new_(BuiltInMethod.PARSE_TIME.method.getDeclaringClass()),
+ BuiltInMethod.PARSE_TIME.method, format, operand);
case TIME_WITH_LOCAL_TIME_ZONE:
- return RexImpTable.optimize2(operand,
- Expressions.call(
- BuiltInMethod.TIME_WITH_LOCAL_TIME_ZONE_TO_TIME.method,
- operand,
- Expressions.call(BuiltInMethod.TIME_ZONE.method, root)));
+ return
+ RexImpTable.optimize2(
+ operand, Expressions.call(
+ BuiltInMethod.TIME_WITH_LOCAL_TIME_ZONE_TO_TIME.method,
+ operand,
+ Expressions.call(BuiltInMethod.TIME_ZONE.method, root)));
case TIMESTAMP:
- return Expressions.convert_(
- Expressions.call(BuiltInMethod.FLOOR_MOD.method,
- operand,
- Expressions.constant(DateTimeUtils.MILLIS_PER_DAY)),
- int.class);
+ return
+ Expressions.convert_(
+ Expressions.call(BuiltInMethod.FLOOR_MOD.method,
+ operand,
+ Expressions.constant(DateTimeUtils.MILLIS_PER_DAY)),
+ int.class);
+
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
- return RexImpTable.optimize2(operand,
- Expressions.call(
- BuiltInMethod.TIMESTAMP_WITH_LOCAL_TIME_ZONE_TO_TIME.method,
- operand,
- Expressions.call(BuiltInMethod.TIME_ZONE.method, root)));
+ return
+ RexImpTable.optimize2(
+ operand, Expressions.call(
+ BuiltInMethod.TIMESTAMP_WITH_LOCAL_TIME_ZONE_TO_TIME.method,
+ operand,
+ Expressions.call(BuiltInMethod.TIME_ZONE.method, root)));
default:
return defaultExpression.get();
}
}
- private Expression translateCastToDate(RelDataType sourceType,
+ private Expression translateCastToTimeWithLocalTimeZone(RelDataType
sourceType,
Expression operand, Supplier<Expression> defaultExpression) {
+
switch (sourceType.getSqlTypeName()) {
case CHAR:
case VARCHAR:
- return Expressions.call(BuiltInMethod.STRING_TO_DATE.method, operand);
+ return
+
Expressions.call(BuiltInMethod.STRING_TO_TIME_WITH_LOCAL_TIME_ZONE.method,
operand);
+
+ case TIME:
+ return
+
Expressions.call(BuiltInMethod.TIME_STRING_TO_TIME_WITH_LOCAL_TIME_ZONE.method,
+ RexImpTable.optimize2(operand,
+ Expressions.call(BuiltInMethod.UNIX_TIME_TO_STRING.method,
+ operand)),
+ Expressions.call(BuiltInMethod.TIME_ZONE.method, root));
case TIMESTAMP:
- return Expressions.convert_(
- Expressions.call(BuiltInMethod.FLOOR_DIV.method,
- operand, Expressions.constant(DateTimeUtils.MILLIS_PER_DAY)),
- int.class);
+ return
+
Expressions.call(BuiltInMethod.TIMESTAMP_STRING_TO_TIMESTAMP_WITH_LOCAL_TIME_ZONE.method,
+ RexImpTable.optimize2(operand,
+
Expressions.call(BuiltInMethod.UNIX_TIMESTAMP_TO_STRING.method,
+ operand)),
+ Expressions.call(BuiltInMethod.TIME_ZONE.method, root));
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
- return RexImpTable.optimize2(operand,
- Expressions.call(
- BuiltInMethod.TIMESTAMP_WITH_LOCAL_TIME_ZONE_TO_DATE.method,
- operand,
- Expressions.call(BuiltInMethod.TIME_ZONE.method, root)));
+ return
+ RexImpTable.optimize2(
+ operand, Expressions.call(
+ BuiltInMethod
+
.TIMESTAMP_WITH_LOCAL_TIME_ZONE_TO_TIME_WITH_LOCAL_TIME_ZONE
+ .method,
+ operand));
+
+ default:
+ return defaultExpression.get();
+ }
+ }
+
+ private Expression translateCastToTimestamp(RelDataType sourceType,
+ Expression operand, ConstantExpression format, Supplier<Expression>
defaultExpression) {
+
+ switch (sourceType.getSqlTypeName()) {
+ case CHAR:
+ case VARCHAR:
+ // If format string is supplied, parse formatted string into timestamp
+ return Expressions.isConstantNull(format)
+ ? Expressions.call(BuiltInMethod.STRING_TO_TIMESTAMP.method, operand)
+ : Expressions.call(
+
Expressions.new_(BuiltInMethod.PARSE_TIMESTAMP.method.getDeclaringClass()),
+ BuiltInMethod.PARSE_TIMESTAMP.method, format, operand);
+
+ case DATE:
+ return
+ Expressions.multiply(Expressions.convert_(operand, long.class),
+ Expressions.constant(DateTimeUtils.MILLIS_PER_DAY));
+
+ case TIME:
+ return
+ Expressions.add(
+ Expressions.multiply(
+ Expressions.convert_(
+ Expressions.call(BuiltInMethod.CURRENT_DATE.method,
root),
+ long.class),
+ Expressions.constant(DateTimeUtils.MILLIS_PER_DAY)),
+ Expressions.convert_(operand, long.class));
+
+ case TIME_WITH_LOCAL_TIME_ZONE:
+ return
+ RexImpTable.optimize2(
+ operand, Expressions.call(
+ BuiltInMethod.TIME_WITH_LOCAL_TIME_ZONE_TO_TIMESTAMP.method,
+ Expressions.call(BuiltInMethod.UNIX_DATE_TO_STRING.method,
+ Expressions.call(BuiltInMethod.CURRENT_DATE.method,
root)),
+ operand,
+ Expressions.call(BuiltInMethod.TIME_ZONE.method, root)));
+
+ case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
+ return
+ RexImpTable.optimize2(
+ operand, Expressions.call(
+
BuiltInMethod.TIMESTAMP_WITH_LOCAL_TIME_ZONE_TO_TIMESTAMP.method,
+ operand,
+ Expressions.call(BuiltInMethod.TIME_ZONE.method, root)));
+
+ default:
+ return defaultExpression.get();
+ }
+ }
+
+ private Expression translateCastToTimestampWithLocalTimeZone(RelDataType
sourceType,
+ Expression operand, Supplier<Expression> defaultExpression) {
+
+ switch (sourceType.getSqlTypeName()) {
+ case CHAR:
+ case VARCHAR:
+ return
+
Expressions.call(BuiltInMethod.STRING_TO_TIMESTAMP_WITH_LOCAL_TIME_ZONE.method,
+ operand);
+
Review Comment:
I don't think its an added newline, just the line separators between each
case statement like it was there before?
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]