@@ -61,6 +61,40 @@ import org.apache.comet.shims.CometExprShim
6161 * An utility object for query plan and expression serialization.
6262 */
6363object QueryPlanSerde extends Logging with CometExprShim {
64+
65+ /**
66+ * Mapping of Spark expression class to Comet expression handler.
67+ */
68+ private val exprSerdeMap : Map [Class [_], CometExpressionSerde ] = Map (
69+ classOf [ArrayAppend ] -> CometArrayAppend ,
70+ classOf [ArrayContains ] -> CometArrayContains ,
71+ classOf [ArrayExcept ] -> CometArrayExcept ,
72+ classOf [ArrayInsert ] -> CometArrayInsert ,
73+ classOf [ArrayIntersect ] -> CometArrayIntersect ,
74+ classOf [ArrayJoin ] -> CometArrayJoin ,
75+ classOf [ArrayMax ] -> CometArrayMax ,
76+ classOf [ArrayRemove ] -> CometArrayRemove ,
77+ classOf [ArrayRepeat ] -> CometArrayRepeat ,
78+ classOf [ArraysOverlap ] -> CometArraysOverlap ,
79+ classOf [Ascii ] -> CometAscii ,
80+ classOf [ConcatWs ] -> CometConcatWs ,
81+ classOf [Chr ] -> CometChr ,
82+ classOf [InitCap ] -> CometInitCap ,
83+ classOf [BitLength ] -> CometBitLength ,
84+ classOf [Length ] -> CometLength ,
85+ classOf [StringInstr ] -> CometStringInstr ,
86+ classOf [StringRepeat ] -> CometStringRepeat ,
87+ classOf [StringReplace ] -> CometStringReplace ,
88+ classOf [StringTranslate ] -> CometStringTranslate ,
89+ classOf [StringTrim ] -> CometTrim ,
90+ classOf [StringTrimLeft ] -> CometStringTrimLeft ,
91+ classOf [StringTrimRight ] -> CometStringTrimRight ,
92+ classOf [StringTrimBoth ] -> CometStringTrimBoth ,
93+ classOf [Upper ] -> CometUpper ,
94+ classOf [Lower ] -> CometLower ,
95+ classOf [Murmur3Hash ] -> CometMurmur3Hash ,
96+ classOf [XxHash64 ] -> CometXxHash64 )
97+
6498 def emitWarning (reason : String ): Unit = {
6599 logWarning(s " Comet native execution is disabled due to: $reason" )
66100 }
@@ -1457,9 +1491,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
14571491 val optExpr = scalarFunctionExprToProto(" tan" , childExpr)
14581492 optExprWithInfo(optExpr, expr, child)
14591493
1460- case _ : Ascii =>
1461- CometAscii .convert(expr, inputs, binding)
1462-
14631494 case Expm1 (child) =>
14641495 val childExpr = exprToProtoInternal(child, inputs, binding)
14651496 val optExpr = scalarFunctionExprToProto(" expm1" , childExpr)
@@ -1514,9 +1545,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
15141545 None
15151546 }
15161547
1517- case _ : BitLength =>
1518- CometBitLength .convert(expr, inputs, binding)
1519-
15201548 case If (predicate, trueValue, falseValue) =>
15211549 val predicateExpr = exprToProtoInternal(predicate, inputs, binding)
15221550 val trueExpr = exprToProtoInternal(trueValue, inputs, binding)
@@ -1570,17 +1598,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
15701598 withInfo(expr, allBranches : _* )
15711599 None
15721600 }
1573- case _ : ConcatWs =>
1574- CometConcatWs .convert(expr, inputs, binding)
1575-
1576- case _ : Chr =>
1577- CometChr .convert(expr, inputs, binding)
1578-
1579- case _ : InitCap =>
1580- CometInitCap .convert(expr, inputs, binding)
1581-
1582- case _ : Length =>
1583- CometLength .convert(expr, inputs, binding)
15841601
15851602 case Md5 (child) =>
15861603 val childExpr = exprToProtoInternal(child, inputs, binding)
@@ -1599,36 +1616,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
15991616 val optExpr = scalarFunctionExprToProto(" reverse" , childExpr)
16001617 optExprWithInfo(optExpr, expr, castExpr)
16011618
1602- case _ : StringInstr =>
1603- CometStringInstr .convert(expr, inputs, binding)
1604-
1605- case _ : StringRepeat =>
1606- CometStringRepeat .convert(expr, inputs, binding)
1607-
1608- case _ : StringReplace =>
1609- CometStringReplace .convert(expr, inputs, binding)
1610-
1611- case _ : StringTranslate =>
1612- CometStringTranslate .convert(expr, inputs, binding)
1613-
1614- case _ : StringTrim =>
1615- CometTrim .convert(expr, inputs, binding)
1616-
1617- case _ : StringTrimLeft =>
1618- CometStringTrimLeft .convert(expr, inputs, binding)
1619-
1620- case _ : StringTrimRight =>
1621- CometStringTrimRight .convert(expr, inputs, binding)
1622-
1623- case _ : StringTrimBoth =>
1624- CometStringTrimBoth .convert(expr, inputs, binding)
1625-
1626- case _ : Upper =>
1627- CometUpper .convert(expr, inputs, binding)
1628-
1629- case _ : Lower =>
1630- CometLower .convert(expr, inputs, binding)
1631-
16321619 case BitwiseAnd (left, right) =>
16331620 createBinaryExpr(
16341621 expr,
@@ -1847,10 +1834,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
18471834 None
18481835 }
18491836
1850- case _ : Murmur3Hash => CometMurmur3Hash .convert(expr, inputs, binding)
1851-
1852- case _ : XxHash64 => CometXxHash64 .convert(expr, inputs, binding)
1853-
18541837 case Sha2 (left, numBits) =>
18551838 if (! numBits.foldable) {
18561839 withInfo(expr, " non literal numBits is not supported" )
@@ -1942,8 +1925,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
19421925 None
19431926 }
19441927
1945- case expr if expr.prettyName == " array_insert" => convert(CometArrayInsert )
1946-
19471928 case ElementAt (child, ordinal, defaultValue, failOnError)
19481929 if child.dataType.isInstanceOf [ArrayType ] =>
19491930 val childExpr = exprToProtoInternal(child, inputs, binding)
@@ -1989,18 +1970,8 @@ object QueryPlanSerde extends Logging with CometExprShim {
19891970 withInfo(expr, " unsupported arguments for GetArrayStructFields" , child)
19901971 None
19911972 }
1992- case _ : ArrayRemove => convert(CometArrayRemove )
1993- case _ : ArrayContains => convert(CometArrayContains )
1994- case _ : ArrayMax => convert(CometArrayMax )
1995- case _ : ArrayAppend => convert(CometArrayAppend )
1996- case _ : ArrayIntersect => convert(CometArrayIntersect )
1997- case _ : ArrayJoin => convert(CometArrayJoin )
1998- case _ : ArraysOverlap => convert(CometArraysOverlap )
1999- case _ : ArrayRepeat => convert(CometArrayRepeat )
20001973 case _ @ ArrayFilter (_, func) if func.children.head.isInstanceOf [IsNotNull ] =>
20011974 convert(CometArrayCompact )
2002- case _ : ArrayExcept =>
2003- convert(CometArrayExcept )
20041975 case mk : MapKeys =>
20051976 val childExpr = exprToProtoInternal(mk.child, inputs, binding)
20061977 scalarFunctionExprToProto(" map_keys" , childExpr)
@@ -2011,11 +1982,14 @@ object QueryPlanSerde extends Logging with CometExprShim {
20111982 val mapExpr = exprToProtoInternal(gmv.child, inputs, binding)
20121983 val keyExpr = exprToProtoInternal(gmv.key, inputs, binding)
20131984 scalarFunctionExprToProto(" map_extract" , mapExpr, keyExpr)
2014- case _ =>
2015- withInfo(expr, s " ${expr.prettyName} is not supported " , expr.children: _* )
2016- None
1985+ case expr =>
1986+ QueryPlanSerde .exprSerdeMap.get(expr.getClass) match {
1987+ case Some (handler) => convert(handler)
1988+ case _ =>
1989+ withInfo(expr, s " ${expr.prettyName} is not supported " , expr.children: _* )
1990+ None
1991+ }
20171992 }
2018-
20191993 }
20201994
20211995 /**
0 commit comments