http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java b/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java index c8e3745..61c55e1 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java @@ -265,12 +265,12 @@ public class TestEvalTreeUtil { FieldEval field = first.getLeftExpr(); assertEquals(col1, field.getColumnRef()); assertEquals(EvalType.LTH, first.getType()); - assertEquals(10, first.getRightExpr().eval(null, null).asInt4()); + assertEquals(10, first.getRightExpr().eval(null).asInt4()); field = second.getRightExpr(); assertEquals(col1, field.getColumnRef()); assertEquals(EvalType.LTH, second.getType()); - assertEquals(4, second.getLeftExpr().eval(null, null).asInt4()); + assertEquals(4, second.getLeftExpr().eval(null).asInt4()); } @Test @@ -304,10 +304,10 @@ public class TestEvalTreeUtil { Target [] targets = getRawTargets(QUERIES[0]); EvalNode node = AlgebraicUtil.eliminateConstantExprs(targets[0].getEvalTree()); assertEquals(EvalType.CONST, node.getType()); - assertEquals(7, node.eval(null, null).asInt4()); + assertEquals(7, node.eval(null).asInt4()); node = AlgebraicUtil.eliminateConstantExprs(targets[1].getEvalTree()); assertEquals(EvalType.CONST, node.getType()); - assertTrue(7.0d == node.eval(null, null).asFloat8()); + assertTrue(7.0d == node.eval(null).asFloat8()); Expr expr = analyzer.parse(QUERIES[1]); LogicalPlan plan = planner.createPlan(defaultContext, expr, true); @@ -335,7 +335,7 @@ public class TestEvalTreeUtil { assertEquals(EvalType.GTH, transposed.getType()); FieldEval field = transposed.getLeftExpr(); assertEquals(col1, field.getColumnRef()); - assertEquals(1, transposed.getRightExpr().eval(null, null).asInt4()); + assertEquals(1, transposed.getRightExpr().eval(null).asInt4()); node = getRootSelection(QUERIES[4]); // we expect that score < 3 @@ -343,7 +343,7 @@ public class TestEvalTreeUtil { assertEquals(EvalType.LTH, transposed.getType()); field = transposed.getLeftExpr(); assertEquals(col1, field.getColumnRef()); - assertEquals(2, transposed.getRightExpr().eval(null, null).asInt4()); + assertEquals(2, transposed.getRightExpr().eval(null).asInt4()); } @Test
http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java index 5e91b0c..7edf74a 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java @@ -810,7 +810,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex limitNode.setInSchema(child.getOutSchema()); limitNode.setOutSchema(child.getOutSchema()); - limitNode.setFetchFirst(firstFetNum.eval(null, null).asInt8()); + limitNode.setFetchFirst(firstFetNum.eval(null).asInt8()); return limitNode; } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java index 3ffe20e..984d18c 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AggregationFunctionCallEval.java @@ -21,13 +21,11 @@ package org.apache.tajo.plan.expr; import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.FunctionDesc; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.datum.Datum; import org.apache.tajo.plan.function.AggFunction; import org.apache.tajo.plan.function.FunctionContext; import org.apache.tajo.storage.Tuple; -import org.apache.tajo.storage.VTuple; import org.apache.tajo.util.TUtil; public class AggregationFunctionCallEval extends FunctionEval implements Cloneable { @@ -36,7 +34,6 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab @Expose String alias; protected AggFunction instance; - private Tuple params; protected AggregationFunctionCallEval(EvalType type, FunctionDesc desc, AggFunction instance, EvalNode[] givenArgs) { super(type, desc, givenArgs); @@ -52,17 +49,11 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab return instance.newContext(); } - public void merge(FunctionContext context, Schema schema, Tuple tuple) { - if (params == null) { - this.params = new VTuple(argEvals.length); - } - - if (argEvals != null) { - for (int i = 0; i < argEvals.length; i++) { - params.put(i, argEvals[i].eval(schema, tuple)); - } - } + public void merge(FunctionContext context, Tuple tuple) { + mergeParam(context, evalParams(tuple)); + } + protected void mergeParam(FunctionContext context, Tuple params) { if (!intermediatePhase && !finalPhase) { // firstPhase instance.eval(context, params); @@ -72,8 +63,8 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab } @Override - public Datum eval(Schema schema, Tuple tuple) { - throw new UnsupportedOperationException("Cannot execute eval() of aggregation function"); + public <T extends Datum> T eval(Tuple tuple) { + throw new IllegalStateException("Cannot execute aggregation function in generic expression"); } public Datum terminate(FunctionContext context) { @@ -151,7 +142,6 @@ public class AggregationFunctionCallEval extends FunctionEval implements Cloneab result = prime * result + (finalPhase ? 1231 : 1237); result = prime * result + ((instance == null) ? 0 : instance.hashCode()); result = prime * result + (intermediatePhase ? 1231 : 1237); - result = prime * result + ((params == null) ? 0 : params.hashCode()); return result; } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java index 9ecb93c..f697968 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/AlgebraicUtil.java @@ -149,7 +149,7 @@ public class AlgebraicUtil { } if (lhs.getType() == EvalType.CONST && rhs.getType() == EvalType.CONST) { - return new ConstEval(binaryEval.eval(null, null)); + return new ConstEval(binaryEval.eval(null)); } return binaryEval; @@ -162,7 +162,7 @@ public class AlgebraicUtil { stack.pop(); if (child.getType() == EvalType.CONST) { - return new ConstEval(unaryEval.eval(null, null)); + return new ConstEval(unaryEval.eval(null)); } return unaryEval; @@ -184,7 +184,7 @@ public class AlgebraicUtil { } if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) { - return new ConstEval(evalNode.eval(null, null)); + return new ConstEval(evalNode.eval(null)); } else { return evalNode; } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java index b0fbd5e..3969f63 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BetweenPredicateEval.java @@ -80,7 +80,8 @@ public class BetweenPredicateEval extends EvalNode implements Cloneable { } private static interface Checker { - Datum eval(Schema schema, Tuple param); + void bind(Schema schema); + Datum eval(Tuple param); } private static class ConstantChecker implements Checker { @@ -102,8 +103,13 @@ public class BetweenPredicateEval extends EvalNode implements Cloneable { } @Override - public Datum eval(Schema schema, Tuple param) { - Datum predicandValue = predicand.eval(schema, param); + public void bind(Schema schema) { + predicand.bind(schema); + } + + @Override + public Datum eval(Tuple param) { + Datum predicandValue = predicand.eval(param); if (!predicandValue.isNull()) { return DatumFactory.createBool(not ^ (predicandValue.greaterThanEqual(begin).asBool() @@ -128,10 +134,17 @@ public class BetweenPredicateEval extends EvalNode implements Cloneable { } @Override - public Datum eval(Schema schema, Tuple param) { - Datum predicandValue = predicand.eval(schema, param); - Datum beginValue = begin.eval(schema, param); - Datum endValue = end.eval(schema, param); + public void bind(Schema schema) { + predicand.bind(schema); + begin.bind(schema); + end.bind(schema); + } + + @Override + public Datum eval(Tuple param) { + Datum predicandValue = predicand.eval(param); + Datum beginValue = begin.eval(param); + Datum endValue = end.eval(param); if (!(predicandValue.isNull() || beginValue.isNull() || endValue.isNull())) { return @@ -157,10 +170,17 @@ public class BetweenPredicateEval extends EvalNode implements Cloneable { } @Override - public Datum eval(Schema schema, Tuple param) { - Datum predicandValue = predicand.eval(schema, param); - Datum beginValue = begin.eval(schema, param); - Datum endValue = end.eval(schema, param); + public void bind(Schema schema) { + predicand.bind(schema); + begin.bind(schema); + end.bind(schema); + } + + @Override + public Datum eval(Tuple param) { + Datum predicandValue = predicand.eval(param); + Datum beginValue = begin.eval(param); + Datum endValue = end.eval(param); if (!(predicandValue.isNull()|| beginValue.isNull() || endValue.isNull())) { return DatumFactory.createBool( not ^ @@ -207,27 +227,30 @@ public class BetweenPredicateEval extends EvalNode implements Cloneable { } @Override - public Datum eval(Schema schema, Tuple tuple) { - if (checker == null) { - if (begin.getType() == EvalType.CONST && end.getType() == EvalType.CONST) { - Datum beginValue = ((ConstEval)begin).getValue(); - Datum endValue = ((ConstEval)end).getValue(); - - if (symmetric || beginValue.compareTo(endValue) <= 0) { - checker = new ConstantChecker(not, predicand, beginValue, endValue); - } else { - checker = new AsymmetricChecker(not, predicand, begin, end); - } + public void bind(Schema schema) { + if (begin.getType() == EvalType.CONST && end.getType() == EvalType.CONST) { + Datum beginValue = ((ConstEval)begin).getValue(); + Datum endValue = ((ConstEval)end).getValue(); + + if (symmetric || beginValue.compareTo(endValue) <= 0) { + checker = new ConstantChecker(not, predicand, beginValue, endValue); } else { - if (symmetric) { - checker = new SymmetricChecker(not, predicand, begin, end); - } else { - checker = new AsymmetricChecker(not, predicand, begin, end); - } + checker = new AsymmetricChecker(not, predicand, begin, end); + } + } else { + if (symmetric) { + checker = new SymmetricChecker(not, predicand, begin, end); + } else { + checker = new AsymmetricChecker(not, predicand, begin, end); } } + checker.bind(schema); + } - return checker.eval(schema, tuple); + @Override + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + return checker.eval(tuple); } @Override http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java index faeefcd..e189a36 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/BinaryEval.java @@ -21,7 +21,6 @@ package org.apache.tajo.plan.expr; import com.google.common.base.Objects; import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.CatalogUtil; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; @@ -77,6 +76,7 @@ public class BinaryEval extends EvalNode implements Cloneable { this.leftExpr = expr; } + @SuppressWarnings("unchecked") public <T extends EvalNode> T getLeftExpr() { return (T) this.leftExpr; } @@ -85,6 +85,7 @@ public class BinaryEval extends EvalNode implements Cloneable { this.rightExpr = expr; } + @SuppressWarnings("unchecked") public <T extends EvalNode> T getRightExpr() { return (T) this.rightExpr; } @@ -116,9 +117,10 @@ public class BinaryEval extends EvalNode implements Cloneable { } @Override - public Datum eval(Schema schema, Tuple tuple) { - Datum lhs = leftExpr.eval(schema, tuple); - Datum rhs = rightExpr.eval(schema, tuple); + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + Datum lhs = leftExpr.eval(tuple); + Datum rhs = rightExpr.eval(tuple); switch(type) { case AND: http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java index 4d42db5..c25ad45 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CaseWhenEval.java @@ -22,7 +22,6 @@ import com.google.common.collect.Lists; import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.CatalogUtil; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.common.TajoDataTypes.Type; @@ -105,15 +104,17 @@ public class CaseWhenEval extends EvalNode implements GsonObject { return "?"; } - public Datum eval(Schema schema, Tuple tuple) { - for (int i = 0; i < whens.size(); i++) { - if (whens.get(i).checkIfCondition(schema, tuple)) { - return whens.get(i).eval(schema, tuple); + @Override + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + for (IfThenEval eval : whens) { + if (eval.checkIfCondition(tuple)) { + return eval.eval(tuple); } } if (elseResult != null) { // without else clause - return elseResult.eval(schema, tuple); + return elseResult.eval(tuple); } return NullDatum.get(); @@ -225,12 +226,14 @@ public class CaseWhenEval extends EvalNode implements GsonObject { return "when?"; } - public boolean checkIfCondition(Schema schema, Tuple tuple) { - return condition.eval(schema, tuple).isTrue(); + public boolean checkIfCondition(Tuple tuple) { + return condition.eval(tuple).isTrue(); } - public Datum eval(Schema schema, Tuple tuple) { - return result.eval(schema, tuple); + @Override + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + return result.eval(tuple); } public void setCondition(EvalNode condition) { http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java index 9f7f69f..5a26593 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java @@ -22,7 +22,6 @@ import com.google.gson.annotations.Expose; import org.apache.tajo.OverridableConf; import org.apache.tajo.SessionVars; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.storage.Tuple; @@ -68,8 +67,10 @@ public class CastEval extends UnaryEval { return target.getType().name(); } - public Datum eval(Schema schema, Tuple tuple) { - Datum operandDatum = child.eval(schema, tuple); + @Override + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + Datum operandDatum = child.eval(tuple); if (operandDatum.isNull()) { return operandDatum; } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/ConstEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/ConstEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/ConstEval.java index b9f48a9..82e4e8e 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/ConstEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/ConstEval.java @@ -21,7 +21,6 @@ package org.apache.tajo.plan.expr; import com.google.common.base.Objects; import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.CatalogUtil; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.datum.Datum; import org.apache.tajo.storage.Tuple; @@ -37,13 +36,15 @@ public class ConstEval extends EvalNode implements Comparable<ConstEval>, Clonea public Datum getValue() { return this.datum; } - + + @Override public String toString() { return datum.toString(); } @Override - public Datum eval(Schema schema, Tuple tuple) { + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { return datum; } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java index dcb7285..f57302a 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java @@ -59,11 +59,17 @@ public abstract class EvalNode implements Cloneable, GsonObject, ProtoObject<Pla public String toJson() { return PlanGsonHelper.toJson(this, EvalNode.class); } - - public abstract <T extends Datum> T eval(Schema schema, Tuple tuple); + + public void bind(Schema schema) { + for (int i = 0; i < childNum(); i++) { + getChild(i).bind(schema); + } + } + + public abstract <T extends Datum> T eval(Tuple tuple); @Deprecated - public abstract void preOrder(EvalNodeVisitor visitor); + public abstract void preOrder(EvalNodeVisitor visitor); @Deprecated public abstract void postOrder(EvalNodeVisitor visitor); http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java index 0d0ea88..5e3843c 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java @@ -571,7 +571,8 @@ public class EvalTreeUtil { } public static Datum evaluateImmediately(EvalNode evalNode) { - return evalNode.eval(null, null); + evalNode.bind(null); + return evalNode.eval(null); } /** http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java index c42768d..11b3b6d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java @@ -39,19 +39,22 @@ public class FieldEval extends EvalNode implements Cloneable { this.column = column; } + @Override + public void bind(Schema schema) { + // TODO - column namespace should be improved to simplify name handling and resolving. + if (column.hasQualifier()) { + fieldId = schema.getColumnId(column.getQualifiedName()); + } else { + fieldId = schema.getColumnIdByName(column.getSimpleName()); + } + if (fieldId == -1) { + throw new IllegalStateException("No Such Column Reference: " + column + ", schema: " + schema); + } + } + @Override - public Datum eval(Schema schema, Tuple tuple) { - if (fieldId == -1) { - // TODO - column namespace should be improved to simplify name handling and resolving. - if (column.hasQualifier()) { - fieldId = schema.getColumnId(column.getQualifiedName()); - } else { - fieldId = schema.getColumnIdByName(column.getSimpleName()); - } - if (fieldId == -1) { - throw new IllegalStateException("No Such Column Reference: " + column + ", schema: " + schema); - } - } + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { return tuple.get(fieldId); } @@ -90,7 +93,7 @@ public class FieldEval extends EvalNode implements Cloneable { public String getName() { return this.column.getQualifiedName(); } - + public String toString() { return this.column.toString(); } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FunctionEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FunctionEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FunctionEval.java index ec8d7da..0c60c8d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FunctionEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FunctionEval.java @@ -25,8 +25,8 @@ import org.apache.tajo.catalog.FunctionDesc; import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.common.TajoDataTypes.DataType; -import org.apache.tajo.datum.Datum; import org.apache.tajo.storage.Tuple; +import org.apache.tajo.storage.VTuple; import org.apache.tajo.util.TUtil; import static org.apache.tajo.catalog.proto.CatalogProtos.FunctionType.DISTINCT_AGGREGATION; @@ -40,13 +40,27 @@ public abstract class FunctionEval extends EvalNode implements Cloneable { @Expose protected FunctionDesc funcDesc; @Expose protected EvalNode [] argEvals; + private transient Tuple params; + public FunctionEval(EvalType type, FunctionDesc funcDesc, EvalNode[] argEvals) { super(type); this.funcDesc = funcDesc; - Preconditions.checkArgument(argEvals != null, "argEvals cannot be null"); - this.argEvals = argEvals; + setArgs(argEvals); } + @Override + public void bind(Schema schema) { + super.bind(schema); + this.params = new VTuple(argEvals.length); + } + + protected final Tuple evalParams(Tuple tuple) { + for (int i = 0; i < argEvals.length; i++) { + params.put(i, argEvals[i].eval(tuple)); + } + return params; + } + public FunctionDesc getFuncDesc() { return funcDesc; } @@ -80,16 +94,13 @@ public abstract class FunctionEval extends EvalNode implements Cloneable { } public void setArgs(EvalNode [] args) { + Preconditions.checkArgument(args != null, "argEvals cannot be null"); this.argEvals = args; } @Override public int childNum() { - if (argEvals != null) { - return argEvals.length; - } else { - return 0; - } + return argEvals.length; } @Override @@ -103,9 +114,6 @@ public abstract class FunctionEval extends EvalNode implements Cloneable { } @Override - public abstract Datum eval(Schema schema, Tuple tuple); - - @Override public String getName() { return funcDesc.getFunctionName(); } @@ -144,31 +152,25 @@ public abstract class FunctionEval extends EvalNode implements Cloneable { public Object clone() throws CloneNotSupportedException { FunctionEval eval = (FunctionEval) super.clone(); eval.funcDesc = (FunctionDesc) funcDesc.clone(); - if (argEvals != null) { - eval.argEvals = new EvalNode[argEvals.length]; - for (int i = 0; i < argEvals.length; i++) { - eval.argEvals[i] = (EvalNode) argEvals[i].clone(); - } + eval.argEvals = new EvalNode[argEvals.length]; + for (int i = 0; i < argEvals.length; i++) { + eval.argEvals[i] = (EvalNode) argEvals[i].clone(); } return eval; } @Override public void preOrder(EvalNodeVisitor visitor) { - if (argEvals != null) { - for (EvalNode eval : argEvals) { - eval.postOrder(visitor); - } + for (EvalNode eval : argEvals) { + eval.postOrder(visitor); } visitor.visit(this); } @Override public void postOrder(EvalNodeVisitor visitor) { - if (argEvals != null) { - for (EvalNode eval : argEvals) { - eval.postOrder(visitor); - } + for (EvalNode eval : argEvals) { + eval.postOrder(visitor); } visitor.visit(this); } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java index 0c6f1e2..747e8ba 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java @@ -22,18 +22,15 @@ import com.google.common.base.Objects; import com.google.gson.annotations.Expose; import org.apache.tajo.OverridableConf; import org.apache.tajo.catalog.FunctionDesc; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.datum.Datum; import org.apache.tajo.plan.function.GeneralFunction; import org.apache.tajo.storage.Tuple; -import org.apache.tajo.storage.VTuple; import org.apache.tajo.util.TUtil; import javax.annotation.Nullable; public class GeneralFunctionEval extends FunctionEval { @Expose protected GeneralFunction instance; - private Tuple params = null; public GeneralFunctionEval(@Nullable OverridableConf queryContext, FunctionDesc desc, GeneralFunction instance, EvalNode[] givenArgs) { @@ -42,24 +39,12 @@ public class GeneralFunctionEval extends FunctionEval { this.instance.init(queryContext, getParamType()); } - /* (non-Javadoc) - * @see nta.query.executor.eval.Expr#evalVal(Tuple) - */ - @Override - public Datum eval(Schema schema, Tuple tuple) { - if (this.params == null) { - params = new VTuple(argEvals.length); - } - if(argEvals != null) { - params.clear(); - for(int i=0;i < argEvals.length; i++) { - params.put(i, argEvals[i].eval(schema, tuple)); - } - } + @Override + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + return instance.eval(evalParams(tuple)); + } - return instance.eval(params); - } - @Override public boolean equals(Object obj) { if (obj instanceof GeneralFunctionEval) { http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java index e60b68a..c222bef 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/InEval.java @@ -23,7 +23,6 @@ import com.google.common.collect.Sets; import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.CatalogUtil; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; @@ -58,12 +57,12 @@ public class InEval extends BinaryEval { } @Override - public Datum eval(Schema schema, Tuple tuple) { + public Datum eval(Tuple tuple) { if (values == null) { values = Sets.newHashSet(((RowConstantEval)rightExpr).getValues()); } - Datum leftValue = leftExpr.eval(schema, tuple); + Datum leftValue = leftExpr.eval(tuple); if (leftValue.isNull()) { return NullDatum.get(); http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java index 16fc4f0..496f64d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/IsNullEval.java @@ -21,7 +21,6 @@ package org.apache.tajo.plan.expr; import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.CatalogUtil; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.datum.Datum; @@ -57,8 +56,9 @@ public class IsNullEval extends UnaryEval { } @Override - public Datum eval(Schema schema, Tuple tuple) { - boolean isNull = child.eval(schema, tuple).isNull(); + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + boolean isNull = child.eval(tuple).isNull(); return DatumFactory.createBool(isNot ^ isNull); } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/NotEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/NotEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/NotEval.java index 916c1f7..ccec0fe 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/NotEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/NotEval.java @@ -19,7 +19,6 @@ package org.apache.tajo.plan.expr; import org.apache.tajo.catalog.CatalogUtil; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.datum.Datum; @@ -44,8 +43,9 @@ public class NotEval extends UnaryEval implements Cloneable { } @Override - public Datum eval(Schema schema, Tuple tuple) { - Datum datum = child.eval(schema, tuple); + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + Datum datum = child.eval(tuple); return !datum.isNull() ? DatumFactory.createBool(!datum.asBool()) : datum; } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java index 9f6d6d6..1b1ee44 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PartialBinaryExpr.java @@ -18,7 +18,6 @@ package org.apache.tajo.plan.expr; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.datum.Datum; import org.apache.tajo.exception.InvalidOperationException; @@ -48,8 +47,8 @@ public class PartialBinaryExpr extends BinaryEval { } @Override - public Datum eval(Schema schema, Tuple tuple) { - throw new InvalidOperationException("ERROR: the partial binary expression cannot be evluated: " + public Datum eval(Tuple tuple) { + throw new InvalidOperationException("ERROR: the partial binary expression cannot be evaluated: " + this.toString()); } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PatternMatchPredicateEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PatternMatchPredicateEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PatternMatchPredicateEval.java index 1d83d60..a5d055d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PatternMatchPredicateEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/PatternMatchPredicateEval.java @@ -74,12 +74,14 @@ public abstract class PatternMatchPredicateEval extends BinaryEval { } @Override - public Datum eval(Schema schema, Tuple tuple) { - if (this.compiled == null) { - compile(this.pattern); - } + public void bind(Schema schema) { + super.bind(schema); + compile(pattern); + } - Datum predicand = leftExpr.eval(schema, tuple); + @Override + public Datum eval(Tuple tuple) { + Datum predicand = leftExpr.eval(tuple); if (predicand.isNull()) { return NullDatum.get(); } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java index a581700..b81c352 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/RowConstantEval.java @@ -23,7 +23,6 @@ import java.util.Arrays; import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.CatalogUtil; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.NullDatum; import org.apache.tajo.storage.Tuple; @@ -60,7 +59,8 @@ public class RowConstantEval extends EvalNode { } @Override - public Datum eval(Schema schema, Tuple tuple) { + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { return NullDatum.get(); } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/SignedEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/SignedEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/SignedEval.java index 36f7e2f..9d077ba 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/SignedEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/SignedEval.java @@ -20,7 +20,6 @@ package org.apache.tajo.plan.expr; import com.google.common.base.Objects; import com.google.gson.annotations.Expose; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.NumericDatum; @@ -49,8 +48,9 @@ public class SignedEval extends UnaryEval implements Cloneable { } @Override - public Datum eval(Schema schema, Tuple tuple) { - NumericDatum result = child.eval(schema, tuple); + @SuppressWarnings("unchecked") + public Datum eval(Tuple tuple) { + NumericDatum result = child.eval(tuple); if (negative) { return result.inverseSign(); } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/UnaryEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/UnaryEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/UnaryEval.java index 7d45776..237db00 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/UnaryEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/UnaryEval.java @@ -21,7 +21,6 @@ package org.apache.tajo.plan.expr; import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.gson.annotations.Expose; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; import org.apache.tajo.storage.Tuple; @@ -67,7 +66,7 @@ public abstract class UnaryEval extends EvalNode implements Cloneable { } @Override - public <T extends Datum> T eval(Schema schema, Tuple tuple) { + public <T extends Datum> T eval(Tuple tuple) { return null; } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java index 1a1f138..33f9a3d 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/WindowFunctionEval.java @@ -23,7 +23,6 @@ import java.util.Arrays; import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.FunctionDesc; -import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.SortSpec; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.datum.Datum; @@ -31,13 +30,11 @@ import org.apache.tajo.plan.function.AggFunction; import org.apache.tajo.plan.function.FunctionContext; import org.apache.tajo.plan.logical.WindowSpec; import org.apache.tajo.storage.Tuple; -import org.apache.tajo.storage.VTuple; import org.apache.tajo.util.TUtil; public class WindowFunctionEval extends AggregationFunctionCallEval implements Cloneable { @Expose private SortSpec [] sortSpecs; @Expose WindowSpec.WindowFrame windowFrame; - private Tuple params; public WindowFunctionEval(FunctionDesc desc, AggFunction instance, EvalNode[] givenArgs, WindowSpec.WindowFrame windowFrame) { @@ -62,24 +59,11 @@ public class WindowFunctionEval extends AggregationFunctionCallEval implements C } @Override - public Datum eval(Schema schema, Tuple tuple) { - throw new UnsupportedOperationException("Cannot execute eval() of aggregation function"); - } - - public void merge(FunctionContext context, Schema schema, Tuple tuple) { - if (params == null) { - this.params = new VTuple(argEvals.length); - } - - if (argEvals != null) { - for (int i = 0; i < argEvals.length; i++) { - params.put(i, argEvals[i].eval(schema, tuple)); - } - } - + protected void mergeParam(FunctionContext context, Tuple params) { instance.eval(context, params); } + @Override public Datum terminate(FunctionContext context) { return instance.terminate(context); } @@ -93,7 +77,6 @@ public class WindowFunctionEval extends AggregationFunctionCallEval implements C public int hashCode() { final int prime = 31; int result = super.hashCode(); - result = prime * result + ((params == null) ? 0 : params.hashCode()); result = prime * result + Arrays.hashCode(sortSpecs); result = prime * result + ((windowFrame == null) ? 0 : windowFrame.hashCode()); return result; http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java b/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java index 0e115e2..d77f072 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java @@ -49,7 +49,8 @@ public class ConstantFolding extends SimpleEvalNodeVisitor<LogicalPlanner.PlanCo } if (lhs.getType() == EvalType.CONST && rhs.getType() == EvalType.CONST) { - return new ConstEval(binaryEval.eval(null, null)); + binaryEval.bind(null); + return new ConstEval(binaryEval.eval(null)); } return binaryEval; @@ -62,7 +63,8 @@ public class ConstantFolding extends SimpleEvalNodeVisitor<LogicalPlanner.PlanCo stack.pop(); if (child.getType() == EvalType.CONST) { - return new ConstEval(unaryEval.eval(null, null)); + unaryEval.bind(null); + return new ConstEval(unaryEval.eval(null)); } return unaryEval; @@ -75,16 +77,15 @@ public class ConstantFolding extends SimpleEvalNodeVisitor<LogicalPlanner.PlanCo if ("sleep".equals(evalNode.getFuncDesc().getFunctionName())) { constantOfAllDescendents = false; } else { - if (evalNode.getArgs() != null) { - for (EvalNode arg : evalNode.getArgs()) { - arg = visit(context, arg, stack); - constantOfAllDescendents &= (arg.getType() == EvalType.CONST); - } + for (EvalNode arg : evalNode.getArgs()) { + arg = visit(context, arg, stack); + constantOfAllDescendents &= (arg.getType() == EvalType.CONST); } } if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) { - return new ConstEval(evalNode.eval(null, null)); + evalNode.bind(null); + return new ConstEval(evalNode.eval(null)); } else { return evalNode; } http://git-wip-us.apache.org/repos/asf/tajo/blob/f4c9e54c/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java index 7604c53..c49d51b 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java @@ -86,6 +86,7 @@ public class PartitionedTableRewriter implements LogicalPlanRewriteRule { public PartitionPathFilter(Schema schema, EvalNode partitionFilter) { this.schema = schema; this.partitionFilter = partitionFilter; + partitionFilter.bind(schema); } @Override @@ -95,7 +96,7 @@ public class PartitionedTableRewriter implements LogicalPlanRewriteRule { return false; } - return partitionFilter.eval(schema, tuple).asBool(); + return partitionFilter.eval(tuple).asBool(); } @Override
