osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problem while changing conventions with rules


Hi Alessandro,

>From a quick look, I cannot see what is going wrong with the planner. A few
suggestions:
i) when you send the planner dump it is better to keep
the indentation otherwise it is difficult to read;
ii) you can debug more easily the planner by increasing the logger level
(e.g., log4j.logger.org.apache.calcite.plan.RelOptPlanner=TRACE);
iii) the trace output is also more complete than the one you provided in
order to understand exactly what is happening.

Best,
Stamatis



Στις Πέμ, 11 Οκτ 2018 στις 5:33 μ.μ., ο/η Karapost <
karapost@xxxxxxxxxxxxxxxx> έγραψε:

> Hi all,
>
> I created a new convention called LocationConvention which encapsulates
> a JdbcConvention. I implemented a LocationTableScanConverterRule which
> matches a JdbcTableScaneRel and should (in theory) return a
> LocationTableScanRel which is just a dummy implementation of a
> TableScan. I also created a ProjectRel and ProjectRule which match a
> LogicalProject with convention None.
>
> I am sure that the rule is fired by the planner but from the error I get
> it seems that it doesn't actually produce any result.
> I call the planner with:
>
> LocationConvention lc;
> RelTraitSet rts = planner.getEmptyTraitSet().replace(lc);
> optimized = planner.transform(0,rts,logicalPlan);
>
> I get the following error:
>
> Exception in thread "main"
> org.apache.calcite.plan.RelOptPlanner$CannotPlanException: Node
> [rel#7:Subset#1.LocationConvention:JDBC.tpch_africa] could not be
> implemented; planner state:
>
> Root: rel#7:Subset#1.LocationConvention:JDBC.tpch_africa
> Original rel:
> LogicalProject(subset=[rel#7:Subset#1.LocationConvention:JDBC.tpch_africa],
>
> L_ORDERKEY=[$0]): rowcount = 100.0, cumulative cost = {100.0 rows, 100.0
> cpu, 0.0 io}, id = 5
>    JdbcTableScan(subset=[rel#4:Subset#0.JDBC.tpch_africa],
> table=[[tpch_africa, lineitem]]): rowcount = 100.0, cumulative cost =
> {100.0 rows, 101.0 cpu, 0.0 io}, id = 2
>
> Sets:
> Set#0, type: RecordType(INTEGER l_orderkey, INTEGER l_partkey, INTEGER
> l_suppkey, INTEGER l_linenumber, DECIMAL(15, 2) l_quantity, DECIMAL(15,
> 2) l_extendedprice, DECIMAL(15, 2) l_discount, DECIMAL(15, 2) l_tax,
> CHAR(1) l_returnflag, CHAR(1) l_linestatus, DATE l_shipdate, DATE
> l_commitdate, DATE l_receiptdate, CHAR(25) l_shipinstruct, CHAR(10)
> l_shipmode, VARCHAR(44) l_comment)
>      rel#4:Subset#0.JDBC.tpch_africa, best=rel#2,
> importance=0.49499999999999994
>          rel#2:JdbcTableScan.JDBC.tpch_africa(table=[tpch_africa,
> lineitem]), rowcount=100.0, cumulative cost={100.0 rows, 101.0 cpu, 0.0 io}
> rel#12:AbstractConverter.JDBC.tpch_africa(input=rel#11:Subset#0.LocationConvention:JDBC.tpch_africa,convention=JDBC.tpch_africa),
>
> rowcount=100.0, cumulative cost={inf}
>      rel#11:Subset#0.LocationConvention:JDBC.tpch_africa, best=null,
> importance=0.9899999999999999
>      rel#31:Subset#0.ENUMERABLE, best=rel#30,
> importance=0.49499999999999994
> rel#32:AbstractConverter.ENUMERABLE(input=rel#11:Subset#0.LocationConvention:JDBC.tpch_africa,convention=ENUMERABLE),
>
> rowcount=100.0, cumulative cost={inf}
> rel#30:JdbcToEnumerableConverter.ENUMERABLE(input=rel#4:Subset#0.JDBC.tpch_africa),
>
> rowcount=100.0, cumulative cost={110.0 rows, 111.0 cpu, 0.0 io}
> Set#1, type: RecordType(INTEGER L_ORDERKEY)
>      rel#6:Subset#1.NONE, best=null, importance=0.49999999999999994
> rel#5:LogicalProject.NONE(input=rel#4:Subset#0.JDBC.tpch_africa,L_ORDERKEY=$0),
>
> rowcount=100.0, cumulative cost={inf}
> rel#8:AbstractConverter.NONE(input=rel#7:Subset#1.LocationConvention:JDBC.tpch_africa,convention=NONE),
>
> rowcount=100.0, cumulative cost={inf}
>      rel#7:Subset#1.LocationConvention:JDBC.tpch_africa, best=null,
> importance=0.9999999999999999
>      rel#15:Subset#1.JDBC.tpch_africa, best=rel#14,
> importance=0.49999999999999994
> rel#16:AbstractConverter.JDBC.tpch_africa(input=rel#7:Subset#1.LocationConvention:JDBC.tpch_africa,convention=JDBC.tpch_africa),
>
> rowcount=100.0, cumulative cost={inf}
> rel#14:JdbcProject.JDBC.tpch_africa(input=rel#4:Subset#0.JDBC.tpch_africa,L_ORDERKEY=$0),
>
> rowcount=100.0, cumulative cost={180.0 rows, 181.0 cpu, 0.0 io}
>      rel#24:Subset#1.ENUMERABLE, best=rel#23,
> importance=0.49999999999999994
> rel#25:AbstractConverter.ENUMERABLE(input=rel#7:Subset#1.LocationConvention:JDBC.tpch_africa,convention=ENUMERABLE),
>
> rowcount=100.0, cumulative cost={inf}
> rel#23:JdbcToEnumerableConverter.ENUMERABLE(input=rel#15:Subset#1.JDBC.tpch_africa),
>
> rowcount=100.0, cumulative cost={190.0 rows, 191.0 cpu, 0.0 io}
>
>
> My code is:
>
> public class LocationTableScanRel extends TableScan implements LocationRel
> {
>
>    public LocationTableScanRel(final RelOptCluster cluster,
>        final RelTraitSet traitSet,
>        final RelOptTable table) {
>      super(cluster, traitSet, table);
>    }
>
>    @Override public RelNode copy(final RelTraitSet traitSet, final
> List<RelNode> inputs) {
>      return new LocationTableScanRel(getCluster(),traitSet,table);
>    }
>
> }
>
>
> public class LocationTableScanRule extends ConverterRule {
>
>    private LocationConvention lc;
>    public LocationTableScanRule(LocationConvention lc){
>      super(JdbcTableScan.class,lc.getJdbcConvention(),
> lc,"LocationTableScanRule:" + lc);
>    }
>    @Override public RelNode convert( RelNode rel) {
>      final JdbcTableScan tscan = (JdbcTableScan) rel;
>      System.out.println("Fire!");
>      return new LocationTableScanRel(tscan.getCluster(),
> tscan.getCluster().traitSetOf(getOutTrait()),tscan.getTable());
>    }
> }
>
> Any help and advice are very welcome
>
> Best
>
> Alessandro
>
>
>