You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by ma...@apache.org on 2015/07/14 19:20:20 UTC
spark git commit: [SPARK-9029] [SQL] shortcut CaseKeyWhen if key is
null
Repository: spark
Updated Branches:
refs/heads/master 257236c3e -> 59d820aa8
[SPARK-9029] [SQL] shortcut CaseKeyWhen if key is null
Author: Wenchen Fan <cl...@outlook.com>
Closes #7389 from cloud-fan/case-when and squashes the following commits:
ea4b6ba [Wenchen Fan] shortcut for case key when
Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/59d820aa
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/59d820aa
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/59d820aa
Branch: refs/heads/master
Commit: 59d820aa8dec08b744971237860b4c6bef577ddf
Parents: 257236c
Author: Wenchen Fan <cl...@outlook.com>
Authored: Tue Jul 14 10:20:15 2015 -0700
Committer: Michael Armbrust <mi...@databricks.com>
Committed: Tue Jul 14 10:20:15 2015 -0700
----------------------------------------------------------------------
.../sql/catalyst/expressions/conditionals.scala | 48 ++++++++++----------
1 file changed, 24 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/spark/blob/59d820aa/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionals.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionals.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionals.scala
index eea7706..c7f039e 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionals.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionals.scala
@@ -230,24 +230,31 @@ case class CaseKeyWhen(key: Expression, branches: Seq[Expression]) extends CaseW
}
}
+ private def evalElse(input: InternalRow): Any = {
+ if (branchesArr.length % 2 == 0) {
+ null
+ } else {
+ branchesArr(branchesArr.length - 1).eval(input)
+ }
+ }
+
/** Written in imperative fashion for performance considerations. */
override def eval(input: InternalRow): Any = {
val evaluatedKey = key.eval(input)
- val len = branchesArr.length
- var i = 0
- // If all branches fail and an elseVal is not provided, the whole statement
- // defaults to null, according to Hive's semantics.
- while (i < len - 1) {
- if (threeValueEquals(evaluatedKey, branchesArr(i).eval(input))) {
- return branchesArr(i + 1).eval(input)
+ // If key is null, we can just return the else part or null if there is no else.
+ // If key is not null but doesn't match any when part, we need to return
+ // the else part or null if there is no else, according to Hive's semantics.
+ if (evaluatedKey != null) {
+ val len = branchesArr.length
+ var i = 0
+ while (i < len - 1) {
+ if (evaluatedKey == branchesArr(i).eval(input)) {
+ return branchesArr(i + 1).eval(input)
+ }
+ i += 2
}
- i += 2
}
- var res: Any = null
- if (i == len - 1) {
- res = branchesArr(i).eval(input)
- }
- return res
+ evalElse(input)
}
override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): String = {
@@ -261,8 +268,7 @@ case class CaseKeyWhen(key: Expression, branches: Seq[Expression]) extends CaseW
s"""
if (!$got) {
${cond.code}
- if (!${keyEval.isNull} && !${cond.isNull}
- && ${ctx.genEqual(key.dataType, keyEval.primitive, cond.primitive)}) {
+ if (!${cond.isNull} && ${ctx.genEqual(key.dataType, keyEval.primitive, cond.primitive)}) {
$got = true;
${res.code}
${ev.isNull} = ${res.isNull};
@@ -290,19 +296,13 @@ case class CaseKeyWhen(key: Expression, branches: Seq[Expression]) extends CaseW
boolean ${ev.isNull} = true;
${ctx.javaType(dataType)} ${ev.primitive} = ${ctx.defaultValue(dataType)};
${keyEval.code}
- $cases
+ if (!${keyEval.isNull}) {
+ $cases
+ }
$other
"""
}
- private def threeValueEquals(l: Any, r: Any) = {
- if (l == null || r == null) {
- false
- } else {
- l == r
- }
- }
-
override def toString: String = {
s"CASE $key" + branches.sliding(2, 2).map {
case Seq(cond, value) => s" WHEN $cond THEN $value"
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org