Skip to content

Commit ad0c2c7

Browse files
authored
chore: Move ToPrettyString serde into shim layer (#2549)
1 parent 8724f95 commit ad0c2c7

File tree

3 files changed

+80
-45
lines changed

3 files changed

+80
-45
lines changed

spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -689,46 +689,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
689689
}
690690

691691
versionSpecificExprToProtoInternal(expr, inputs, binding).orElse(expr match {
692-
// ToPrettyString is new in Spark 3.5
693-
case _
694-
if expr.getClass.getSimpleName == "ToPrettyString" && expr
695-
.isInstanceOf[UnaryExpression] && expr.isInstanceOf[TimeZoneAwareExpression] =>
696-
val child = expr.asInstanceOf[UnaryExpression].child
697-
val timezoneId = expr.asInstanceOf[TimeZoneAwareExpression].timeZoneId
698-
699-
val castSupported = CometCast.isSupported(
700-
child.dataType,
701-
DataTypes.StringType,
702-
timezoneId,
703-
CometEvalMode.TRY)
704-
705-
val isCastSupported = castSupported match {
706-
case Compatible(_) => true
707-
case Incompatible(_) => true
708-
case _ => false
709-
}
710-
711-
if (isCastSupported) {
712-
exprToProtoInternal(child, inputs, binding) match {
713-
case Some(p) =>
714-
val toPrettyString = ExprOuterClass.ToPrettyString
715-
.newBuilder()
716-
.setChild(p)
717-
.setTimezone(timezoneId.getOrElse("UTC"))
718-
.setBinaryOutputStyle(binaryOutputStyle)
719-
.build()
720-
Some(
721-
ExprOuterClass.Expr
722-
.newBuilder()
723-
.setToPrettyString(toPrettyString)
724-
.build())
725-
case _ =>
726-
withInfo(expr, child)
727-
None
728-
}
729-
} else {
730-
None
731-
}
732692

733693
case SortOrder(child, direction, nullOrdering, _) =>
734694
val childExpr = exprToProtoInternal(child, inputs, binding)

spark/src/main/spark-3.5/org/apache/comet/shims/CometExprShim.scala

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020
package org.apache.comet.shims
2121

2222
import org.apache.spark.sql.catalyst.expressions._
23+
import org.apache.spark.sql.types.DataTypes
2324

24-
import org.apache.comet.expressions.CometEvalMode
25-
import org.apache.comet.serde.CommonStringExprs
25+
import org.apache.comet.CometSparkSessionExtensions.withInfo
26+
import org.apache.comet.expressions.{CometCast, CometEvalMode}
27+
import org.apache.comet.serde.{CommonStringExprs, Compatible, ExprOuterClass, Incompatible}
2628
import org.apache.comet.serde.ExprOuterClass.{BinaryOutputStyle, Expr}
29+
import org.apache.comet.serde.QueryPlanSerde.exprToProtoInternal
2730

2831
/**
2932
* `CometExprShim` acts as a shim for parsing expressions from different Spark versions.
@@ -43,6 +46,41 @@ trait CometExprShim extends CommonStringExprs {
4346
// Right child is the encoding expression.
4447
stringDecode(expr, s.charset, s.bin, inputs, binding)
4548

49+
case expr @ ToPrettyString(child, timeZoneId) =>
50+
val castSupported = CometCast.isSupported(
51+
child.dataType,
52+
DataTypes.StringType,
53+
timeZoneId,
54+
CometEvalMode.TRY)
55+
56+
val isCastSupported = castSupported match {
57+
case Compatible(_) => true
58+
case Incompatible(_) => true
59+
case _ => false
60+
}
61+
62+
if (isCastSupported) {
63+
exprToProtoInternal(child, inputs, binding) match {
64+
case Some(p) =>
65+
val toPrettyString = ExprOuterClass.ToPrettyString
66+
.newBuilder()
67+
.setChild(p)
68+
.setTimezone(timeZoneId.getOrElse("UTC"))
69+
.setBinaryOutputStyle(binaryOutputStyle)
70+
.build()
71+
Some(
72+
ExprOuterClass.Expr
73+
.newBuilder()
74+
.setToPrettyString(toPrettyString)
75+
.build())
76+
case _ =>
77+
withInfo(expr, child)
78+
None
79+
}
80+
} else {
81+
None
82+
}
83+
4684
case _ => None
4785
}
4886
}

spark/src/main/spark-4.0/org/apache/comet/shims/CometExprShim.scala

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ import org.apache.spark.sql.catalyst.expressions._
2323
import org.apache.spark.sql.catalyst.expressions.objects.StaticInvoke
2424
import org.apache.spark.sql.internal.SQLConf
2525
import org.apache.spark.sql.internal.types.StringTypeWithCollation
26-
import org.apache.spark.sql.types.{BinaryType, BooleanType, StringType}
26+
import org.apache.spark.sql.types.{BinaryType, BooleanType, DataTypes, StringType}
2727

28-
import org.apache.comet.expressions.CometEvalMode
29-
import org.apache.comet.serde.CommonStringExprs
28+
import org.apache.comet.CometSparkSessionExtensions.withInfo
29+
import org.apache.comet.expressions.{CometCast, CometEvalMode}
30+
import org.apache.comet.serde.{CommonStringExprs, Compatible, ExprOuterClass, Incompatible}
3031
import org.apache.comet.serde.ExprOuterClass.{BinaryOutputStyle, Expr}
32+
import org.apache.comet.serde.QueryPlanSerde.exprToProtoInternal
3133

3234
/**
3335
* `CometExprShim` acts as a shim for parsing expressions from different Spark versions.
@@ -66,6 +68,41 @@ trait CometExprShim extends CommonStringExprs {
6668
val Seq(bin, charset, _, _) = s.arguments
6769
stringDecode(expr, charset, bin, inputs, binding)
6870

71+
case expr @ ToPrettyString(child, timeZoneId) =>
72+
val castSupported = CometCast.isSupported(
73+
child.dataType,
74+
DataTypes.StringType,
75+
timeZoneId,
76+
CometEvalMode.TRY)
77+
78+
val isCastSupported = castSupported match {
79+
case Compatible(_) => true
80+
case Incompatible(_) => true
81+
case _ => false
82+
}
83+
84+
if (isCastSupported) {
85+
exprToProtoInternal(child, inputs, binding) match {
86+
case Some(p) =>
87+
val toPrettyString = ExprOuterClass.ToPrettyString
88+
.newBuilder()
89+
.setChild(p)
90+
.setTimezone(timeZoneId.getOrElse("UTC"))
91+
.setBinaryOutputStyle(binaryOutputStyle)
92+
.build()
93+
Some(
94+
ExprOuterClass.Expr
95+
.newBuilder()
96+
.setToPrettyString(toPrettyString)
97+
.build())
98+
case _ =>
99+
withInfo(expr, child)
100+
None
101+
}
102+
} else {
103+
None
104+
}
105+
69106
case _ => None
70107
}
71108
}

0 commit comments

Comments
 (0)