diff --git a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java index 7f94748be5d..76f3d119be0 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java @@ -108,7 +108,7 @@ public Correlate(RelInput input) { this( input.getCluster(), input.getTraitSet(), input.getInputs().get(0), input.getInputs().get(1), - new CorrelationId((Integer) input.get("correlationId")), + new CorrelationId((Integer) input.get("correlation")), input.getBitSet("requiredColumns"), input.getEnum("joinType", JoinRelType.class)); } @@ -158,7 +158,7 @@ public JoinRelType getJoinType() { return super.explainTerms(pw) .item("correlation", correlationId) .item("joinType", joinType.lowerName) - .item("requiredColumns", requiredColumns.toString()); + .item("requiredColumns", requiredColumns); } /** diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalCorrelate.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalCorrelate.java index 137ca780651..1d67d6dfd19 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalCorrelate.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalCorrelate.java @@ -80,7 +80,7 @@ public LogicalCorrelate( public LogicalCorrelate(RelInput input) { this(input.getCluster(), input.getTraitSet(), input.getInputs().get(0), input.getInputs().get(1), - new CorrelationId((Integer) input.get("correlationId")), + new CorrelationId((Integer) input.get("correlation")), input.getBitSet("requiredColumns"), input.getEnum("joinType", JoinRelType.class)); } diff --git a/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java b/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java index 6ee9d97a677..701a136ff0d 100644 --- a/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java +++ b/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java @@ -21,6 +21,7 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.RelShuttleImpl; import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.core.TableScan; import org.apache.calcite.rel.externalize.RelJsonReader; import org.apache.calcite.rel.externalize.RelJsonWriter; @@ -32,6 +33,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexCorrelVariable; import org.apache.calcite.rex.RexFieldCollation; import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexProgramBuilder; @@ -536,19 +538,7 @@ public class RelWriterTest { rel.explain(jsonWriter); String relJson = jsonWriter.asString(); final RelOptSchema schema = getSchema(rel); - final String s = - Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { - final RelJsonReader reader = - new RelJsonReader(cluster, schema, rootSchema); - RelNode node; - try { - node = reader.read(relJson); - } catch (IOException e) { - throw TestUtil.rethrow(e); - } - return RelOptUtil.dumpPlan("", node, SqlExplainFormat.TEXT, - SqlExplainLevel.EXPPLAN_ATTRIBUTES); - }); + final String s = deserializeAndDumpToTextFormat(schema, relJson); final String expected = "" + "LogicalProject(trimmed_ename=[TRIM(FLAG(BOTH), ' ', $1)])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; @@ -568,19 +558,7 @@ public class RelWriterTest { RelJsonWriter jsonWriter = new RelJsonWriter(); rel.explain(jsonWriter); String relJson = jsonWriter.asString(); - String s = - Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { - final RelJsonReader reader = new RelJsonReader( - cluster, getSchema(rel), rootSchema); - RelNode node; - try { - node = reader.read(relJson); - } catch (IOException e) { - throw TestUtil.rethrow(e); - } - return RelOptUtil.dumpPlan("", node, SqlExplainFormat.TEXT, - SqlExplainLevel.EXPPLAN_ATTRIBUTES); - }); + String s = deserializeAndDumpToTextFormat(getSchema(rel), relJson); final String expected = "" + "LogicalProject($f0=[+($5, 10)])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; @@ -605,19 +583,7 @@ public class RelWriterTest { final RelJsonWriter jsonWriter = new RelJsonWriter(); rel.explain(jsonWriter); final String relJson = jsonWriter.asString(); - String s = - Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { - final RelJsonReader reader = new RelJsonReader( - cluster, getSchema(rel), rootSchema); - RelNode node; - try { - node = reader.read(relJson); - } catch (IOException e) { - throw TestUtil.rethrow(e); - } - return RelOptUtil.dumpPlan("", node, SqlExplainFormat.TEXT, - SqlExplainLevel.EXPPLAN_ATTRIBUTES); - }); + String s = deserializeAndDumpToTextFormat(getSchema(rel), relJson); final String expected = "" + "LogicalProject(max_sal=[$1])\n" + " LogicalAggregate(group=[{0}], max_sal=[MAX($1)])\n" @@ -645,19 +611,7 @@ public class RelWriterTest { final RelJsonWriter jsonWriter = new RelJsonWriter(); rel.explain(jsonWriter); final String relJson = jsonWriter.asString(); - String s = - Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { - final RelJsonReader reader = new RelJsonReader( - cluster, getSchema(rel), rootSchema); - RelNode node; - try { - node = reader.read(relJson); - } catch (IOException e) { - throw TestUtil.rethrow(e); - } - return RelOptUtil.dumpPlan("", node, SqlExplainFormat.TEXT, - SqlExplainLevel.EXPPLAN_ATTRIBUTES); - }); + String s = deserializeAndDumpToTextFormat(getSchema(rel), relJson); final String expected = "" + "LogicalProject($f1=[$1])\n" + " LogicalAggregate(group=[{0}], agg#0=[MAX($1)])\n" @@ -706,6 +660,32 @@ public class RelWriterTest { assertThat(s, isLinux(expected)); } + @Test public void testCorrelateQuery() { + final FrameworkConfig config = RelBuilderTest.config().build(); + final RelBuilder builder = RelBuilder.create(config); + final Holder v = Holder.of(null); + RelNode relNode = builder.scan("EMP") + .variable(v) + .scan("DEPT") + .filter( + builder.equals(builder.field(0), builder.field(v.get(), "DEPTNO"))) + .correlate( + JoinRelType.INNER, v.get().id, builder.field(2, 0, "DEPTNO")) + .build(); + RelJsonWriter jsonWriter = new RelJsonWriter(); + relNode.explain(jsonWriter); + final String relJson = jsonWriter.asString(); + String s = deserializeAndDumpToTextFormat(getSchema(relNode), relJson); + final String expected = "" + + "LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{7}])\n" + + " LogicalTableScan(table=[[scott, EMP]])\n" + + " LogicalFilter(condition=[=($0, $cor0.DEPTNO)])\n" + + " LogicalTableScan(table=[[scott, DEPT]])\n"; + + assertThat(s, isLinux(expected) + ); + } + /** Returns the schema of a {@link org.apache.calcite.rel.core.TableScan} * in this plan, or null if there are no scans. */ private RelOptSchema getSchema(RelNode rel) { @@ -719,6 +699,27 @@ private RelOptSchema getSchema(RelNode rel) { }); return schemaHolder.get(); } + + /** + * Deserialize a relnode from the json string by {@link RelJsonReader}, + * and dump it to text format. + */ + private String deserializeAndDumpToTextFormat(RelOptSchema schema, String relJson) { + String s = + Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { + final RelJsonReader reader = new RelJsonReader( + cluster, schema, rootSchema); + RelNode node; + try { + node = reader.read(relJson); + } catch (IOException e) { + throw TestUtil.rethrow(e); + } + return RelOptUtil.dumpPlan("", node, SqlExplainFormat.TEXT, + SqlExplainLevel.EXPPLAN_ATTRIBUTES); + }); + return s; + } } // End RelWriterTest.java