Skip to content

Commit a67008b

Browse files
authored
chore: Introduce exprHandlers map in QueryPlanSerde (#1903)
1 parent 439944b commit a67008b

File tree

2 files changed

+56
-78
lines changed

2 files changed

+56
-78
lines changed

docs/source/user-guide/expressions.md

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ The following Spark expressions are currently available. Any known compatibility
127127
| Log10 | |
128128
| Pow | |
129129
| Round | |
130-
| Signum | Signum does not differentiate between `0.0` and `-0.0` |
130+
| Signum | |
131131
| Sin | |
132132
| Sqrt | |
133133
| Tan | |
@@ -186,16 +186,20 @@ The following Spark expressions are currently available. Any known compatibility
186186

187187
## Arrays
188188

189-
| Expression | Notes |
190-
|-------------------|--------------|
191-
| ArrayAppend | Experimental |
192-
| ArrayContains | Experimental |
193-
| ArrayIntersect | Experimental |
194-
| ArrayJoin | Experimental |
195-
| ArrayRemove | |
196-
| ArraysOverlap | Experimental |
197-
| ElementAt | Arrays only |
198-
| GetArrayItem | |
189+
| Expression | Notes |
190+
| -------------- | ------------ |
191+
| ArrayAppend | Experimental |
192+
| ArrayExcept | Experimental |
193+
| ArrayCompact | Experimental |
194+
| ArrayContains | Experimental |
195+
| ArrayInsert | Experimental |
196+
| ArrayIntersect | Experimental |
197+
| ArrayJoin | Experimental |
198+
| ArrayRemove | |
199+
| ArrayRepeat | Experimental |
200+
| ArraysOverlap | Experimental |
201+
| ElementAt | Arrays only |
202+
| GetArrayItem | |
199203

200204
## Structs
201205

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

Lines changed: 41 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,40 @@ import org.apache.comet.shims.CometExprShim
6161
* An utility object for query plan and expression serialization.
6262
*/
6363
object 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

Comments
 (0)