I think what’s happening is this. The root is logical, so you’re asking it to produce a logical plan. Logical plans have infinite cost. So they can’t be implemented.
> On Apr 30, 2017, at 2:52 PM, Γιώργος Θεοδωράκης <[email protected]> > wrote: > > Hello, > > I have written a very simple rule for pushing a filter through filter, > which worked perfectly when I applied it with Volcano on the regular > implementation of operators. Here is the code of my rule: > > ... > public void onMatch(RelOptRuleCall call) { > ... > final LogicalFilter newFilter = > LogicalFilter.create(secFilter.getInput(), filter.getCondition()); > final LogicalFilter newSecFilter = LogicalFilter.create(newFilter, > secFilter.getCondition()); > call.transformTo(newSecFilter); > } > > In order to introduce a new cost model, I have created my custom operators. > However, I see the following error when trying to use this specific rule in > Volcano: > > My query is: > select * from ( > select * from s.orders > where s.orders.units > 10) as s1 > where s1.productid = 15 or s1.productid = 17; > > Exception in thread "main" > org.apache.calcite.plan.RelOptPlanner$CannotPlanException: Node > [rel#36:Subset#1.LOGICAL.[0]] could not be implemented; planner state: > > Root: rel#33:Subset#2.LOGICAL.[] > Original rel: > > Sets: > Set#0, type: RecordType(TIMESTAMP(0) rowtime, INTEGER orderid, INTEGER > productid, INTEGER units, INTEGER customerid) > rel#28:Subset#0.NONE.[0], best=rel#5, importance=0.405 > rel#5:LogicalTableScan.NONE.[[0]](table=[s, orders]), rowcount=500.0, > cumulative cost={inf} > rel#35:Subset#0.LOGICAL.[0], best=rel#34, importance=0.81 > rel#34:SaberTableScanRel.LOGICAL.[[0]](table=[s, orders]), rowcount=500.0, > cumulative cost={500.0 rows, 0.0 cpu, 0.0 io, 500.0 rate, 0.0 memory, 1.0 > window, 0.0 R} > Set#1, type: RecordType(TIMESTAMP(0) rowtime, INTEGER orderid, INTEGER > productid, INTEGER units, INTEGER customerid) > rel#30:Subset#1.NONE.[0], best=rel#47, importance=0.45 > rel#29:LogicalFilter.NONE.[[0]](input=rel#28:Subset#0.NONE.[0],condition=>($3, > 10)), rowcount=250.0, cumulative cost={inf} > rel#47:LogicalFilter.NONE.[[0]](input=rel#35:Subset#0.LOGICAL.[0],condition=>($3, > 10)), rowcount=250.0, cumulative cost={inf} > rel#36:Subset#1.LOGICAL.[0], best=null, importance=0.9 > rel#39:SaberFilterRel.LOGICAL.[[0]](input=rel#35:Subset#0.LOGICAL.[0],condition=>($3, > 10)), rowcount=250.0, cumulative cost={501.0 rows, 1.0 cpu, 0.0 io, 0.0 > rate, 0.0 memory, 0.0 window, 0.0 R} > Set#2, type: RecordType(TIMESTAMP(0) rowtime, INTEGER orderid, INTEGER > productid, INTEGER units, INTEGER customerid) > rel#32:Subset#2.NONE.[0], best=rel#31, importance=0.0 > rel#31:LogicalFilter.NONE.[[0]](input=rel#30:Subset#1.NONE.[0],condition=OR(=($2, > 15), =($2, 17))), rowcount=62.5, cumulative cost={inf} > rel#43:LogicalFilter.NONE.[[0]](input=rel#42:Subset#3.NONE.[0],condition=>($3, > 10)), rowcount=62.5, cumulative cost={inf} > rel#33:Subset#2.LOGICAL.[], best=rel#37, importance=0.0 > rel#37:SaberFilterRel.LOGICAL.[[0]](input=rel#36:Subset#1.LOGICAL.[0],condition=OR(=($2, > 15), =($2, 17))), rowcount=62.5, cumulative cost={inf} > rel#45:SaberFilterRel.LOGICAL.[[0]](input=rel#44:Subset#3.LOGICAL.[0],condition=>($3, > 10)), rowcount=62.5, cumulative cost={502.0 rows, 2.0 cpu, 0.0 io, 0.0 > rate, 0.0 memory, 0.0 window, 0.0 R} > rel#38:Subset#2.LOGICAL.[0], best=rel#37, importance=0.0 > rel#37:SaberFilterRel.LOGICAL.[[0]](input=rel#36:Subset#1.LOGICAL.[0],condition=OR(=($2, > 15), =($2, 17))), rowcount=62.5, cumulative cost={inf} > rel#45:SaberFilterRel.LOGICAL.[[0]](input=rel#44:Subset#3.LOGICAL.[0],condition=>($3, > 10)), rowcount=62.5, cumulative cost={502.0 rows, 2.0 cpu, 0.0 io, 0.0 > rate, 0.0 memory, 0.0 window, 0.0 R} > Set#3, type: RecordType(TIMESTAMP(0) rowtime, INTEGER orderid, INTEGER > productid, INTEGER units, INTEGER customerid) > rel#42:Subset#3.NONE.[0], best=rel#40, importance=0.45 > rel#40:LogicalFilter.NONE.[[0]](input=rel#35:Subset#0.LOGICAL.[0],condition=OR(=($2, > 15), =($2, 17))), rowcount=125.0, cumulative cost={inf} > rel#44:Subset#3.LOGICAL.[0], best=rel#46, importance=0.9 > rel#46:SaberFilterRel.LOGICAL.[[0]](input=rel#35:Subset#0.LOGICAL.[0],condition=OR(=($2, > 15), =($2, 17))), rowcount=125.0, cumulative cost={501.0 rows, 1.0 cpu, 0.0 > io, 0.0 rate, 0.0 memory, 0.0 window, 0.0 R} > > > at > org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:443) > at > org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:465) > at > org.apache.calcite.plan.volcano.RelSubset.buildCheapestPlan(RelSubset.java:293) > at > org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:666) > at org.apache.calcite.tools.Programs$RuleSetProgram.run(Programs.java:368) > at org.apache.calcite.prepare.PlannerImpl.transform(PlannerImpl.java:313) > at calcite.planner.SaberPlanner.getLogicalPlan(SaberPlanner.java:257) > at calcite.Tester.main(Tester.java:241) > > > Any hints on what am I doing wrong? > > Thank you in advance, > George
