aboutsummaryrefslogtreecommitdiff
path: root/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
diff options
context:
space:
mode:
authorJinfeng Ni <jni@maprtech.com>2014-06-18 07:11:54 -0700
committerJacques Nadeau <jacques@apache.org>2014-06-20 10:54:50 -0700
commit43bb57e758495d6c3e47e29b27e1f97b9f81f268 (patch)
tree8b61dcd5db9b4f7340348478271617487a628083 /exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
parenta314c824ba99edf0c29b004c121904847bab2c15 (diff)
DRILL-1044: Optimize boolean and/or operators by short-circuit and fast-success / fast-fail approach.
Diffstat (limited to 'exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java')
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java51
1 files changed, 35 insertions, 16 deletions
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
index d65e61891..f2019b837 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
@@ -21,6 +21,7 @@ import java.util.List;
import java.util.Set;
import org.apache.commons.io.input.NullReader;
+import org.apache.drill.common.expression.BooleanOperator;
import org.apache.drill.common.expression.CastExpression;
import org.apache.drill.common.expression.ConvertExpression;
import org.apache.drill.common.expression.FunctionCall;
@@ -55,7 +56,7 @@ import org.apache.drill.exec.compile.sig.ConstantExpressionIdentifier;
import org.apache.drill.exec.expr.ClassGenerator.BlockType;
import org.apache.drill.exec.expr.ClassGenerator.HoldingContainer;
import org.apache.drill.exec.expr.fn.DrillFuncHolder;
-import org.apache.drill.exec.expr.fn.DrillSCBooleanOPHolder;
+import org.apache.drill.exec.expr.fn.DrillBooleanOPHolder;
import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry;
import org.apache.drill.exec.expr.fn.HiveFuncHolder;
import org.apache.drill.exec.physical.impl.filter.ReturnValueExpression;
@@ -97,6 +98,18 @@ public class EvaluationVisitor {
}
@Override
+ public HoldingContainer visitBooleanOperator(BooleanOperator op,
+ ClassGenerator<?> generator) throws RuntimeException {
+ if (op.getName().equals("booleanAnd")) {
+ return visitBooleanAnd(op, generator);
+ }else if(op.getName().equals("booleanOr")) {
+ return visitBooleanOr(op, generator);
+ } else {
+ throw new UnsupportedOperationException("BooleanOperator can only be booleanAnd, booleanOr. You are using " + op.getName());
+ }
+ }
+
+ @Override
public HoldingContainer visitFunctionHolderExpression(FunctionHolderExpression holderExpr,
ClassGenerator<?> generator) throws RuntimeException {
// TODO: hack: (Drill/Hive)FuncHolderExpr reference classes in exec so
@@ -106,13 +119,6 @@ public class EvaluationVisitor {
if (holderExpr instanceof DrillFuncHolderExpr) {
DrillFuncHolder holder = ((DrillFuncHolderExpr) holderExpr).getHolder();
- if (holder instanceof DrillSCBooleanOPHolder && holderExpr.getName().equals("booleanAnd")) {
- return visitBooleanAnd(holderExpr, generator);
- }
-
- if (holder instanceof DrillSCBooleanOPHolder && holderExpr.getName().equals("booleanOr")) {
- return visitBooleanOr(holderExpr, generator);
- }
JVar[] workspaceVars = holder.renderStart(generator, null);
@@ -603,10 +609,10 @@ public class EvaluationVisitor {
return fc.accept(this, value);
}
- private HoldingContainer visitBooleanAnd(FunctionHolderExpression holderExpr,
+ private HoldingContainer visitBooleanAnd(BooleanOperator op,
ClassGenerator<?> generator) {
- HoldingContainer out = generator.declare(holderExpr.getMajorType());
+ HoldingContainer out = generator.declare(op.getMajorType());
JLabel label = generator.getEvalBlockLabel("AndOP");
JBlock eval = generator.getEvalBlock().block(); // enter into nested block
@@ -623,8 +629,8 @@ public class EvaluationVisitor {
// null true null
// null false false
// null null null
- for (int i = 0; i < holderExpr.args.size(); i++) {
- arg = holderExpr.args.get(i).accept(this, generator);
+ for (int i = 0; i < op.args.size(); i++) {
+ arg = op.args.get(i).accept(this, generator);
JBlock earlyExit = null;
if (arg.isOptional()) {
@@ -665,10 +671,10 @@ public class EvaluationVisitor {
return out;
}
- private HoldingContainer visitBooleanOr(FunctionHolderExpression holderExpr,
+ private HoldingContainer visitBooleanOr(BooleanOperator op,
ClassGenerator<?> generator) {
- HoldingContainer out = generator.declare(holderExpr.getMajorType());
+ HoldingContainer out = generator.declare(op.getMajorType());
JLabel label = generator.getEvalBlockLabel("OrOP");
JBlock eval = generator.getEvalBlock().block();
@@ -686,8 +692,8 @@ public class EvaluationVisitor {
// null false null
// null null null
- for (int i = 0; i < holderExpr.args.size(); i++) {
- arg = holderExpr.args.get(i).accept(this, generator);
+ for (int i = 0; i < op.args.size(); i++) {
+ arg = op.args.get(i).accept(this, generator);
JBlock earlyExit = null;
if (arg.isOptional()) {
@@ -762,6 +768,19 @@ public class EvaluationVisitor {
}
@Override
+ public HoldingContainer visitBooleanOperator(BooleanOperator e, ClassGenerator<?> generator)
+ throws RuntimeException {
+ if (constantBoundaries.contains(e)) {
+ generator.getMappingSet().enterConstant();
+ HoldingContainer c = super.visitBooleanOperator(e, generator);
+ return renderConstantExpression(generator, c);
+ } else if (generator.getMappingSet().isWithinConstant()) {
+ return super.visitBooleanOperator(e, generator).setConstant(true);
+ } else {
+ return super.visitBooleanOperator(e, generator);
+ }
+ }
+ @Override
public HoldingContainer visitIfExpression(IfExpression e, ClassGenerator<?> generator) throws RuntimeException {
if (constantBoundaries.contains(e)) {
generator.getMappingSet().enterConstant();