You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2014/01/17 10:23:39 UTC
[09/12] git commit: TAJO-501: Rewrite the projection part of logical
planning.
TAJO-501: Rewrite the projection part of logical planning.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/8e1f989a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/8e1f989a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/8e1f989a
Branch: refs/heads/master
Commit: 8e1f989aad27022371d1c973d5acea68568918db
Parents: b822c28
Author: Hyunsik Choi <hy...@apache.org>
Authored: Fri Jan 17 13:58:53 2014 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Fri Jan 17 15:57:55 2014 +0900
----------------------------------------------------------------------
.../org/apache/tajo/algebra/Aggregation.java | 30 +-
.../apache/tajo/algebra/BetweenPredicate.java | 7 +
.../org/apache/tajo/algebra/BinaryOperator.java | 10 +
.../apache/tajo/algebra/CaseWhenPredicate.java | 19 +
.../java/org/apache/tajo/algebra/CastExpr.java | 16 +-
.../tajo/algebra/ColumnReferenceExpr.java | 44 +-
.../tajo/algebra/CountRowsFunctionExpr.java | 5 +
.../org/apache/tajo/algebra/CreateTable.java | 127 +-
.../org/apache/tajo/algebra/DataTypeExpr.java | 7 +
.../java/org/apache/tajo/algebra/DropTable.java | 7 +
.../apache/tajo/algebra/ExistsPredicate.java | 16 +-
.../main/java/org/apache/tajo/algebra/Expr.java | 3 +
.../org/apache/tajo/algebra/FunctionExpr.java | 6 +
.../tajo/algebra/GeneralSetFunctionExpr.java | 11 +
.../java/org/apache/tajo/algebra/Having.java | 6 +
.../java/org/apache/tajo/algebra/Insert.java | 6 +
.../apache/tajo/algebra/IsNullPredicate.java | 15 +-
.../main/java/org/apache/tajo/algebra/Join.java | 18 +-
.../java/org/apache/tajo/algebra/Limit.java | 6 +
.../org/apache/tajo/algebra/LiteralValue.java | 6 +
.../java/org/apache/tajo/algebra/NamedExpr.java | 89 +
.../org/apache/tajo/algebra/NullLiteral.java | 5 +
.../java/org/apache/tajo/algebra/OpType.java | 2 +-
.../tajo/algebra/PatternMatchPredicate.java | 17 +-
.../org/apache/tajo/algebra/Projection.java | 13 +-
.../java/org/apache/tajo/algebra/Relation.java | 13 +-
.../org/apache/tajo/algebra/RelationList.java | 6 +
.../org/apache/tajo/algebra/ScalarSubQuery.java | 10 +-
.../java/org/apache/tajo/algebra/Selection.java | 5 +
.../org/apache/tajo/algebra/SetOperation.java | 5 +
.../org/apache/tajo/algebra/SignedExpr.java | 6 +
.../tajo/algebra/SimpleTableSubQuery.java | 9 +-
.../main/java/org/apache/tajo/algebra/Sort.java | 25 +-
.../tajo/algebra/TablePrimarySubQuery.java | 10 +-
.../org/apache/tajo/algebra/TargetExpr.java | 67 -
.../org/apache/tajo/algebra/UnaryOperator.java | 6 +
.../org/apache/tajo/algebra/ValueListExpr.java | 6 +
.../java/org/apache/tajo/algebra/TestExpr.java | 9 +-
.../java/org/apache/tajo/catalog/Column.java | 8 +-
.../java/org/apache/tajo/catalog/Schema.java | 111 +-
.../tajo/catalog/partition/PartitionDesc.java | 6 +-
.../org/apache/tajo/catalog/TestColumn.java | 1 -
.../org/apache/tajo/catalog/TestSchema.java | 4 +-
.../apache/tajo/catalog/store/HCatalogUtil.java | 3 +-
.../java/org/apache/tajo/client/TajoClient.java | 12 +-
.../java/org/apache/tajo/datum/Float8Datum.java | 5 +-
.../java/org/apache/tajo/datum/TextDatum.java | 2 +-
.../org/apache/tajo/common/type/TestIPv4.java | 8 +-
.../org/apache/tajo/datum/TestBitDatum.java | 4 +-
.../org/apache/tajo/engine/parser/SQLParser.g4 | 14 +-
.../apache/tajo/engine/eval/AlgebraicUtil.java | 5 +
.../org/apache/tajo/engine/eval/BinaryEval.java | 3 +-
.../apache/tajo/engine/eval/CaseWhenEval.java | 9 +-
.../apache/tajo/engine/eval/EvalTreeUtil.java | 35 +-
.../org/apache/tajo/engine/eval/FieldEval.java | 15 +-
.../org/apache/tajo/engine/eval/InEval.java | 11 +
.../org/apache/tajo/engine/eval/IsNullEval.java | 5 +
.../org/apache/tajo/engine/eval/NotEval.java | 3 +-
.../engine/exception/NoSuchColumnException.java | 2 +-
.../tajo/engine/parser/HiveConverter.java | 18 +-
.../apache/tajo/engine/parser/SQLAnalyzer.java | 39 +-
.../tajo/engine/planner/AlgebraVisitor.java | 112 +-
.../tajo/engine/planner/BaseAlgebraVisitor.java | 256 +--
.../engine/planner/BasicLogicalPlanVisitor.java | 12 +
.../planner/ExplainLogicalPlanVisitor.java | 5 +
.../tajo/engine/planner/ExprAnnotator.java | 622 ++++++
.../apache/tajo/engine/planner/ExprFinder.java | 72 +
.../tajo/engine/planner/ExprNormalizer.java | 259 +++
.../tajo/engine/planner/GroupElement.java | 21 +-
.../apache/tajo/engine/planner/InsertNode.java | 17 +-
.../tajo/engine/planner/LogicalOptimizer.java | 36 +-
.../apache/tajo/engine/planner/LogicalPlan.java | 599 ++----
.../engine/planner/LogicalPlanPreprocessor.java | 301 +++
.../engine/planner/LogicalPlanVerifier.java | 3 -
.../tajo/engine/planner/LogicalPlanVisitor.java | 3 +
.../tajo/engine/planner/LogicalPlanner.java | 1873 +++++++++---------
.../tajo/engine/planner/NamedExprsManager.java | 271 +++
.../engine/planner/PhysicalPlannerImpl.java | 63 +-
.../apache/tajo/engine/planner/PlannerUtil.java | 113 +-
.../apache/tajo/engine/planner/Projector.java | 66 +-
.../engine/planner/RangePartitionAlgorithm.java | 3 +
.../engine/planner/SimpleAlgebraVisitor.java | 210 ++
.../org/apache/tajo/engine/planner/Target.java | 22 +-
.../tajo/engine/planner/TargetListManager.java | 234 ---
.../engine/planner/global/GlobalPlanner.java | 80 +-
.../engine/planner/logical/CreateTableNode.java | 12 +-
.../engine/planner/logical/DropTableNode.java | 5 +-
.../engine/planner/logical/EvalExprNode.java | 3 +-
.../engine/planner/logical/GroupbyNode.java | 53 +-
.../tajo/engine/planner/logical/HavingNode.java | 73 +
.../engine/planner/logical/IndexScanNode.java | 1 -
.../tajo/engine/planner/logical/JoinNode.java | 33 +-
.../tajo/engine/planner/logical/LimitNode.java | 7 +-
.../tajo/engine/planner/logical/NodeType.java | 1 +
.../engine/planner/logical/Projectable.java | 7 +
.../engine/planner/logical/ProjectionNode.java | 8 +-
.../engine/planner/logical/RelationNode.java | 10 +
.../tajo/engine/planner/logical/ScanNode.java | 1 +
.../engine/planner/logical/SelectionNode.java | 9 +-
.../tajo/engine/planner/logical/SortNode.java | 13 +-
.../planner/logical/TableSubQueryNode.java | 53 +-
.../tajo/engine/planner/logical/UnionNode.java | 8 +-
.../engine/planner/logical/join/JoinGraph.java | 69 +-
.../planner/physical/AggregationExec.java | 44 +-
.../engine/planner/physical/BNLJoinExec.java | 153 +-
.../planner/physical/BSTIndexScanExec.java | 2 +-
.../physical/BasicPhysicalExecutorVisitor.java | 201 +-
.../engine/planner/physical/EvalExprExec.java | 8 +-
.../planner/physical/HashAggregateExec.java | 20 +-
.../planner/physical/HashFullOuterJoinExec.java | 2 +-
.../engine/planner/physical/HashJoinExec.java | 16 +-
.../planner/physical/HashLeftOuterJoinExec.java | 2 +-
.../engine/planner/physical/HavingExec.java | 59 +
.../physical/MergeFullOuterJoinExec.java | 2 +-
.../engine/planner/physical/MergeJoinExec.java | 2 +-
.../engine/planner/physical/NLJoinExec.java | 2 +-
.../planner/physical/NLLeftOuterJoinExec.java | 2 +-
.../physical/PhysicalExecutorVisitor.java | 89 +-
.../planner/physical/PhysicalPlanUtil.java | 7 +-
.../engine/planner/physical/ProjectionExec.java | 8 +-
.../physical/RightOuterMergeJoinExec.java | 2 +-
.../engine/planner/physical/SelectionExec.java | 21 +-
.../engine/planner/physical/SeqScanExec.java | 2 +-
.../planner/rewrite/FilterPushDownRule.java | 2 +-
.../rewrite/PartitionedTableRewriter.java | 7 +-
.../planner/rewrite/ProjectionPushDownRule.java | 848 +++++---
.../apache/tajo/engine/utils/SchemaUtil.java | 24 +-
.../org/apache/tajo/master/GlobalEngine.java | 14 +-
.../master/GreedyFragmentScheduleAlgorithm.java | 4 +-
.../java/org/apache/tajo/master/TajoMaster.java | 2 -
.../apache/tajo/engine/eval/ExprTestBase.java | 38 +-
.../apache/tajo/engine/eval/TestEvalTree.java | 247 +--
.../tajo/engine/eval/TestEvalTreeUtil.java | 66 +-
.../apache/tajo/engine/eval/TestPredicates.java | 233 ++-
.../tajo/engine/parser/TestHiveConverter.java | 12 -
.../tajo/engine/planner/TestLogicalNode.java | 6 +-
.../tajo/engine/planner/TestLogicalPlan.java | 2 +-
.../tajo/engine/planner/TestLogicalPlanner.java | 106 +-
.../tajo/engine/planner/TestPlannerUtil.java | 2 -
.../planner/physical/TestBSTIndexExec.java | 6 +-
.../planner/physical/TestHashAntiJoinExec.java | 4 +-
.../planner/physical/TestHashSemiJoinExec.java | 1 -
.../planner/physical/TestPhysicalPlanner.java | 28 +-
.../apache/tajo/engine/query/TestCTASQuery.java | 5 +-
.../tajo/engine/query/TestGroupByQuery.java | 29 +
.../apache/tajo/engine/query/TestJoinQuery.java | 48 +-
.../tajo/engine/query/TestSelectQuery.java | 26 +-
.../apache/tajo/engine/query/TestSortQuery.java | 19 +-
.../tajo/engine/query/TestTablePartitions.java | 18 +-
.../tajo/engine/query/TestUnionQuery.java | 135 ++
.../org/apache/tajo/jdbc/TestResultSet.java | 3 -
.../java/org/apache/tajo/jdbc/TestTajoJdbc.java | 1 -
.../tajo/master/TestExecutionBlockCursor.java | 3 +-
.../tajo/worker/TestRangeRetrieverHandler.java | 26 +-
.../worker/dataserver/TestHttpDataServer.java | 2 -
.../resources/dataset/TestJoinQuery/table1.tbl | 5 +
.../resources/dataset/TestJoinQuery/table2.tbl | 4 +
.../TestGroupByQuery/testGroupByNested1.sql | 1 +
.../TestGroupByQuery/testGroupByNested2.sql | 1 +
.../queries/TestJoinQuery/oj_table1_ddl.sql | 6 +
.../queries/TestJoinQuery/oj_table2_ddl.sql | 6 +
.../queries/TestJoinQuery/testCrossJoin.sql | 2 +-
.../TestJoinQuery/testCrossJoinAndCaseWhen.sql | 18 +
.../testCrossJoinWithExplicitJoinQual.sql | 1 -
.../TestJoinQuery/testJoinAndCaseWhen.sql | 15 -
.../queries/TestJoinQuery/testJoinRefEval.sql | 12 +-
.../TestJoinQuery/testOuterJoinAndCaseWhen1.sql | 9 +
.../queries/TestJoinQuery/testTPCHQ2Join.sql | 5 +
.../TestJoinQuery/testWhereClauseJoin1.sql | 10 +
.../TestJoinQuery/testWhereClauseJoin2.sql | 8 +
.../TestJoinQuery/testWhereClauseJoin3.sql | 9 +
.../TestJoinQuery/testWhereClauseJoin4.sql | 8 +
.../TestJoinQuery/testWhereClauseJoin5.sql | 15 +
.../TestJoinQuery/testWhereClauseJoin6.sql | 19 +
.../TestSelectQuery/testSelectColumnAlias1.sql | 1 +
.../queries/TestSelectQuery/testUnion1.sql | 19 -
.../queries/TestSelectQuery/testUnion2.sql | 9 -
.../TestSortQuery/testSortAfterGroupby.sql | 2 +-
.../TestSortQuery/testSortWithAlias1.sql | 1 +
.../TestSortQuery/testSortWithAliasKey.sql | 1 -
.../queries/TestSortQuery/testSortWithExpr1.sql | 1 +
.../queries/TestSortQuery/testSortWithExpr2.sql | 1 +
.../queries/TestTPCH/testQ2FourJoins.sql | 14 +-
.../queries/TestTPCH/testTPCH14Expr.sql | 11 +-
.../queries/TestUnionQuery/testUnion1.sql | 19 +
.../queries/TestUnionQuery/testUnion10.sql | 150 ++
.../queries/TestUnionQuery/testUnion2.sql | 18 +
.../queries/TestUnionQuery/testUnion3.sql | 19 +
.../queries/TestUnionQuery/testUnion4.sql | 16 +
.../queries/TestUnionQuery/testUnion5.sql | 20 +
.../queries/TestUnionQuery/testUnion6.sql | 15 +
.../queries/TestUnionQuery/testUnion7.sql | 18 +
.../queries/TestUnionQuery/testUnion8.sql | 24 +
.../queries/TestUnionQuery/testUnion9.sql | 29 +
.../TestGroupByQuery/testGroupByNested1.result | 6 +
.../TestGroupByQuery/testGroupByNested2.result | 6 +
.../results/TestJoinQuery/testCrossJoin.result | 200 +-
.../testCrossJoinAndCaseWhen.result | 27 +
.../testCrossJoinWithExplicitJoinQual.result | 27 -
.../TestJoinQuery/testJoinAndCaseWhen.result | 27 -
.../TestJoinQuery/testJoinRefEval.result | 28 +-
.../testOuterJoinAndCaseWhen1.result | 7 +
.../results/TestJoinQuery/testTPCHQ2Join.result | 2 +-
.../TestJoinQuery/testWhereClauseJoin1.result | 27 +
.../TestJoinQuery/testWhereClauseJoin2.result | 27 +
.../TestJoinQuery/testWhereClauseJoin3.result | 27 +
.../TestJoinQuery/testWhereClauseJoin4.result | 27 +
.../TestJoinQuery/testWhereClauseJoin5.result | 5 +
.../testSelectColumnAlias1.result | 7 +
.../TestSortQuery/testSortAfterGroupby.result | 2 +-
.../TestSortQuery/testSortWithAlias1.result | 7 +
.../TestSortQuery/testSortWithAliasKey.result | 7 -
.../TestSortQuery/testSortWithExpr1.result | 7 +
.../TestSortQuery/testSortWithExpr2.result | 7 +
.../results/TestUnionQuery/testUnion1.result | 10 +
.../results/TestUnionQuery/testUnion10.result | 22 +
.../results/TestUnionQuery/testUnion2.result | 12 +
.../results/TestUnionQuery/testUnion3.result | 4 +
.../results/TestUnionQuery/testUnion4.result | 3 +
.../results/TestUnionQuery/testUnion5.result | 3 +
.../results/TestUnionQuery/testUnion6.result | 3 +
.../results/TestUnionQuery/testUnion7.result | 12 +
.../results/TestUnionQuery/testUnion8.result | 3 +
.../results/TestUnionQuery/testUnion9.result | 7 +
.../org/apache/tajo/storage/v2/DiskUtil.java | 1 -
225 files changed, 6843 insertions(+), 3480 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
index 72acaa9..affb3bb 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Aggregation.java
@@ -18,10 +18,11 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class Aggregation extends UnaryOperator {
- private TargetExpr[] targets;
+ private NamedExpr[] targets;
private GroupElement [] groups;
private Expr havingCondition;
@@ -29,11 +30,11 @@ public class Aggregation extends UnaryOperator {
super(OpType.Aggregation);
}
- public TargetExpr[] getTargets() {
+ public NamedExpr[] getTargets() {
return this.targets;
}
- public void setTargets(TargetExpr[] targets) {
+ public void setTargets(NamedExpr[] targets) {
this.targets = targets;
}
@@ -62,6 +63,11 @@ public class Aggregation extends UnaryOperator {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(targets, groups, havingCondition);
+ }
+
+ @Override
public boolean equalsTo(Expr expr) {
Aggregation another = (Aggregation) expr;
boolean a = TUtil.checkEquals(groups, another.groups);
@@ -73,19 +79,19 @@ public class Aggregation extends UnaryOperator {
public static class GroupElement implements JsonSerializable {
private GroupType group_type;
- private ColumnReferenceExpr[] columns;
+ private Expr [] grouping_sets;
- public GroupElement(GroupType groupType, ColumnReferenceExpr[] columns) {
+ public GroupElement(GroupType groupType, Expr[] grouping_sets) {
this.group_type = groupType;
- this.columns = columns;
+ this.grouping_sets = grouping_sets;
}
public GroupType getType() {
return this.group_type;
}
- public ColumnReferenceExpr[] getColumns() {
- return this.columns;
+ public Expr[] getGroupingSets() {
+ return this.grouping_sets;
}
public String toString() {
@@ -97,11 +103,17 @@ public class Aggregation extends UnaryOperator {
return JsonHelper.toJson(this);
}
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(group_type, grouping_sets);
+ }
+
+ @Override
public boolean equals(Object obj) {
if (obj instanceof GroupElement) {
GroupElement other = (GroupElement) obj;
return group_type.equals(other) &&
- TUtil.checkEquals(columns, other.columns);
+ TUtil.checkEquals(grouping_sets, other.grouping_sets);
}
return false;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
index 19f66af..f504994 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BetweenPredicate.java
@@ -18,6 +18,8 @@
package org.apache.tajo.algebra;
+import java.util.Objects;
+
public class BetweenPredicate extends Expr {
private boolean not;
// if symmetric is not set, asymmetric is implicit.
@@ -57,6 +59,11 @@ public class BetweenPredicate extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hash(not, symmetric, predicand, begin, end);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
BetweenPredicate another = (BetweenPredicate) expr;
return symmetric == another.symmetric && predicand.equals(another.predicand) && begin.equals(another.begin) &&
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
index a090623..da37098 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/BinaryOperator.java
@@ -18,6 +18,8 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
+
public class BinaryOperator extends Expr {
protected Expr left;
protected Expr right;
@@ -48,8 +50,16 @@ public class BinaryOperator extends Expr {
this.right = right;
}
+ public int hashCode() {
+ return Objects.hashCode(opType, left, right);
+ }
+
@Override
boolean equalsTo(Expr expr) {
return true;
}
+
+ public String toString() {
+ return left.toString() + " " + opType.toString() + " " + right.toString();
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
index 398aa55..27869b3 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CaseWhenPredicate.java
@@ -18,6 +18,8 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -51,6 +53,11 @@ public class CaseWhenPredicate extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(whens, elseResult);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
return false;
}
@@ -69,14 +76,26 @@ public class CaseWhenPredicate extends Expr {
this.result = result;
}
+ public void setCondition(Expr condition) {
+ this.condition = condition;
+ }
+
public Expr getCondition() {
return this.condition;
}
+ public void setResult(Expr result) {
+ this.result = result;
+ }
+
public Expr getResult() {
return this.result;
}
+ public int hashCode() {
+ return Objects.hashCode(condition, result);
+ }
+
public boolean equals(Object obj) {
if (obj instanceof WhenExpr) {
WhenExpr another = (WhenExpr) obj;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
index ad793cd..24f6415 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CastExpr.java
@@ -18,18 +18,19 @@
package org.apache.tajo.algebra;
-public class CastExpr extends Expr {
- private Expr operand;
+import com.google.common.base.Objects;
+
+public class CastExpr extends UnaryOperator {
private DataTypeExpr target;
public CastExpr(Expr operand, DataTypeExpr target) {
super(OpType.Cast);
- this.operand = operand;
this.target = target;
+ setChild(operand);
}
public Expr getOperand() {
- return operand;
+ return getChild();
}
public DataTypeExpr getTarget() {
@@ -37,8 +38,13 @@ public class CastExpr extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(target, getChild());
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
CastExpr another = (CastExpr) expr;
- return operand.equals(another.operand) && target.equals(another.target);
+ return target.equals(another.target);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
index 340577c..9734593 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ColumnReferenceExpr.java
@@ -18,37 +18,48 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class ColumnReferenceExpr extends Expr {
private String qualifier;
private String name;
- public ColumnReferenceExpr(String columnName) {
+ public ColumnReferenceExpr(String referenceName) {
super(OpType.Column);
- this.name = columnName;
+ setName(referenceName);
}
public ColumnReferenceExpr(String qualifier, String columnName) {
super(OpType.Column);
- this.qualifier = qualifier;
- this.name = columnName;
+ this.qualifier = qualifier.toLowerCase();
+ this.name = columnName.toLowerCase();
+ }
+
+ public boolean hasQualifier() {
+ return this.qualifier != null;
}
public void setQualifier(String qualifier) {
- this.qualifier = qualifier;
+ this.qualifier = qualifier.toLowerCase();
}
- public String getName() {
- return this.name;
+ public String getQualifier() {
+ return this.qualifier;
}
- public boolean hasQualifier() {
- return this.qualifier != null;
+ public String getName() {
+ return this.name;
}
- public String getQualifier() {
- return this.qualifier;
+ public void setName(String qualifiedName) {
+ String [] parts = qualifiedName.toLowerCase().split("\\.");
+ if (parts.length == 2) {
+ qualifier = parts[0];
+ name = parts[1];
+ } else {
+ name = parts[0];
+ }
}
public String getCanonicalName() {
@@ -59,9 +70,20 @@ public class ColumnReferenceExpr extends Expr {
}
}
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(name, qualifier);
+ }
+
+ @Override
public boolean equalsTo(Expr expr) {
ColumnReferenceExpr another = (ColumnReferenceExpr) expr;
return name.equals(another.name) &&
TUtil.checkEquals(qualifier, another.qualifier);
}
+
+ @Override
+ public String toString() {
+ return qualifier != null ? qualifier + "." + name : name;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java
index 77468fb..cf2efb5 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CountRowsFunctionExpr.java
@@ -18,4 +18,9 @@ public class CountRowsFunctionExpr extends FunctionExpr {
public CountRowsFunctionExpr() {
super(OpType.CountRowsFunction, "count");
}
+
+ @Override
+ public int hashCode() {
+ return "count_row".hashCode();
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
index a85e366..3aadd8a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/CreateTable.java
@@ -18,6 +18,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
import java.util.List;
@@ -128,9 +129,15 @@ public class CreateTable extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(external, tableElements, tableName, storageType, location, subquery, params, getSubQuery());
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
CreateTable another = (CreateTable) expr;
- return tableName.equals(another.tableName) &&
+ return external == another.external &&
+ tableName.equals(another.tableName) &&
TUtil.checkEquals(tableElements, another.tableElements) &&
TUtil.checkEquals(storageType, another.storageType) &&
TUtil.checkEquals(location, another.location) &&
@@ -161,10 +168,18 @@ public class CreateTable extends Expr {
return this.col_name;
}
- public boolean equals(Object obj) {
- if (obj instanceof ColumnDefinition) {
- ColumnDefinition another = (ColumnDefinition) obj;
- return col_name.equals(another.col_name) && super.equals(another);
+ @Override
+ public int hashCode() {
+ int hash = super.hashCode();
+ return hash * 89 * col_name.hashCode();
+
+ }
+
+ @Override
+ public boolean equalsTo(Expr expr) {
+ if (expr instanceof ColumnDefinition) {
+ ColumnDefinition another = (ColumnDefinition) expr;
+ return col_name.equals(another.col_name) && super.equalsTo(another);
}
return false;
@@ -207,12 +222,27 @@ public class CreateTable extends Expr {
public List<RangePartitionSpecifier> getSpecifiers() {
return specifiers;
}
+
+ public int hashCode() {
+ return Objects.hashCode(type, columns, specifiers);
+ }
+
+ public boolean equals(Object object) {
+ if (object instanceof RangePartition) {
+ RangePartition another = (RangePartition) object;
+ return type == another.type && TUtil.checkEquals(columns, another.columns) &&
+ specifiers.equals(another.specifiers);
+ } else {
+ return false;
+ }
+ }
}
public static class HashPartition extends PartitionDescExpr {
ColumnReferenceExpr [] columns;
Expr quantity;
List<PartitionSpecifier> specifiers;
+
public HashPartition(ColumnReferenceExpr [] columns, Expr quantity) {
super(PartitionType.HASH);
this.columns = columns;
@@ -244,6 +274,20 @@ public class CreateTable extends Expr {
public List<PartitionSpecifier> getSpecifiers() {
return specifiers;
}
+
+ public int hashCode() {
+ return Objects.hashCode(type, columns, specifiers);
+ }
+
+ public boolean equals(Object object) {
+ if (object instanceof HashPartition) {
+ HashPartition another = (HashPartition) object;
+ return type == another.type && TUtil.checkEquals(columns, another.columns) &&
+ specifiers.equals(another.specifiers);
+ } else {
+ return false;
+ }
+ }
}
public static class ListPartition extends PartitionDescExpr {
@@ -263,6 +307,20 @@ public class CreateTable extends Expr {
public List<ListPartitionSpecifier> getSpecifiers() {
return specifiers;
}
+
+ public int hashCode() {
+ return Objects.hashCode(columns, specifiers);
+ }
+
+ public boolean equals(Object object) {
+ if (object instanceof HashPartition) {
+ HashPartition another = (HashPartition) object;
+ return type == another.type && TUtil.checkEquals(columns, another.columns) &&
+ specifiers.equals(another.specifiers);
+ } else {
+ return false;
+ }
+ }
}
public static class ColumnPartition extends PartitionDescExpr {
@@ -282,6 +340,19 @@ public class CreateTable extends Expr {
public boolean isOmitValues() {
return isOmitValues;
}
+
+ public int hashCode() {
+ return Objects.hashCode(columns);
+ }
+
+ public boolean equals(Object object) {
+ if (object instanceof HashPartition) {
+ HashPartition another = (HashPartition) object;
+ return type == another.type && TUtil.checkEquals(columns, another.columns);
+ } else {
+ return false;
+ }
+ }
}
public static class RangePartitionSpecifier extends PartitionSpecifier {
@@ -305,6 +376,23 @@ public class CreateTable extends Expr {
public boolean isEndMaxValue() {
return this.maxValue;
}
+
+ public int hashCode() {
+ return Objects.hashCode(end, maxValue);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ RangePartitionSpecifier that = (RangePartitionSpecifier) o;
+
+ if (maxValue != that.maxValue) return false;
+ if (!end.equals(that.end)) return false;
+
+ return true;
+ }
}
public static class ListPartitionSpecifier extends PartitionSpecifier {
@@ -318,6 +406,23 @@ public class CreateTable extends Expr {
public ValueListExpr getValueList() {
return valueList;
}
+
+ @Override
+ public int hashCode() {
+ return valueList.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ListPartitionSpecifier that = (ListPartitionSpecifier) o;
+
+ if (!valueList.equals(that.valueList)) return false;
+
+ return true;
+ }
}
public static class PartitionSpecifier {
@@ -330,5 +435,17 @@ public class CreateTable extends Expr {
public String getName() {
return this.name;
}
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ if (obj instanceof PartitionSpecifier ) {
+ return name == ((PartitionSpecifier)obj).name;
+ } else {
+ return false;
+ }
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
index 7b2b903..15d6d7e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DataTypeExpr.java
@@ -20,6 +20,8 @@ package org.apache.tajo.algebra;
import org.apache.tajo.util.TUtil;
+import java.util.Objects;
+
public class DataTypeExpr extends Expr {
String typeName;
Integer lengthOrPrecision;
@@ -59,6 +61,11 @@ public class DataTypeExpr extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hash(typeName, lengthOrPrecision, scale);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
DataTypeExpr another = (DataTypeExpr) expr;
return typeName.equals(another.typeName) &&
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
index e359ae0..57e0fcf 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DropTable.java
@@ -18,6 +18,8 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
+
public class DropTable extends Expr {
private final String tableName;
private final boolean purge;
@@ -37,6 +39,11 @@ public class DropTable extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(tableName, purge);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
if (expr instanceof DropTable) {
DropTable another = (DropTable) expr;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
index 0823807..fcb8531 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ExistsPredicate.java
@@ -18,14 +18,15 @@
package org.apache.tajo.algebra;
-public class ExistsPredicate extends Expr {
- private SimpleTableSubQuery simpleTableSubQuery;
+import com.google.common.base.Objects;
+
+public class ExistsPredicate extends UnaryOperator {
private boolean not;
public ExistsPredicate(SimpleTableSubQuery simpleTableSubQuery, boolean not) {
super(OpType.InPredicate);
- this.simpleTableSubQuery = simpleTableSubQuery;
this.not = not;
+ setChild(simpleTableSubQuery);
}
public boolean isNot() {
@@ -33,12 +34,17 @@ public class ExistsPredicate extends Expr {
}
public SimpleTableSubQuery getSubQuery() {
- return simpleTableSubQuery;
+ return (SimpleTableSubQuery) getChild();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(not, getChild());
}
@Override
boolean equalsTo(Expr expr) {
ExistsPredicate another = (ExistsPredicate) expr;
- return not == another.not && simpleTableSubQuery.equals(another.simpleTableSubQuery);
+ return not == another.not;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
index 54c230b..27184b3 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Expr.java
@@ -33,6 +33,9 @@ public abstract class Expr implements JsonSerializable {
return this.opType;
}
+ @Override
+ public abstract int hashCode();
+
abstract boolean equalsTo(Expr expr);
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
index 008bfc0..7f1dcd3 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/FunctionExpr.java
@@ -18,6 +18,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class FunctionExpr extends Expr {
@@ -63,6 +64,11 @@ public class FunctionExpr extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(signature, params);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
FunctionExpr another = (FunctionExpr) expr;
return signature.equals(another.signature) &&
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
index dcceae4..c45a58f 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/GeneralSetFunctionExpr.java
@@ -25,4 +25,15 @@ public class GeneralSetFunctionExpr extends FunctionExpr {
public boolean isDistinct() {
return distinct;
}
+
+ @Override
+ public int hashCode() {
+ int hash = super.hashCode();
+ return hash * 89 * (distinct ? 31 : 23);
+ }
+
+ @Override
+ public boolean equalsTo(Expr expr) {
+ return distinct == ((GeneralSetFunctionExpr)expr).distinct;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
index d48537a..53bd9ba 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Having.java
@@ -18,6 +18,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class Having extends UnaryOperator implements JsonSerializable {
@@ -46,6 +47,11 @@ public class Having extends UnaryOperator implements JsonSerializable {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(qual, getChild());
+ }
+
+ @Override
public boolean equalsTo(Expr expr) {
if (expr instanceof Having) {
Having other = (Having) expr;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
index 38c7ad4..c58c040 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Insert.java
@@ -18,6 +18,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
import java.util.Map;
@@ -112,6 +113,11 @@ public class Insert extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(overwrite, tableName, subquery, storageType, location, params);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
Insert another = (Insert) expr;
return overwrite == another.overwrite &&
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
index 35fc769..40f5dd2 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/IsNullPredicate.java
@@ -18,14 +18,15 @@
package org.apache.tajo.algebra;
-public class IsNullPredicate extends Expr {
+import com.google.common.base.Objects;
+
+public class IsNullPredicate extends UnaryOperator {
private final boolean not;
- private final Expr predicand;
public IsNullPredicate(boolean not, Expr column) {
super(OpType.IsNullPredicate);
this.not = not;
- this.predicand = column;
+ setChild(column);
}
public boolean isNot() {
@@ -33,12 +34,16 @@ public class IsNullPredicate extends Expr {
}
public Expr getPredicand() {
- return predicand;
+ return getChild();
+ }
+
+ public int hashCode() {
+ return Objects.hashCode(not, getChild());
}
@Override
boolean equalsTo(Expr expr) {
IsNullPredicate nullPredicate = (IsNullPredicate) expr;
- return not == nullPredicate.not && predicand.equals(nullPredicate.predicand);
+ return not == nullPredicate.not;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
index 51c84c2..da2b153 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Join.java
@@ -18,10 +18,9 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
-import java.util.Arrays;
-
public class Join extends BinaryOperator {
private JoinType joinType;
private Expr joinQual;
@@ -69,6 +68,11 @@ public class Join extends BinaryOperator {
return natural;
}
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(joinType, joinQual, joinColumns, natural);
+ }
+
boolean equalsTo(Expr expr) {
Join another = (Join) expr;
return joinType.equals(another.joinType) &&
@@ -81,14 +85,4 @@ public class Join extends BinaryOperator {
public String toJson() {
return JsonHelper.toJson(this);
}
-
- @Override
- public int hashCode() {
- int result = getType().hashCode();
- result = 31 * result + joinType.hashCode();
- result = 31 * result + (joinQual != null ? joinQual.hashCode() : 0);
- result = 31 * result + (joinColumns != null ? Arrays.hashCode(joinColumns) : 0);
- result = 31 * result + (natural ? 1 : 0);
- return result;
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
index dd3aee9..a217c5e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Limit.java
@@ -19,6 +19,8 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
+
public class Limit extends UnaryOperator {
private Expr fetchFirstNum;
@@ -41,6 +43,10 @@ public class Limit extends UnaryOperator {
return JsonHelper.toJson(this);
}
+ public int hashCode() {
+ return Objects.hashCode(fetchFirstNum, getChild());
+ }
+
@Override
boolean equalsTo(Expr expr) {
Limit another = (Limit) expr;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
index 9d8d71a..f7d7720 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/LiteralValue.java
@@ -18,6 +18,8 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
+
public class LiteralValue extends Expr {
protected LiteralType valueType;
protected String value;
@@ -44,6 +46,10 @@ public class LiteralValue extends Expr {
return this.value;
}
+ public int hashCode() {
+ return Objects.hashCode(valueType, value);
+ }
+
public boolean equalsTo(Expr expr) {
LiteralValue another = (LiteralValue) expr;
boolean a = valueType.equals(another.valueType);
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
new file mode 100644
index 0000000..bd73481
--- /dev/null
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NamedExpr.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.algebra;
+
+import com.google.common.base.Objects;
+import org.apache.tajo.util.TUtil;
+
+/**
+ * <code>NamedExpr</code> is an expression which can be aliased in a target list.
+ *
+ * <pre>
+ * SELECT col1 + col2 as a, sum(col2) as b, col3 as c, col4, ... FROM ...
+ * ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^
+ * expr1 expr2 expr3 expr4
+ * </pre>
+ *
+ * We define each expression in expr1 - expr4 as a named expression.
+ * In database community, each of them is called target or an expression in a select list,
+ * Each expression can be explicitly aliased as an given name.
+ */
+public class NamedExpr extends UnaryOperator {
+ private String alias;
+
+ public NamedExpr(Expr expr) {
+ super(OpType.Target);
+ setChild(expr);
+ }
+
+ public NamedExpr(Expr expr, String alias) {
+ this(expr);
+ setAlias(alias);
+ }
+
+ public Expr getExpr() {
+ return getChild();
+ }
+
+ public boolean hasAlias() {
+ return this.alias != null;
+ }
+
+ public String getAlias() {
+ return this.alias;
+ }
+
+ public void setAlias(String alias) {
+ this.alias = alias;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(alias, getChild());
+ }
+
+ @Override
+ public boolean equalsTo(Expr obj) {
+ if (obj instanceof NamedExpr) {
+ NamedExpr another = (NamedExpr) obj;
+ return TUtil.checkEquals(alias, another.alias);
+ }
+
+ return false;
+ }
+
+ public String toString() {
+ return getChild().toString() + (hasAlias() ? " AS " + alias : "");
+ }
+
+ @Override
+ public String toJson() {
+ return JsonHelper.toJson(this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java
index e4e7749..55d225a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/NullLiteral.java
@@ -25,6 +25,11 @@ public class NullLiteral extends Expr {
}
@Override
+ public int hashCode() {
+ return getType().hashCode();
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
return expr instanceof NullLiteral;
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
index ec6be1c..84f784e 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
@@ -85,7 +85,7 @@ public enum OpType {
// Other Expressions
Sign(SignedExpr.class),
Column(ColumnReferenceExpr.class),
- Target(TargetExpr.class),
+ Target(NamedExpr.class),
Function(FunctionExpr.class),
// Set Functions
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
index e3c7ba4..6f5ab68 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/PatternMatchPredicate.java
@@ -20,10 +20,8 @@ package org.apache.tajo.algebra;
import com.google.common.base.Preconditions;
-public class PatternMatchPredicate extends Expr {
+public class PatternMatchPredicate extends BinaryOperator {
private boolean not;
- private Expr columnRef;
- private Expr pattern;
private boolean caseInsensitive;
public PatternMatchPredicate(OpType opType, boolean not, Expr predicand, Expr pattern,
@@ -33,9 +31,9 @@ public class PatternMatchPredicate extends Expr {
opType == OpType.LikePredicate || opType == OpType.SimilarToPredicate || opType == OpType.Regexp,
"pattern matching predicate is only available: " + opType.name());
this.not = not;
- this.columnRef = predicand;
- this.pattern = pattern;
this.caseInsensitive = caseInsensitive;
+ setLeft(predicand);
+ setRight(pattern);
}
public PatternMatchPredicate(OpType opType, boolean not, Expr predicand, Expr pattern) {
@@ -47,11 +45,11 @@ public class PatternMatchPredicate extends Expr {
}
public Expr getPredicand() {
- return this.columnRef;
+ return getLeft();
}
public Expr getPattern() {
- return this.pattern;
+ return getRight();
}
public boolean isCaseInsensitive() {
@@ -61,9 +59,6 @@ public class PatternMatchPredicate extends Expr {
boolean equalsTo(Expr expr) {
PatternMatchPredicate another = (PatternMatchPredicate) expr;
return opType == another.opType &&
- not == another.not &&
- columnRef.equals(another.columnRef) &&
- pattern.equals(another.pattern) &&
- caseInsensitive == another.caseInsensitive;
+ not == another.not && caseInsensitive == another.caseInsensitive;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
index 958f20c..bcb6253 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Projection.java
@@ -18,13 +18,14 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class Projection extends UnaryOperator implements Cloneable {
private boolean all;
private boolean distinct = false;
- private TargetExpr [] targets;
+ private NamedExpr[] targets;
public Projection() {
super(OpType.Projection);
@@ -50,18 +51,22 @@ public class Projection extends UnaryOperator implements Cloneable {
return all;
}
- public TargetExpr[] getTargets() {
+ public NamedExpr[] getNamedExprs() {
return this.targets;
}
- public void setTargets(TargetExpr[] targets) {
+ public void setNamedExprs(NamedExpr[] targets) {
this.targets = targets;
}
+ public int hashCode() {
+ return Objects.hashCode(all, distinct, targets, getChild());
+ }
+
@Override
boolean equalsTo(Expr expr) {
Projection another = (Projection) expr;
- return TUtil.checkEquals(all, another.all) &&
+ return TUtil.checkEquals(all, another.all) && distinct == another.distinct &&
TUtil.checkEquals(targets, another.targets);
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
index 0cb0bbe..406794a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Relation.java
@@ -18,6 +18,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class Relation extends Expr {
@@ -59,16 +60,14 @@ public class Relation extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(tableName, alias);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
Relation other = (Relation) expr;
return TUtil.checkEquals(tableName, other.tableName) &&
TUtil.checkEquals(alias, other.alias);
}
-
- @Override
- public int hashCode() {
- int result = tableName.hashCode();
- result = 31 * result + (alias != null ? alias.hashCode() : 0);
- return result;
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
index 918ff46..18c4ce9 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/RelationList.java
@@ -14,6 +14,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import org.apache.tajo.util.TUtil;
@@ -53,6 +54,11 @@ public class RelationList extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(relations);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
Set<Expr> thisSet = TUtil.newHashSet(relations);
RelationList another = (RelationList) expr;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
index 2273a48..425c08f 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ScalarSubQuery.java
@@ -18,22 +18,20 @@
package org.apache.tajo.algebra;
-public class ScalarSubQuery extends Expr {
- private Expr subquery;
+public class ScalarSubQuery extends UnaryOperator {
public ScalarSubQuery(Expr subQuery) {
super(OpType.ScalarSubQuery);
- this.subquery = subQuery;
+ this.setChild(subQuery);
}
public Expr getSubQuery() {
- return this.subquery;
+ return getChild();
}
@Override
boolean equalsTo(Expr expr) {
- ScalarSubQuery another = (ScalarSubQuery) expr;
- return subquery.equals(another);
+ return true;
}
public String toJson() {
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
index f43c252..364e1b7 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Selection.java
@@ -18,6 +18,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class Selection extends UnaryOperator implements JsonSerializable {
@@ -45,6 +46,10 @@ public class Selection extends UnaryOperator implements JsonSerializable {
return JsonHelper.toJson(this);
}
+ public int hashCode() {
+ return Objects.hashCode(qual, getChild());
+ }
+
@Override
public boolean equalsTo(Expr expr) {
if (expr instanceof Selection) {
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
index 47ab44a..08ebd6a 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SetOperation.java
@@ -19,6 +19,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
public class SetOperation extends BinaryOperator {
@@ -40,6 +41,10 @@ public class SetOperation extends BinaryOperator {
distinct = false;
}
+ public int hashCode() {
+ return Objects.hashCode(distinct, getLeft(), getRight());
+ }
+
boolean equalsTo(Expr expr) {
SetOperation another = (SetOperation) expr;
return distinct == another.distinct;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
index 15fcb51..7b3438c 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SignedExpr.java
@@ -18,6 +18,8 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
+
public class SignedExpr extends UnaryOperator {
private boolean negative;
@@ -31,6 +33,10 @@ public class SignedExpr extends UnaryOperator {
return negative;
}
+ public int hashCode() {
+ return Objects.hashCode(negative, getChild());
+ }
+
@Override
boolean equalsTo(Expr expr) {
return negative == ((SignedExpr)expr).negative;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
index 91442dc..7bd3b78 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/SimpleTableSubQuery.java
@@ -18,21 +18,20 @@
package org.apache.tajo.algebra;
-public class SimpleTableSubQuery extends Expr {
- private Expr subquery;
+public class SimpleTableSubQuery extends UnaryOperator {
public SimpleTableSubQuery(Expr subquery) {
super(OpType.SimpleTableSubQuery);
- this.subquery = subquery;
+ setChild(subquery);
}
public Expr getSubQuery() {
- return subquery;
+ return getChild();
}
@Override
boolean equalsTo(Expr expr) {
- return subquery.equals(subquery);
+ return true;
}
public String toJson() {
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
index f57cd89..c047c54 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/Sort.java
@@ -18,7 +18,7 @@
package org.apache.tajo.algebra;
-import com.google.gson.annotations.SerializedName;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class Sort extends UnaryOperator {
@@ -38,6 +38,11 @@ public class Sort extends UnaryOperator {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(sortSpecs);
+ }
+
+ @Override
public boolean equalsTo(Expr expr) {
Sort another = (Sort) expr;
return TUtil.checkEquals(sortSpecs, another.sortSpecs);
@@ -49,12 +54,11 @@ public class Sort extends UnaryOperator {
}
public static class SortSpec {
- private ColumnReferenceExpr key;
+ private Expr key;
private boolean asc = true;
- @SerializedName("null_first")
private boolean nullFirst = false;
- public SortSpec(final ColumnReferenceExpr key) {
+ public SortSpec(final Expr key) {
this.key = key;
}
@@ -88,10 +92,16 @@ public class Sort extends UnaryOperator {
this.nullFirst = true;
}
- public final ColumnReferenceExpr getKey() {
+ public final Expr getKey() {
return this.key;
}
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(asc, key, nullFirst);
+ }
+
+ @Override
public boolean equals(Object obj) {
if (obj instanceof SortSpec) {
SortSpec other = (SortSpec) obj;
@@ -101,5 +111,10 @@ public class Sort extends UnaryOperator {
}
return false;
}
+
+ @Override
+ public String toString() {
+ return key + " " + (asc ? "asc" : "desc") + " " + (nullFirst ? "null first" :"");
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
index 929e9b2..90d89a4 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TablePrimarySubQuery.java
@@ -18,6 +18,9 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
+import org.apache.tajo.util.TUtil;
+
public class TablePrimarySubQuery extends Relation {
private Expr subquery;
private String [] columnNames;
@@ -43,9 +46,14 @@ public class TablePrimarySubQuery extends Relation {
return subquery;
}
+ public int hashCode() {
+ return Objects.hashCode(subquery, columnNames);
+ }
+
@Override
boolean equalsTo(Expr expr) {
- return subquery.equals(subquery);
+ TablePrimarySubQuery another = (TablePrimarySubQuery) expr;
+ return subquery.equals(subquery) && TUtil.checkEquals(columnNames, another.columnNames);
}
public String toJson() {
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
deleted file mode 100644
index 393790b..0000000
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TargetExpr.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.algebra;
-
-import org.apache.tajo.util.TUtil;
-
-public class TargetExpr extends Expr {
- private Expr expr;
- private String alias;
-
- public TargetExpr(Expr expr) {
- super(OpType.Target);
- this.expr = expr;
- }
-
- public TargetExpr(Expr expr, String alias) {
- this(expr);
- setAlias(alias);
- }
-
- public Expr getExpr() {
- return expr;
- }
-
- public boolean hasAlias() {
- return this.alias != null;
- }
-
- public String getAlias() {
- return this.alias;
- }
-
- public void setAlias(String alias) {
- this.alias = alias;
- }
-
- @Override
- public boolean equalsTo(Expr obj) {
- if (obj instanceof TargetExpr) {
- TargetExpr another = (TargetExpr) obj;
- return expr.equals(another.expr) && TUtil.checkEquals(alias, another.alias);
- }
-
- return false;
- }
-
- @Override
- public String toJson() {
- return JsonHelper.toJson(this);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
index fec87d0..2a1e730 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/UnaryOperator.java
@@ -18,6 +18,8 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
+
public abstract class UnaryOperator extends Expr {
private Expr child;
@@ -36,4 +38,8 @@ public abstract class UnaryOperator extends Expr {
public void setChild(Expr op) {
this.child = op;
}
+
+ public int hashCode() {
+ return Objects.hashCode(getType(), child.hashCode());
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
index bbcbd21..8d51a95 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/ValueListExpr.java
@@ -18,6 +18,7 @@
package org.apache.tajo.algebra;
+import com.google.common.base.Objects;
import org.apache.tajo.util.TUtil;
public class ValueListExpr extends Expr {
@@ -33,6 +34,11 @@ public class ValueListExpr extends Expr {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(values);
+ }
+
+ @Override
boolean equalsTo(Expr expr) {
ValueListExpr valueListExpr = (ValueListExpr) expr;
return TUtil.checkEquals(values, valueListExpr.values);
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java b/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
index 660176d..f327739 100644
--- a/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
+++ b/tajo-algebra/src/test/java/org/apache/tajo/algebra/TestExpr.java
@@ -36,6 +36,7 @@ public class TestExpr {
new LiteralValue("1", LiteralType.Unsigned_Integer),
new LiteralValue("2", LiteralType.Unsigned_Integer));
+ assertEquals(expr1.hashCode(), expr2.hashCode());
assertEquals(expr1, expr2);
Expr expr3 = new BinaryOperator(OpType.Minus,
@@ -102,8 +103,8 @@ public class TestExpr {
selection.setChild(relation);
Aggregation aggregation = new Aggregation();
- aggregation.setTargets(new TargetExpr[]{
- new TargetExpr(new ColumnReferenceExpr("col1"))
+ aggregation.setTargets(new NamedExpr[]{
+ new NamedExpr(new ColumnReferenceExpr("col1"))
}
);
@@ -129,8 +130,8 @@ public class TestExpr {
selection.setChild(relation);
Aggregation aggregation = new Aggregation();
- aggregation.setTargets(new TargetExpr[]{
- new TargetExpr(new ColumnReferenceExpr("col1"))
+ aggregation.setTargets(new NamedExpr[]{
+ new NamedExpr(new ColumnReferenceExpr("col1"))
});
aggregation.setChild(selection);
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java
index 436560e..cb42086 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Column.java
@@ -154,7 +154,13 @@ public class Column implements ProtoObject<ColumnProto>, Cloneable, GsonObject {
}
public String toString() {
- return getQualifiedName() +" (" + getDataType().getType() +"(" + getDataType().getLength() + "))";
+ StringBuilder sb = new StringBuilder(getQualifiedName());
+ sb.append(" (").append(getDataType().getType());
+ if (getDataType().getLength() > 0) {
+ sb.append("(" + getDataType().getLength() + ")");
+ }
+ sb.append(")");
+ return sb.toString();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
index 4ea3b81..a19d352 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
@@ -108,6 +108,26 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
return fields.get(id);
}
+ public Column getColumn(Column column) {
+ if (!contains(column)) {
+ return null;
+ }
+ if (column.hasQualifier()) {
+ return fields.get(fieldsByQualifiedName.get(column.getQualifiedName()));
+ } else {
+ return fields.get(fieldsByName.get(column.getColumnName()).get(0));
+ }
+ }
+
+ public Column getColumn(String name) {
+ String [] parts = name.split("\\.");
+ if (parts.length == 2) {
+ return getColumnByFQN(name);
+ } else {
+ return getColumnByName(name);
+ }
+ }
+
public Column getColumnByFQN(String qualifiedName) {
Integer cid = fieldsByQualifiedName.get(qualifiedName.toLowerCase());
return cid != null ? fields.get(cid) : null;
@@ -124,22 +144,44 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
if (list.size() == 1) {
return fields.get(list.get(0));
} else {
- StringBuilder sb = new StringBuilder();
- boolean first = true;
- for (Integer id : list) {
- if (first) {
- first = false;
- } else {
- sb.append(", ");
- }
- sb.append(fields.get(id));
- }
- throw new RuntimeException("Ambiguous Column Name: " + sb.toString());
+ throw throwAmbiguousFieldException(list);
}
}
+
+ private RuntimeException throwAmbiguousFieldException(Collection<Integer> idList) {
+ StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (Integer id : idList) {
+ if (first) {
+ first = false;
+ } else {
+ sb.append(", ");
+ }
+ sb.append(fields.get(id));
+ }
+ throw new RuntimeException("Ambiguous Column Name Access: " + sb.toString());
+ }
- public int getColumnId(String qualifiedName) {
- return fieldsByQualifiedName.get(qualifiedName.toLowerCase());
+ public int getColumnId(String name) {
+ String [] parts = name.split("\\.");
+ if (parts.length == 2) {
+ if (fieldsByQualifiedName.containsKey(name)) {
+ return fieldsByQualifiedName.get(name);
+ } else {
+ return -1;
+ }
+ } else {
+ List<Integer> list = fieldsByName.get(name);
+ if (list == null) {
+ return -1;
+ } else if (list.size() == 1) {
+ return fieldsByName.get(name).get(0);
+ } else if (list.size() == 0) {
+ return -1;
+ } else { // if list.size > 2
+ throw throwAmbiguousFieldException(list);
+ }
+ }
}
public int getColumnIdByName(String colName) {
@@ -155,12 +197,47 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
public List<Column> getColumns() {
return ImmutableList.copyOf(fields);
}
-
- public boolean contains(String colName) {
- return fieldsByQualifiedName.containsKey(colName.toLowerCase());
+ public boolean contains(String name) {
+ if (fieldsByQualifiedName.containsKey(name)) {
+ return true;
+ }
+ if (fieldsByName.containsKey(name)) {
+ if (fieldsByName.size() > 1) {
+ throw new RuntimeException("Ambiguous Column name");
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ public boolean contains(Column column) {
+ if (column.hasQualifier()) {
+ return fieldsByQualifiedName.containsKey(column.getQualifiedName());
+ } else {
+ if (fieldsByName.containsKey(column.getColumnName())) {
+ int num = fieldsByName.get(column.getColumnName()).size();
+ if (num == 0) {
+ throw new IllegalStateException("No such column name: " + column.getColumnName());
+ }
+ if (num > 1) {
+ throw new RuntimeException("Ambiguous column name: " + column.getColumnName());
+ }
+ return true;
+ }
+ return false;
+ }
+ }
+
+ public boolean containsByQualifiedName(String qualifiedName) {
+ return fieldsByQualifiedName.containsKey(qualifiedName.toLowerCase());
}
+ public boolean containsByName(String colName) {
+ return fieldsByName.containsKey(colName);
+ }
+
public boolean containsAll(Collection<Column> columns) {
return fields.containsAll(columns);
}
@@ -229,7 +306,7 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
public String toString() {
StringBuilder sb = new StringBuilder();
- sb.append("{");
+ sb.append("{(").append(getColumnNum()).append(") ");
int i = 0;
for(Column col : fields) {
sb.append(col);
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java
index 792d642..c3e31d8 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionDesc.java
@@ -181,9 +181,9 @@ public class PartitionDesc implements ProtoObject<CatalogProtos.PartitionDescPro
}
public String toString() {
- Gson gson = new GsonBuilder().setPrettyPrinting().
- excludeFieldsWithoutExposeAnnotation().create();
- return gson.toJson(this);
+ StringBuilder sb = new StringBuilder("Partition Type: " + partitionsType.name()).append(", key=");
+ sb.append(schema);
+ return sb.toString();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java
index b0b5051..81677c5 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestColumn.java
@@ -97,7 +97,6 @@ public class TestColumn {
public final void testToJson() {
Column col = new Column(field1.getProto());
String json = col.toJson();
- System.out.println(json);
Column fromJson = CatalogGsonHelper.fromJson(json, Column.class);
assertEquals(col, fromJson);
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
index 1422cf2..c879ecb 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
@@ -69,9 +69,9 @@ public class TestSchema {
@Test
public final void testAddField() {
Schema schema = new Schema();
- assertFalse(schema.contains("studentId"));
+ assertFalse(schema.containsByQualifiedName("studentId"));
schema.addColumn("studentId", Type.INT4);
- assertTrue(schema.contains("studentId"));
+ assertTrue(schema.containsByQualifiedName("studentId"));
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java b/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java
index 33b3e45..2c2400a 100644
--- a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java
+++ b/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/src/main/java/org/apache/tajo/catalog/store/HCatalogUtil.java
@@ -84,8 +84,7 @@ public class HCatalogUtil {
try {
return Enum.valueOf(TajoDataTypes.Type.class, typeStr);
} catch (IllegalArgumentException iae) {
- System.out.println("Cannot find a matched type aginst from '" + typeStr + "'");
- return null;
+ throw new InternalException("Cannot find a matched type aginst from '" + typeStr + "'");
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java b/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
index 7eabc08..a48142e 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
@@ -318,9 +318,15 @@ public class TajoClient {
builder.setQuery(sql);
TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
- ResultCode resultCode =
- tajoMasterService.updateQuery(null, builder.build()).getResultCode();
- return resultCode == ResultCode.OK;
+ UpdateQueryResponse response = tajoMasterService.updateQuery(null, builder.build());
+ if (response.getResultCode() == ResultCode.OK) {
+ return true;
+ } else {
+ if (response.hasErrorMessage()) {
+ LOG.error(response.getErrorMessage());
+ }
+ return false;
+ }
}
}.withRetries();
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
index 3569d02..782bfa3 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
@@ -24,6 +24,7 @@ package org.apache.tajo.datum;
import com.google.gson.annotations.Expose;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.datum.exception.InvalidOperationException;
+import org.apache.tajo.util.Bytes;
import org.apache.tajo.util.NumberUtil;
import java.nio.ByteBuffer;
@@ -70,9 +71,7 @@ public class Float8Datum extends NumericDatum {
@Override
public byte[] asByteArray() {
- ByteBuffer bb = ByteBuffer.allocate(8);
- bb.putDouble(val);
- return bb.array();
+ return Bytes.toBytes(val);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
index 26f7297..fba3fe9 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
@@ -138,7 +138,7 @@ public class TextDatum extends Datum {
case NULL_TYPE:
return datum;
default:
- throw new InvalidOperationException();
+ throw new InvalidOperationException("Cannot equivalent check: " + this.type() + " and " + datum.type());
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java b/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
index 2f11f8a..884ad8f 100644
--- a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
+++ b/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
@@ -26,13 +26,9 @@ import static org.junit.Assert.*;
public class TestIPv4 {
@Test
- public final void testSet() {
+ public final void testSet() throws InvalidAddressException {
IPv4 ip = null;
- try {
- ip = new IPv4("255.255.255.255");
- } catch (InvalidAddressException e) {
- System.out.println("InvalidAddressException is catched");
- }
+ ip = new IPv4("255.255.255.255");
byte[] b = new byte[4];
for (int i = 0; i < 4; i++) {
b[i] = (byte)0xFF;
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java
index b6b84d9..812c4c7 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestBitDatum.java
@@ -66,8 +66,8 @@ public class TestBitDatum {
@Test
public final void testAsChars() {
- Datum d = DatumFactory.createBit((byte) 5);
- System.out.println(d.asChars());
+ Datum d = DatumFactory.createBit((byte) 'a');
+ assertEquals("0x97", d.asChars());
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
index 4b5eea4..9b693c7 100644
--- a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
+++ b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
@@ -574,11 +574,11 @@ boolean_value_expression
;
or_predicate
- : and_predicate (OR boolean_value_expression)*
+ : and_predicate (OR or_predicate)*
;
and_predicate
- : boolean_factor (AND boolean_value_expression)*
+ : boolean_factor (AND and_predicate)*
;
boolean_factor
@@ -789,8 +789,8 @@ grouping_element
;
ordinary_grouping_set
- : column_reference_list
- | LEFT_PAREN column_reference_list RIGHT_PAREN
+ : row_value_predicand_list
+ | LEFT_PAREN row_value_predicand_list RIGHT_PAREN
;
rollup_list
@@ -809,6 +809,10 @@ having_clause
: HAVING boolean_value_expression
;
+row_value_predicand_list
+ : row_value_predicand (COMMA row_value_predicand)*
+ ;
+
/*
===============================================================================
7.13 <query expression>
@@ -1124,7 +1128,7 @@ sort_specifier_list
;
sort_specifier
- : column=column_reference order=order_specification? null_order=null_ordering?
+ : key=row_value_predicand order=order_specification? null_order=null_ordering?
;
order_specification
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/8e1f989a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
index e933ddb..70ae712 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/AlgebraicUtil.java
@@ -131,6 +131,11 @@ public class AlgebraicUtil {
* @return the simplified expr
*/
public static EvalNode eliminateConstantExprs(EvalNode expr) {
+
+ if (expr.getType() == EvalType.FIELD) {
+ return expr;
+ }
+
EvalNode left = expr.getLeftExpr();
EvalNode right = expr.getRightExpr();