You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by da...@apache.org on 2015/06/30 17:08:29 UTC
spark git commit: [SPARK-8723] [SQL] improve divide and remainder
code gen
Repository: spark
Updated Branches:
refs/heads/master 08fab4843 -> 865a834e5
[SPARK-8723] [SQL] improve divide and remainder code gen
We can avoid execution of both left and right expression by null and zero check.
Author: Wenchen Fan <cl...@outlook.com>
Closes #7111 from cloud-fan/cg and squashes the following commits:
d6b12ef [Wenchen Fan] improve divide and remainder code gen
Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/865a834e
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/865a834e
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/865a834e
Branch: refs/heads/master
Commit: 865a834e51ac3074811a11fd99a36d942f7f7de8
Parents: 08fab48
Author: Wenchen Fan <cl...@outlook.com>
Authored: Tue Jun 30 08:08:15 2015 -0700
Committer: Davies Liu <da...@databricks.com>
Committed: Tue Jun 30 08:08:15 2015 -0700
----------------------------------------------------------------------
.../sql/catalyst/expressions/arithmetic.scala | 54 +++++++++++++-------
1 file changed, 36 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/spark/blob/865a834e/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala
index ae765c1..5363b35 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala
@@ -216,23 +216,32 @@ case class Divide(left: Expression, right: Expression) extends BinaryArithmetic
override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): String = {
val eval1 = left.gen(ctx)
val eval2 = right.gen(ctx)
- val test = if (left.dataType.isInstanceOf[DecimalType]) {
+ val isZero = if (dataType.isInstanceOf[DecimalType]) {
s"${eval2.primitive}.isZero()"
} else {
s"${eval2.primitive} == 0"
}
- val method = if (left.dataType.isInstanceOf[DecimalType]) s".$decimalMethod" else s" $symbol "
- val javaType = ctx.javaType(left.dataType)
- eval1.code + eval2.code +
- s"""
+ val javaType = ctx.javaType(dataType)
+ val divide = if (dataType.isInstanceOf[DecimalType]) {
+ s"${eval1.primitive}.$decimalMethod(${eval2.primitive})"
+ } else {
+ s"($javaType)(${eval1.primitive} $symbol ${eval2.primitive})"
+ }
+ s"""
+ ${eval2.code}
boolean ${ev.isNull} = false;
- ${ctx.javaType(left.dataType)} ${ev.primitive} = ${ctx.defaultValue(left.dataType)};
- if (${eval1.isNull} || ${eval2.isNull} || $test) {
+ $javaType ${ev.primitive} = ${ctx.defaultValue(javaType)};
+ if (${eval2.isNull} || $isZero) {
${ev.isNull} = true;
} else {
- ${ev.primitive} = ($javaType) (${eval1.primitive}$method(${eval2.primitive}));
+ ${eval1.code}
+ if (${eval1.isNull}) {
+ ${ev.isNull} = true;
+ } else {
+ ${ev.primitive} = $divide;
+ }
}
- """
+ """
}
}
@@ -273,23 +282,32 @@ case class Remainder(left: Expression, right: Expression) extends BinaryArithmet
override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): String = {
val eval1 = left.gen(ctx)
val eval2 = right.gen(ctx)
- val test = if (left.dataType.isInstanceOf[DecimalType]) {
+ val isZero = if (dataType.isInstanceOf[DecimalType]) {
s"${eval2.primitive}.isZero()"
} else {
s"${eval2.primitive} == 0"
}
- val method = if (left.dataType.isInstanceOf[DecimalType]) s".$decimalMethod" else s" $symbol "
- val javaType = ctx.javaType(left.dataType)
- eval1.code + eval2.code +
- s"""
+ val javaType = ctx.javaType(dataType)
+ val remainder = if (dataType.isInstanceOf[DecimalType]) {
+ s"${eval1.primitive}.$decimalMethod(${eval2.primitive})"
+ } else {
+ s"($javaType)(${eval1.primitive} $symbol ${eval2.primitive})"
+ }
+ s"""
+ ${eval2.code}
boolean ${ev.isNull} = false;
- ${ctx.javaType(left.dataType)} ${ev.primitive} = ${ctx.defaultValue(left.dataType)};
- if (${eval1.isNull} || ${eval2.isNull} || $test) {
+ $javaType ${ev.primitive} = ${ctx.defaultValue(javaType)};
+ if (${eval2.isNull} || $isZero) {
${ev.isNull} = true;
} else {
- ${ev.primitive} = ($javaType) (${eval1.primitive}$method(${eval2.primitive}));
+ ${eval1.code}
+ if (${eval1.isNull}) {
+ ${ev.isNull} = true;
+ } else {
+ ${ev.primitive} = $remainder;
+ }
}
- """
+ """
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org