Hey all,
I'm trying to use VolcanoPlanner. I have encountered the following
problems. I hope I can ask for some help. Thank you very much!
Test code:
`````
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_TABLE_SCAN_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_PROJECT_RULE);
planner.addRule(CoreRules.PROJECT_TABLE_SCAN);
RelOptCluster cluster = newCluster(planner);
// NOTE:I mock x MyRelOptSchema to ensure that the SQL verification is
successful.
MyRelOptSchema relOptSchema = new MyRelOptSchema();
RelBuilder relBuilder = RelFactories.LOGICAL_BUILDER.create(cluster,
relOptSchema);
RelNode logicalPlan = relBuilder
.scan("t1")
.project(relBuilder.field("attr1"))
.build();
RelTraitSet desiredTraits =
cluster.traitSet().replace(EnumerableConvention.INSTANCE);
final RelNode newRoot = planner.changeTraits(logicalPlan,
desiredTraits);
planner.setRoot(newRoot);
RelNode bestExp = planner.findBestExp();
System.out.println("Plan is: " + RelOptUtil.toString(bestExp));
```
The exception is:
```
org.apache.calcite.plan.RelOptPlanner$CannotPlanException: There are not enough
rules to produce a node with desired properties: convention=ENUMERABLE, sort=[].
Missing conversion is LogicalTableScan[convention: NONE -> ENUMERABLE]
There is 1 empty subset: rel#7:RelSubset#0.ENUMERABLE.[], the relevant part of
the original plan is as follows
0:LogicalTableScan(table=[[t1]])
Root: rel#5:RelSubset#1.ENUMERABLE.[]
Original rel:
LogicalProject(subset=[rel#5:RelSubset#1.ENUMERABLE.[]], attr1=[$0]): rowcount
= 1.0, cumulative cost = {1.0 rows, 1.0 cpu, 0.0 io}, id = 3
LogicalTableScan(subset=[rel#2:RelSubset#0.NONE.[]], table=[[t1]]): rowcount
= 1.0, cumulative cost = {0.0 rows, 1.0 cpu, 0.0 io}, id = 0
Sets:
Set#0, type: com.dipeak.disql.query.SimpleSqlTest$MyRelOptSchema$1@67f77f6e
rel#2:RelSubset#0.NONE.[], best=null
rel#0:LogicalTableScan.NONE.[](table=[t1]), rowcount=1.0, cumulative cost={inf}
rel#7:RelSubset#0.ENUMERABLE.[], best=null
Set#1, type: RecordType(INTEGER attr1)
rel#4:RelSubset#1.NONE.[], best=null
rel#3:LogicalProject.NONE.[](input=RelSubset#2,inputs=0), rowcount=1.0,
cumulative cost={inf}
rel#5:RelSubset#1.ENUMERABLE.[], best=null
rel#6:AbstractConverter.ENUMERABLE.[](input=RelSubset#4,convention=ENUMERABLE,sort=[]),
rowcount=1.0, cumulative cost={inf}
rel#8:EnumerableProject.ENUMERABLE.[](input=RelSubset#7,inputs=0),
rowcount=1.0, cumulative cost={inf}
Graphviz:
digraph G {
root [style=filled,label="Root"];
subgraph cluster0{
label="Set 0 com.dipeak.disql.query.SimpleSqlTest$MyRelOptSchema$1@67f77f6e";
rel0 [label="rel#0:LogicalTableScan\ntable=[t1]\nrows=1.0,
cost={inf}",shape=box]
subset2 [label="rel#2:RelSubset#0.NONE.[]"]
subset7 [label="rel#7:RelSubset#0.ENUMERABLE.[]",color=red]
}
subgraph cluster1{
label="Set 1 RecordType(INTEGER attr1)";
rel3 [label="rel#3:LogicalProject\ninput=RelSubset#2,inputs=0\nrows=1.0,
cost={inf}",shape=box]
rel6
[label="rel#6:AbstractConverter\ninput=RelSubset#4,convention=ENUMERABLE,sort=[]\nrows=1.0,
cost={inf}",shape=box]
rel8 [label="rel#8:EnumerableProject\ninput=RelSubset#7,inputs=0\nrows=1.0,
cost={inf}",shape=box]
subset4 [label="rel#4:RelSubset#1.NONE.[]"]
subset5 [label="rel#5:RelSubset#1.ENUMERABLE.[]"]
}
root -> subset5;
subset2 -> rel0;
subset4 -> rel3; rel3 -> subset2;
subset5 -> rel6; rel6 -> subset4;
subset5 -> rel8; rel8 -> subset7;
}
at
org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:709)
at
org.apache.calcite.plan.volcano.RelSubset.buildCheapestPlan(RelSubset.java:390)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:533)
```