Repository: tajo Updated Branches: refs/heads/index_support 8e52ed43a -> f4ca97cee
TAJO-1275: Optimizer pushs down non-equi filter as theta join qualifier Closes #327 Project: http://git-wip-us.apache.org/repos/asf/tajo/repo Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/9e329a55 Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/9e329a55 Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/9e329a55 Branch: refs/heads/index_support Commit: 9e329a5509b71fa412299169dd3c866e54f46c77 Parents: 5a97079 Author: Keuntae Park <[email protected]> Authored: Fri Jan 2 17:45:46 2015 +0900 Committer: Keuntae Park <[email protected]> Committed: Fri Jan 2 17:45:46 2015 +0900 ---------------------------------------------------------------------- CHANGES | 3 +++ .../tajo/engine/planner/TestLogicalPlanner.java | 5 +++- .../apache/tajo/engine/query/TestJoinQuery.java | 28 ++++++++++++++++++++ ...stCrossJoinWithThetaJoinConditionInWhere.sql | 2 ++ ...stInnerJoinWithThetaJoinConditionInWhere.sql | 3 +++ ...ftOuterJoinWithThetaJoinConditionInWhere.sql | 3 +++ ...htOuterJoinWithThetaJoinConditionInWhere.sql | 3 +++ ...rossJoinWithThetaJoinConditionInWhere.result | 12 +++++++++ ...nnerJoinWithThetaJoinConditionInWhere.result | 7 +++++ ...uterJoinWithThetaJoinConditionInWhere.result | 4 +++ ...uterJoinWithThetaJoinConditionInWhere.result | 4 +++ .../plan/rewrite/rules/FilterPushDownRule.java | 16 +++++++++++ 12 files changed, 89 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index 653cdfc..547f373 100644 --- a/CHANGES +++ b/CHANGES @@ -134,6 +134,9 @@ Release 0.9.1 - unreleased BUG FIXES + TAJO-1275: Optimizer pushs down non-equi filter as theta join qualifier. + (Keuntae Park) + TAJO-1249: Tajo should check if a file format given in DDL is supported. (DaeMyung Kang via hyunsik) http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java index 180033d..889d61c 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java @@ -644,7 +644,10 @@ public class TestLogicalPlanner { , new FieldEval(new Column("default.t.n_nationkey", Type.INT4)) , new FieldEval(new Column("default.s.s_suppkey", Type.INT4)) ); - joinQualMap.put(joinQual, Boolean.FALSE); + + /* following code is commented because theta join is not supported yet + * TODO It SHOULD be restored after TAJO-742 is resolved. */ + //joinQualMap.put(joinQual, Boolean.FALSE); LogicalNode[] nodes = PlannerUtil.findAllNodes(node, NodeType.JOIN); for(LogicalNode eachNode : nodes) { http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java index 223ea8e..ecd933d 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java @@ -121,6 +121,34 @@ public class TestJoinQuery extends QueryTestCaseBase { } @Test + public final void testCrossJoinWithThetaJoinConditionInWhere() throws Exception { + ResultSet res = executeQuery(); + assertResultSet(res); + cleanupQuery(res); + } + + @Test + public final void testInnerJoinWithThetaJoinConditionInWhere() throws Exception { + ResultSet res = executeQuery(); + assertResultSet(res); + cleanupQuery(res); + } + + @Test + public final void testLeftOuterJoinWithThetaJoinConditionInWhere() throws Exception { + ResultSet res = executeQuery(); + assertResultSet(res); + cleanupQuery(res); + } + + @Test + public final void testRightOuterJoinWithThetaJoinConditionInWhere() throws Exception { + ResultSet res = executeQuery(); + assertResultSet(res); + cleanupQuery(res); + } + + @Test public final void testWhereClauseJoin1() throws Exception { ResultSet res = executeQuery(); assertResultSet(res); http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/resources/queries/TestJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.sql b/tajo-core/src/test/resources/queries/TestJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.sql new file mode 100644 index 0000000..4e20e16 --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.sql @@ -0,0 +1,2 @@ +select a.r_name as a_name, b.r_name as b_name from region a, region b +where a_name < b_name; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/resources/queries/TestJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.sql b/tajo-core/src/test/resources/queries/TestJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.sql new file mode 100644 index 0000000..90f4822 --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.sql @@ -0,0 +1,3 @@ +select a.r_regionkey, a.r_name, b.r_name from region a join region b +on a.r_regionkey = b.r_regionkey +where a.r_name <= b.r_name; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/resources/queries/TestJoinQuery/testLeftOuterJoinWithThetaJoinConditionInWhere.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestJoinQuery/testLeftOuterJoinWithThetaJoinConditionInWhere.sql b/tajo-core/src/test/resources/queries/TestJoinQuery/testLeftOuterJoinWithThetaJoinConditionInWhere.sql new file mode 100644 index 0000000..f9160c5 --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestJoinQuery/testLeftOuterJoinWithThetaJoinConditionInWhere.sql @@ -0,0 +1,3 @@ +select * from region a left outer join customer b +on a.r_regionkey = b.c_custkey +where a.r_name < b.c_name; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/resources/queries/TestJoinQuery/testRightOuterJoinWithThetaJoinConditionInWhere.sql ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/queries/TestJoinQuery/testRightOuterJoinWithThetaJoinConditionInWhere.sql b/tajo-core/src/test/resources/queries/TestJoinQuery/testRightOuterJoinWithThetaJoinConditionInWhere.sql new file mode 100644 index 0000000..10d9918 --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestJoinQuery/testRightOuterJoinWithThetaJoinConditionInWhere.sql @@ -0,0 +1,3 @@ +select * from region a right outer join customer b +on a.r_regionkey = b.c_custkey +where a.r_name < b.c_name; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/resources/results/TestJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.result ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.result b/tajo-core/src/test/resources/results/TestJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.result new file mode 100644 index 0000000..82b2757 --- /dev/null +++ b/tajo-core/src/test/resources/results/TestJoinQuery/testCrossJoinWithThetaJoinConditionInWhere.result @@ -0,0 +1,12 @@ +a_name,b_name +------------------------------- +AFRICA,AMERICA +AFRICA,ASIA +AFRICA,EUROPE +AFRICA,MIDDLE EAST +AMERICA,ASIA +AMERICA,EUROPE +AMERICA,MIDDLE EAST +ASIA,EUROPE +ASIA,MIDDLE EAST +EUROPE,MIDDLE EAST \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/resources/results/TestJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.result ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.result b/tajo-core/src/test/resources/results/TestJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.result new file mode 100644 index 0000000..b388d0b --- /dev/null +++ b/tajo-core/src/test/resources/results/TestJoinQuery/testInnerJoinWithThetaJoinConditionInWhere.result @@ -0,0 +1,7 @@ +r_regionkey,r_name,r_name +------------------------------- +0,AFRICA,AFRICA +1,AMERICA,AMERICA +2,ASIA,ASIA +3,EUROPE,EUROPE +4,MIDDLE EAST,MIDDLE EAST \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/resources/results/TestJoinQuery/testLeftOuterJoinWithThetaJoinConditionInWhere.result ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestJoinQuery/testLeftOuterJoinWithThetaJoinConditionInWhere.result b/tajo-core/src/test/resources/results/TestJoinQuery/testLeftOuterJoinWithThetaJoinConditionInWhere.result new file mode 100644 index 0000000..c727791 --- /dev/null +++ b/tajo-core/src/test/resources/results/TestJoinQuery/testLeftOuterJoinWithThetaJoinConditionInWhere.result @@ -0,0 +1,4 @@ +r_regionkey,r_name,r_comment,c_custkey,c_name,c_address,c_nationkey,c_phone,c_acctbal,c_mktsegment,c_comment +------------------------------- +1,AMERICA,hs use ironic, even requests. s,1,Customer#000000001,IVhzIApeRb ot,c,E,15,25-989-741-2988,711.56,BUILDING,to the even, regular platelets. regular, ironic epitaphs nag e +2,ASIA,ges. thinly even pinto beans ca,2,Customer#000000002,XSTf4,NCwDVaWNe6tEgvwfmRchLXak,13,23-768-687-3665,121.65,AUTOMOBILE,l accounts. blithely ironic theodolites integrate boldly: caref \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-core/src/test/resources/results/TestJoinQuery/testRightOuterJoinWithThetaJoinConditionInWhere.result ---------------------------------------------------------------------- diff --git a/tajo-core/src/test/resources/results/TestJoinQuery/testRightOuterJoinWithThetaJoinConditionInWhere.result b/tajo-core/src/test/resources/results/TestJoinQuery/testRightOuterJoinWithThetaJoinConditionInWhere.result new file mode 100644 index 0000000..c727791 --- /dev/null +++ b/tajo-core/src/test/resources/results/TestJoinQuery/testRightOuterJoinWithThetaJoinConditionInWhere.result @@ -0,0 +1,4 @@ +r_regionkey,r_name,r_comment,c_custkey,c_name,c_address,c_nationkey,c_phone,c_acctbal,c_mktsegment,c_comment +------------------------------- +1,AMERICA,hs use ironic, even requests. s,1,Customer#000000001,IVhzIApeRb ot,c,E,15,25-989-741-2988,711.56,BUILDING,to the even, regular platelets. regular, ironic epitaphs nag e +2,ASIA,ges. thinly even pinto beans ca,2,Customer#000000002,XSTf4,NCwDVaWNe6tEgvwfmRchLXak,13,23-768-687-3665,121.65,AUTOMOBILE,l accounts. blithely ironic theodolites integrate boldly: caref \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/9e329a55/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java ---------------------------------------------------------------------- diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java index 15750a1..ef5e7b6 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java @@ -210,6 +210,21 @@ public class FilterPushDownRule extends BasicLogicalPlanVisitor<FilterPushDownCo } } + /* non-equi filter should not be push down as a join qualifier until theta join is implemented + * TODO this code SHOULD be restored after TAJO-742 is resolved. */ + List<EvalNode> thetaJoinFilter = new ArrayList<EvalNode>(); + for (EvalNode eachEval: context.pushingDownFilters) { + if (eachEval.getType() != EvalType.EQUAL) { + if (EvalTreeUtil.isJoinQual(block, + joinNode.getLeftChild().getOutSchema(), + joinNode.getRightChild().getOutSchema(), + eachEval, true)) { + thetaJoinFilter.add(eachEval); + } + } + } + context.pushingDownFilters.removeAll(thetaJoinFilter); + // get evals from ON clause List<EvalNode> onConditions = new ArrayList<EvalNode>(); if (joinNode.hasJoinQual()) { @@ -344,6 +359,7 @@ public class FilterPushDownRule extends BasicLogicalPlanVisitor<FilterPushDownCo } context.pushingDownFilters.addAll(outerJoinFilterEvalsExcludePredication); + context.pushingDownFilters.addAll(thetaJoinFilter); return joinNode; }
