Skip to content
Snippets Groups Projects
Commit 0aa834ad authored by Cheng Hao's avatar Cheng Hao Committed by Michael Armbrust
Browse files

[SPARK-4744] [SQL] Short circuit evaluation for AND & OR in CodeGen

Author: Cheng Hao <hao.cheng@intel.com>

Closes #3606 from chenghao-intel/codegen_short_circuit and squashes the following commits:

f466303 [Cheng Hao] short circuit for AND & OR
parent 3b395e10
No related branches found
No related tags found
No related merge requests found
...@@ -314,20 +314,20 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin ...@@ -314,20 +314,20 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin
val eval1 = expressionEvaluator(e1) val eval1 = expressionEvaluator(e1)
val eval2 = expressionEvaluator(e2) val eval2 = expressionEvaluator(e2)
eval1.code ++ eval2.code ++
q""" q"""
..${eval1.code}
var $nullTerm = false var $nullTerm = false
var $primitiveTerm: ${termForType(BooleanType)} = false var $primitiveTerm: ${termForType(BooleanType)} = false
if ((!${eval1.nullTerm} && !${eval1.primitiveTerm}) || if (!${eval1.nullTerm} && ${eval1.primitiveTerm} == false) {
(!${eval2.nullTerm} && !${eval2.primitiveTerm})) {
$nullTerm = false
$primitiveTerm = false
} else if (${eval1.nullTerm} || ${eval2.nullTerm} ) {
$nullTerm = true
} else { } else {
$nullTerm = false ..${eval2.code}
$primitiveTerm = true if (!${eval2.nullTerm} && ${eval2.primitiveTerm} == false) {
} else if (!${eval1.nullTerm} && !${eval2.nullTerm}) {
$primitiveTerm = true
} else {
$nullTerm = true
}
} }
""".children """.children
...@@ -335,20 +335,22 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin ...@@ -335,20 +335,22 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin
val eval1 = expressionEvaluator(e1) val eval1 = expressionEvaluator(e1)
val eval2 = expressionEvaluator(e2) val eval2 = expressionEvaluator(e2)
eval1.code ++ eval2.code ++
q""" q"""
..${eval1.code}
var $nullTerm = false var $nullTerm = false
var $primitiveTerm: ${termForType(BooleanType)} = false var $primitiveTerm: ${termForType(BooleanType)} = false
if ((!${eval1.nullTerm} && ${eval1.primitiveTerm}) || if (!${eval1.nullTerm} && ${eval1.primitiveTerm}) {
(!${eval2.nullTerm} && ${eval2.primitiveTerm})) {
$nullTerm = false
$primitiveTerm = true $primitiveTerm = true
} else if (${eval1.nullTerm} || ${eval2.nullTerm} ) {
$nullTerm = true
} else { } else {
$nullTerm = false ..${eval2.code}
$primitiveTerm = false if (!${eval2.nullTerm} && ${eval2.primitiveTerm}) {
$primitiveTerm = true
} else if (!${eval1.nullTerm} && !${eval2.nullTerm}) {
$primitiveTerm = false
} else {
$nullTerm = true
}
} }
""".children """.children
...@@ -373,7 +375,6 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin ...@@ -373,7 +375,6 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin
} else if (${eval2.primitiveTerm} == 0) } else if (${eval2.primitiveTerm} == 0)
$nullTerm = true $nullTerm = true
else { else {
$nullTerm = false
$primitiveTerm = ${eval1.primitiveTerm} / ${eval2.primitiveTerm} $primitiveTerm = ${eval1.primitiveTerm} / ${eval2.primitiveTerm}
} }
""".children """.children
...@@ -494,7 +495,6 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin ...@@ -494,7 +495,6 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin
$nullTerm = ${eval1.nullTerm} $nullTerm = ${eval1.nullTerm}
$primitiveTerm = ${eval1.primitiveTerm} $primitiveTerm = ${eval1.primitiveTerm}
} else { } else {
$nullTerm = false
if (${eval1.primitiveTerm} > ${eval2.primitiveTerm}) { if (${eval1.primitiveTerm} > ${eval2.primitiveTerm}) {
$primitiveTerm = ${eval1.primitiveTerm} $primitiveTerm = ${eval1.primitiveTerm}
} else { } else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment