Repository: calcite
Updated Branches:
  refs/heads/master 87c4b735b -> a5f09f5a5 (forced update)


Test case for [CALCITE-2592] EnumerableMergeJoin is never taken

It turns out EnumerableMergeJoin cannot be planned


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/a5f09f5a
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/a5f09f5a
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/a5f09f5a

Branch: refs/heads/master
Commit: a5f09f5a57c6d0231036f49cb567abd535b00112
Parents: 464785f
Author: Vladimir Sitnikov <[email protected]>
Authored: Sun Sep 23 22:34:47 2018 +0300
Committer: Julian Hyde <[email protected]>
Committed: Mon Sep 24 00:24:15 2018 -0400

----------------------------------------------------------------------
 .../plan/volcano/VolcanoPlannerTest.java        | 43 ++++++++++++++++++++
 1 file changed, 43 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/a5f09f5a/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTest.java 
b/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTest.java
index 91b961d..959073d 100644
--- a/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTest.java
@@ -17,16 +17,20 @@
 package org.apache.calcite.plan.volcano;
 
 import org.apache.calcite.adapter.enumerable.EnumerableConvention;
+import org.apache.calcite.adapter.enumerable.EnumerableRules;
 import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.ConventionTraitDef;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptListener;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.plan.RelTraitSet;
+import org.apache.calcite.rel.RelCollationTraitDef;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterImpl;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rel.rules.ProjectRemoveRule;
@@ -49,6 +53,7 @@ import static 
org.apache.calcite.plan.volcano.PlannerTests.PhysLeafRule;
 import static org.apache.calcite.plan.volcano.PlannerTests.PhysSingleRel;
 import static org.apache.calcite.plan.volcano.PlannerTests.TestSingleRel;
 import static org.apache.calcite.plan.volcano.PlannerTests.newCluster;
+import static org.apache.calcite.test.Matchers.isLinux;
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertEquals;
@@ -327,6 +332,44 @@ public class VolcanoPlannerTest {
         resultLeaf.label);
   }
 
+  @Ignore("CALCITE-2592 EnumerableMergeJoin is never taken")
+  @Test public void testMergeJoin() {
+    VolcanoPlanner planner = new VolcanoPlanner();
+    planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
+
+    // Below two lines are important for the planner to use collation trait 
and generate merge join
+    planner.addRelTraitDef(RelCollationTraitDef.INSTANCE);
+    planner.registerAbstractRelationalRules();
+
+    planner.addRule(EnumerableRules.ENUMERABLE_MERGE_JOIN_RULE);
+    planner.addRule(EnumerableRules.ENUMERABLE_VALUES_RULE);
+    planner.addRule(EnumerableRules.ENUMERABLE_SORT_RULE);
+
+    RelOptCluster cluster = newCluster(planner);
+
+    RelBuilder relBuilder = RelFactories.LOGICAL_BUILDER.create(cluster, null);
+    RelNode logicalPlan = relBuilder
+        .values(new String[]{"id", "name"}, "2", "a", "1", "b")
+        .values(new String[]{"id", "name"}, "1", "x", "2", "y")
+        .join(JoinRelType.INNER, "id")
+        .build();
+
+    RelTraitSet desiredTraits =
+        cluster.traitSet().replace(EnumerableConvention.INSTANCE);
+    final RelNode newRoot = planner.changeTraits(logicalPlan, desiredTraits);
+    planner.setRoot(newRoot);
+
+    RelNode bestExp = planner.findBestExp();
+
+    final String plan = ""
+        + "EnumerableMergeJoin(condition=[=($0, $2)], joinType=[inner])\n"
+        + "  EnumerableSort(sort0=[$0], dir0=[ASC])\n"
+        + "    EnumerableValues(tuples=[[{ '2', 'a' }, { '1', 'b' }]])\n"
+        + "  EnumerableValues(tuples=[[{ '1', 'x' }, { '2', 'y' }]])\n";
+    assertThat("Merge join + sort is expected", plan,
+        isLinux(RelOptUtil.toString(bestExp)));
+  }
+
   /**
    * Tests whether planner correctly notifies listeners of events.
    */

Reply via email to