zstan commented on a change in pull request #8456:
URL: https://github.com/apache/ignite/pull/8456#discussion_r531395804
##########
File path:
modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/PlannerTest.java
##########
@@ -2656,6 +2659,221 @@ public void testJoinPushExpressionRule() throws
Exception {
}
}
+ /** */
+ @Test
+ public void testMergeJoin() throws Exception {
+ IgniteTypeFactory f = new IgniteTypeFactory(IgniteTypeSystem.INSTANCE);
+
+ TestTable emp = new TestTable(
+ new RelDataTypeFactory.Builder(f)
+ .add("ID", f.createJavaType(Integer.class))
+ .add("NAME", f.createJavaType(String.class))
+ .add("DEPTNO", f.createJavaType(Integer.class))
+ .build()) {
+
+ @Override public IgniteDistribution distribution() {
+ return IgniteDistributions.broadcast();
+ }
+ };
+
+ emp.addIndex(new IgniteIndex(RelCollations.of(ImmutableIntList.of(1,
2)), "emp_idx", null, emp));
+
+ TestTable dept = new TestTable(
+ new RelDataTypeFactory.Builder(f)
+ .add("DEPTNO", f.createJavaType(Integer.class))
+ .add("NAME", f.createJavaType(String.class))
+ .build()) {
+
+ @Override public IgniteDistribution distribution() {
+ return IgniteDistributions.broadcast();
+ }
+ };
+
+ dept.addIndex(new IgniteIndex(RelCollations.of(ImmutableIntList.of(1,
0)), "dep_idx", null, dept));
+
+ IgniteSchema publicSchema = new IgniteSchema("PUBLIC");
+
+ publicSchema.addTable("EMP", emp);
+ publicSchema.addTable("DEPT", dept);
+
+ SchemaPlus schema = createRootSchema(false)
+ .add("PUBLIC", publicSchema);
+
+ String sql = "select * from dept d join emp e on d.deptno = e.deptno
and e.name = d.name order by e.name, d.deptno";
+
+ RelTraitDef<?>[] traitDefs = {
+ DistributionTraitDef.INSTANCE,
+ ConventionTraitDef.INSTANCE,
+ RelCollationTraitDef.INSTANCE,
+ RewindabilityTraitDef.INSTANCE,
+ CorrelationTraitDef.INSTANCE
+ };
+
+ PlanningContext ctx = PlanningContext.builder()
+ .localNodeId(F.first(nodes))
+ .originatingNodeId(F.first(nodes))
+ .parentContext(Contexts.empty())
+ .frameworkConfig(newConfigBuilder(FRAMEWORK_CONFIG)
+ .defaultSchema(schema)
+ .traitDefs(traitDefs)
+ .build())
+ .logger(log)
+ .query(sql)
+ .topologyVersion(AffinityTopologyVersion.NONE)
+ .build();
+
+ try (IgnitePlanner planner = ctx.planner()) {
+ assertNotNull(planner);
+
+ String qry = ctx.query();
+
+ assertNotNull(qry);
+
+ // Parse
+ SqlNode sqlNode = planner.parse(qry);
+
+ // Validate
+ sqlNode = planner.validate(sqlNode);
+
+ // Convert to Relational operators graph
+ RelRoot relRoot = planner.rel(sqlNode);
+
+ RelNode rel = relRoot.rel;
+
+ assertNotNull(rel);
+ assertEquals("" +
+ "LogicalSort(sort0=[$3], sort1=[$0], dir0=[ASC],
dir1=[ASC])\n" +
+ " LogicalProject(DEPTNO=[$0], NAME=[$1], ID=[$2],
NAME0=[$3], DEPTNO0=[$4])\n" +
+ " LogicalJoin(condition=[AND(=($0, $4), =($3, $1))],
joinType=[inner])\n" +
+ " IgniteLogicalTableScan(table=[[PUBLIC, DEPT]])\n" +
+ " IgniteLogicalTableScan(table=[[PUBLIC, EMP]])\n",
+ RelOptUtil.toString(rel));
+
+ // Transformation chain
+ RelTraitSet desired = rel.getTraitSet()
+ .replace(IgniteConvention.INSTANCE)
+ .replace(IgniteDistributions.single())
+ .simplify();
+
+ RelNode phys = planner.transform(PlannerPhase.OPTIMIZATION,
desired, rel);
+
+ assertNotNull(phys);
+ assertEquals("" +
+ "IgniteMergeJoin(condition=[AND(=($0, $4), =($3, $1))],
joinType=[inner])\n" +
+ " IgniteIndexScan(table=[[PUBLIC, DEPT]],
index=[dep_idx])\n" +
+ " IgniteIndexScan(table=[[PUBLIC, EMP]],
index=[emp_idx])\n",
+ RelOptUtil.toString(phys));
+ }
+ }
+
+ /** */
+ @Test
+ public void testMergeJoinIsNotAppliedForNonEquiJoin() throws Exception {
+ IgniteTypeFactory f = new IgniteTypeFactory(IgniteTypeSystem.INSTANCE);
+
+ TestTable emp = new TestTable(
+ new RelDataTypeFactory.Builder(f)
+ .add("ID", f.createJavaType(Integer.class))
+ .add("NAME", f.createJavaType(String.class))
+ .add("DEPTNO", f.createJavaType(Integer.class))
+ .build()) {
+
+ @Override public IgniteDistribution distribution() {
+ return IgniteDistributions.broadcast();
+ }
+ };
+
+ emp.addIndex(new IgniteIndex(RelCollations.of(ImmutableIntList.of(1,
2)), "emp_idx", null, emp));
+
+ TestTable dept = new TestTable(
+ new RelDataTypeFactory.Builder(f)
+ .add("DEPTNO", f.createJavaType(Integer.class))
+ .add("NAME", f.createJavaType(String.class))
+ .build()) {
+
+ @Override public IgniteDistribution distribution() {
+ return IgniteDistributions.broadcast();
+ }
+ };
+
+ dept.addIndex(new IgniteIndex(RelCollations.of(ImmutableIntList.of(1,
0)), "dep_idx", null, dept));
+
+ IgniteSchema publicSchema = new IgniteSchema("PUBLIC");
+
+ publicSchema.addTable("EMP", emp);
+ publicSchema.addTable("DEPT", dept);
+
+ SchemaPlus schema = createRootSchema(false)
+ .add("PUBLIC", publicSchema);
+
+ String sql = "select * from dept d join emp e on d.deptno = e.deptno
and e.name >= d.name order by e.name, d.deptno";
+
+ RelTraitDef<?>[] traitDefs = {
+ DistributionTraitDef.INSTANCE,
+ ConventionTraitDef.INSTANCE,
+ RelCollationTraitDef.INSTANCE,
+ RewindabilityTraitDef.INSTANCE,
+ CorrelationTraitDef.INSTANCE
+ };
+
+ PlanningContext ctx = PlanningContext.builder()
Review comment:
plz replace this huge code stuff with more compact one, like : RelNode
phys = physicalPlan(sql, publicSchema);
examples of usage near and upper in this class.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]