Thank you. My rule was creating logical Filters in the last two lines instead of my custom ones and failed.
2017-05-01 22:32 GMT+03:00 Julian Hyde <jh...@apache.org>: > 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, Γιώργος Θεοδωράκης <giwrgosrth...@gmail.com> > 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 > >