Skip to content

Commit

Permalink
[CALCITE-3316] Exception while deserializing LogicalCorrelate from js…
Browse files Browse the repository at this point in the history
…on string (Wang Yanlin)
yanlin-Lynn authored and hsyuan committed Sep 12, 2019
1 parent 43b6abc commit 507d383
Showing 3 changed files with 56 additions and 55 deletions.
4 changes: 2 additions & 2 deletions core/src/main/java/org/apache/calcite/rel/core/Correlate.java
Original file line number Diff line number Diff line change
@@ -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);
}

/**
Original file line number Diff line number Diff line change
@@ -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));
}
105 changes: 53 additions & 52 deletions core/src/test/java/org/apache/calcite/plan/RelWriterTest.java
Original file line number Diff line number Diff line change
@@ -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<RexCorrelVariable> 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

0 comments on commit 507d383

Please sign in to comment.