Github user cloud-fan commented on a diff in the pull request:
https://github.com/apache/spark/pull/19778#discussion_r151958049
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
---
@@ -224,22 +224,55 @@ case class Elt(children: Seq[Expression])
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode):
ExprCode = {
val index = indexExpr.genCode(ctx)
val strings = stringExprs.map(_.genCode(ctx))
+ val indexVal = ctx.freshName("index")
+ val stringVal = ctx.freshName("stringVal")
val assignStringValue = strings.zipWithIndex.map { case (eval, index)
=>
s"""
case ${index + 1}:
- ${ev.value} = ${eval.isNull} ? null : ${eval.value};
+ ${eval.code}
+ $stringVal = ${eval.isNull} ? null : ${eval.value};
break;
"""
- }.mkString("\n")
- val indexVal = ctx.freshName("index")
- val stringArray = ctx.freshName("strings");
+ }
- ev.copy(index.code + "\n" + strings.map(_.code).mkString("\n") + s"""
- final int $indexVal = ${index.value};
- UTF8String ${ev.value} = null;
- switch ($indexVal) {
- $assignStringValue
+ val cases = ctx.splitCodes(assignStringValue)
+ val codes = if (cases.length == 1) {
+ s"""
+ UTF8String $stringVal = null;
+ switch ($indexVal) {
+ ${cases.head}
+ }
+ """
+ } else {
+ var fullFuncName = ""
+ cases.reverse.zipWithIndex.map { case (s, index) =>
--- End diff --
I'd like to make it more imperative:
```
var prevFunc = "null"
for (case <- cases) {
val funcName = ...
val funcBody = ...
prevFunc = ctx.addNewFunction
}
s"UTF8String $stringVal = $prevFunc(${ctx.INPUT_ROW}, $indexVal);"
```
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]