Hi All, I'm trying to run the volcano optimizer on a simple join query with the TPC-H schema. I'm a little unclear on how to solve this, I thought I needed to add a converter rules from JDBC->Enumerable, but it seems like those rules are included at runtime. I then tried adding a None->Bindable rule, but that also didn't fix the issue. I get the error below, code included below error:
org.apache.calcite.plan.RelOptPlanner$CannotPlanException: There are not > enough rules to produce a node with desired properties: > convention=ENUMERABLE. > Missing conversions are LogicalJoin[convention: NONE -> JDBC.name], > LogicalJoin[convention: NONE -> ENUMERABLE] > There are 2 empty subsets: > Empty subset 0: rel#51:Subset#4.ENUMERABLE, the relevant part of the > original plan is as follows > 14:LogicalJoin(condition=[true], joinType=[inner]) > 11:LogicalJoin(subset=[rel#12:Subset#2.NONE], condition=[true], > joinType=[inner]) > 0:JdbcTableScan(subset=[rel#9:Subset#0.JDBC.name], table=[[customer]]) > 1:JdbcTableScan(subset=[rel#10:Subset#1.JDBC.name], table=[[orders]]) > 4:JdbcTableScan(subset=[rel#13:Subset#3.JDBC.name], table=[[lineitem]]) > > Empty subset 1: rel#49:Subset#4.JDBC.name, the relevant part of the > original plan is as follows > 14:LogicalJoin(condition=[true], joinType=[inner]) > 11:LogicalJoin(subset=[rel#12:Subset#2.NONE], condition=[true], > joinType=[inner]) > 0:JdbcTableScan(subset=[rel#9:Subset#0.JDBC.name], table=[[customer]]) > 1:JdbcTableScan(subset=[rel#10:Subset#1.JDBC.name], table=[[orders]]) > 4:JdbcTableScan(subset=[rel#13:Subset#3.JDBC.name], table=[[lineitem]]) > The test case I'm running is here ( https://gist.github.com/madhavsuresh/e95631776eceb47ab8eeb608268531ce): > @Test > public void testSimpleJoin() throws SqlParseException, > ValidationException { > String sql = > "select\n" > + " l.l_orderkey\n" > + "from\n" > + " customer c,\n" > + " orders o,\n" > + " lineitem l\n" > + "\n" > + "where\n" > + " c.c_mktsegment = 'HOUSEHOLD'\n" > + " and c.c_custkey = o.o_custkey\n"; > optimizer = new VolcanoPlanner(); > optimizer.addRelTraitDef(ConventionTraitDef.INSTANCE); > optimizer.addRule(new OptToyRules.OptToyTestFilter()); > // add rules > optimizer.addRule(FilterJoinRule.FilterIntoJoinRule.FILTER_ON_JOIN); > optimizer.addRule(ReduceExpressionsRule.PROJECT_INSTANCE); > optimizer.addRule(PruneEmptyRules.PROJECT_INSTANCE); > > // add ConverterRule > optimizer.addRule(EnumerableRules.ENUMERABLE_MERGE_JOIN_RULE); > optimizer.addRule(EnumerableRules.ENUMERABLE_SORT_RULE); > optimizer.addRule(EnumerableRules.ENUMERABLE_VALUES_RULE); > optimizer.addRule(EnumerableRules.ENUMERABLE_PROJECT_RULE); > optimizer.addRule(EnumerableRules.ENUMERABLE_FILTER_RULE); > optimizer.addRule(NoneToBindableConverterRule.INSTANCE); > SqlNode node = planner.parse(sql); > node = planner.validate(node); > SqlToRelConverter converter = createSqlToRelConverter(); > RelRoot n = converter.convertQuery(node, true, true); > RelNode relNode = n.rel; > > // TODO(madhavsuresh): only works with needsValidation set to true. > RelTraitSet desiredTraits = > > relNode.getCluster().traitSet().replace(EnumerableConvention.INSTANCE); > relNode = optimizer.changeTraits(relNode, desiredTraits); > optimizer.setRoot(relNode); > optimizer.findBestExp(); > > Thanks for the help! Madhav
