From 7a3a24936dcfcf47e2b64befaecb6a8b1b1720a3 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Fri, 31 Jul 2015 11:56:15 +0900 Subject: [PATCH 1/2] TAJO-1732 --- .../org/apache/tajo/benchmark/TestTPCH.java | 7 + .../queries/TestTPCH/testFirstJoinInQ7.sql | 13 ++ .../results/TestTPCH/testFirstJoinInQ7.plan | 156 ++++++++++++++++++ .../results/TestTPCH/testFirstJoinInQ7.result | 4 + .../apache/tajo/plan/logical/JoinNode.java | 4 + .../rewrite/rules/FilterPushDownRule.java | 3 + 6 files changed, 187 insertions(+) create mode 100644 tajo-core/src/test/resources/queries/TestTPCH/testFirstJoinInQ7.sql create mode 100644 tajo-core/src/test/resources/results/TestTPCH/testFirstJoinInQ7.plan create mode 100644 tajo-core/src/test/resources/results/TestTPCH/testFirstJoinInQ7.result diff --git a/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java b/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java index 9b7db2de0b..6390f905c5 100644 --- a/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java +++ b/tajo-core/src/test/java/org/apache/tajo/benchmark/TestTPCH.java @@ -60,4 +60,11 @@ public void testTPCH14Expr() throws Exception { public void testTPCHQ5() throws Exception { runSimpleTests(); } + + @Test + @Option(withExplain = true, withExplainGlobal = true) + @SimpleTest + public void testFirstJoinInQ7() throws Exception { + runSimpleTests(); + } } \ No newline at end of file diff --git a/tajo-core/src/test/resources/queries/TestTPCH/testFirstJoinInQ7.sql b/tajo-core/src/test/resources/queries/TestTPCH/testFirstJoinInQ7.sql new file mode 100644 index 0000000000..2dfb83d7ef --- /dev/null +++ b/tajo-core/src/test/resources/queries/TestTPCH/testFirstJoinInQ7.sql @@ -0,0 +1,13 @@ +select + n1.n_name as supp_nation, n2.n_name as cust_nation, n1.n_nationkey as s_nationkey, n2.n_nationkey as c_nationkey +from + nation n1 join nation n2 + on + n1.n_name = 'FRANCE' and n2.n_name = 'GERMANY' +UNION ALL +select + n1.n_name as supp_nation, n2.n_name as cust_nation, n1.n_nationkey as s_nationkey, n2.n_nationkey as c_nationkey +from + nation n1 join nation n2 + on + n2.n_name = 'FRANCE' and n1.n_name = 'GERMANY' \ No newline at end of file diff --git a/tajo-core/src/test/resources/results/TestTPCH/testFirstJoinInQ7.plan b/tajo-core/src/test/resources/results/TestTPCH/testFirstJoinInQ7.plan new file mode 100644 index 0000000000..d17f26cc65 --- /dev/null +++ b/tajo-core/src/test/resources/results/TestTPCH/testFirstJoinInQ7.plan @@ -0,0 +1,156 @@ +explain +------------------------------- +UNION(8) + PROJECTION(7) + => Targets: supp_nation (TEXT), cust_nation (TEXT), s_nationkey (INT4), c_nationkey (INT4) + => out schema: {(4) supp_nation (TEXT), cust_nation (TEXT), s_nationkey (INT4), c_nationkey (INT4)} + => in schema: {(4) supp_nation (TEXT), cust_nation (TEXT), s_nationkey (INT4), c_nationkey (INT4)} + JOIN(11)(CROSS) + => target list: c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT) + => out schema: {(4) c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(4) c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT)} + SCAN(4) on default.nation as n1 + => filter: default.n1.n_name (TEXT) = GERMANY + => target list: default.n1.n_name (TEXT) as supp_nation, default.n1.n_nationkey (INT4) as s_nationkey + => out schema: {(2) s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)} + SCAN(5) on default.nation as n2 + => filter: default.n2.n_name (TEXT) = FRANCE + => target list: default.n2.n_name (TEXT) as cust_nation, default.n2.n_nationkey (INT4) as c_nationkey + => out schema: {(2) c_nationkey (INT4), cust_nation (TEXT)} + => in schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} + PROJECTION(3) + => Targets: supp_nation (TEXT), cust_nation (TEXT), s_nationkey (INT4), c_nationkey (INT4) + => out schema: {(4) supp_nation (TEXT), cust_nation (TEXT), s_nationkey (INT4), c_nationkey (INT4)} + => in schema: {(4) supp_nation (TEXT), cust_nation (TEXT), s_nationkey (INT4), c_nationkey (INT4)} + JOIN(10)(CROSS) + => target list: c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT) + => out schema: {(4) c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(4) c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT)} + SCAN(0) on default.nation as n1 + => filter: default.n1.n_name (TEXT) = FRANCE + => target list: default.n1.n_name (TEXT) as supp_nation, default.n1.n_nationkey (INT4) as s_nationkey + => out schema: {(2) s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)} + SCAN(1) on default.nation as n2 + => filter: default.n2.n_name (TEXT) = GERMANY + => target list: default.n2.n_name (TEXT) as cust_nation, default.n2.n_nationkey (INT4) as c_nationkey + => out schema: {(2) c_nationkey (INT4), cust_nation (TEXT)} + => in schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} +explain +------------------------------- +------------------------------------------------------------------------------- +Execution Block Graph (TERMINAL - eb_0000000000000_0000_000007) +------------------------------------------------------------------------------- +|-eb_0000000000000_0000_000007 + |-eb_0000000000000_0000_000006 + |-eb_0000000000000_0000_000005 + |-eb_0000000000000_0000_000004 + |-eb_0000000000000_0000_000003 + |-eb_0000000000000_0000_000002 + |-eb_0000000000000_0000_000001 +------------------------------------------------------------------------------- +Order of Execution +------------------------------------------------------------------------------- +1: eb_0000000000000_0000_000001 +2: eb_0000000000000_0000_000002 +3: eb_0000000000000_0000_000004 +4: eb_0000000000000_0000_000005 +5: eb_0000000000000_0000_000003 +6: eb_0000000000000_0000_000006 +7: eb_0000000000000_0000_000007 +------------------------------------------------------------------------------- + +======================================================= +Block Id: eb_0000000000000_0000_000001 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE) + +SCAN(1) on default.nation as n2 + => filter: default.n2.n_name (TEXT) = GERMANY + => target list: default.n2.n_name (TEXT) as cust_nation, default.n2.n_nationkey (INT4) as c_nationkey + => out schema: {(2) c_nationkey (INT4), cust_nation (TEXT)} + => in schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} + +======================================================= +Block Id: eb_0000000000000_0000_000002 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE) + +SCAN(0) on default.nation as n1 + => filter: default.n1.n_name (TEXT) = FRANCE + => target list: default.n1.n_name (TEXT) as supp_nation, default.n1.n_nationkey (INT4) as s_nationkey + => out schema: {(2) s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)} + +======================================================= +Block Id: eb_0000000000000_0000_000004 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE) + +SCAN(5) on default.nation as n2 + => filter: default.n2.n_name (TEXT) = FRANCE + => target list: default.n2.n_name (TEXT) as cust_nation, default.n2.n_nationkey (INT4) as c_nationkey + => out schema: {(2) c_nationkey (INT4), cust_nation (TEXT)} + => in schema: {(4) default.n2.n_comment (TEXT), default.n2.n_name (TEXT), default.n2.n_nationkey (INT4), default.n2.n_regionkey (INT4)} + +======================================================= +Block Id: eb_0000000000000_0000_000005 [LEAF] +======================================================= + +[Outgoing] +[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE) + +SCAN(4) on default.nation as n1 + => filter: default.n1.n_name (TEXT) = GERMANY + => target list: default.n1.n_name (TEXT) as supp_nation, default.n1.n_nationkey (INT4) as s_nationkey + => out schema: {(2) s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(4) default.n1.n_comment (TEXT), default.n1.n_name (TEXT), default.n1.n_nationkey (INT4), default.n1.n_regionkey (INT4)} + +======================================================= +Block Id: eb_0000000000000_0000_000003 [ROOT] +======================================================= + +[Incoming] +[q_0000000000000_0000] 1 => 3 (type=HASH_SHUFFLE) +[q_0000000000000_0000] 2 => 3 (type=HASH_SHUFFLE) + +JOIN(10)(CROSS) + => target list: c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT) + => out schema: {(4) c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(4) c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT)} + SCAN(14) on eb_0000000000000_0000_000002 + => out schema: {(2) s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(2) s_nationkey (INT4), supp_nation (TEXT)} + SCAN(13) on eb_0000000000000_0000_000001 + => out schema: {(2) c_nationkey (INT4), cust_nation (TEXT)} + => in schema: {(2) c_nationkey (INT4), cust_nation (TEXT)} + +======================================================= +Block Id: eb_0000000000000_0000_000006 [ROOT] +======================================================= + +[Incoming] +[q_0000000000000_0000] 4 => 6 (type=HASH_SHUFFLE) +[q_0000000000000_0000] 5 => 6 (type=HASH_SHUFFLE) + +JOIN(11)(CROSS) + => target list: c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT) + => out schema: {(4) c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(4) c_nationkey (INT4), cust_nation (TEXT), s_nationkey (INT4), supp_nation (TEXT)} + SCAN(16) on eb_0000000000000_0000_000005 + => out schema: {(2) s_nationkey (INT4), supp_nation (TEXT)} + => in schema: {(2) s_nationkey (INT4), supp_nation (TEXT)} + SCAN(15) on eb_0000000000000_0000_000004 + => out schema: {(2) c_nationkey (INT4), cust_nation (TEXT)} + => in schema: {(2) c_nationkey (INT4), cust_nation (TEXT)} + +======================================================= +Block Id: eb_0000000000000_0000_000007 [TERMINAL] +======================================================= diff --git a/tajo-core/src/test/resources/results/TestTPCH/testFirstJoinInQ7.result b/tajo-core/src/test/resources/results/TestTPCH/testFirstJoinInQ7.result new file mode 100644 index 0000000000..9f5b85aebc --- /dev/null +++ b/tajo-core/src/test/resources/results/TestTPCH/testFirstJoinInQ7.result @@ -0,0 +1,4 @@ +supp_nation,cust_nation,s_nationkey,c_nationkey +------------------------------- +FRANCE,GERMANY,6,7 +GERMANY,FRANCE,7,6 diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java index 4f36026662..8b843a92d1 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/JoinNode.java @@ -61,6 +61,10 @@ public void setJoinQual(EvalNode joinQual) { this.joinSpec.setSingletonPredicate(joinQual); } + public void clearJoinQual() { + this.joinSpec.setPredicates(null); + } + public boolean hasJoinQual() { return this.joinSpec.hasPredicates(); } 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 4fb8aac3a1..30ef7a8612 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 @@ -177,6 +177,9 @@ public LogicalNode visitJoin(FilterPushDownContext context, LogicalPlan plan, Lo if (joinNode.hasJoinQual()) { onPredicates.addAll(TUtil.newHashSet(AlgebraicUtil.toConjunctiveNormalFormArray(joinNode.getJoinQual()))); } + // clear join qual + joinNode.clearJoinQual(); + // we assume all the quals in pushingDownFilters as where predicates Set nonPushableQuals = extractNonPushableJoinQuals(plan, block, joinNode, onPredicates, context.pushingDownFilters); From b3f5c01a9a505f42c953a2a4cc667835d90988c3 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Fri, 31 Jul 2015 12:23:26 +0900 Subject: [PATCH 2/2] trigger ci --- CHANGES | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGES b/CHANGES index 438841422e..84ce150af4 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,5 @@ Tajo Change Log - Release 0.11.0 - unreleased NEW FEATURES