No need to apologize! We really appreciate you following up and saying you 
found a solution. Your solution may help someone else.

Julian


> On Oct 2, 2019, at 9:34 AM, Madhav Suresh <mad...@u.northwestern.edu> wrote:
> 
> I apologize for the immediate follow up, however, I found out my issue was
> not adding the EnumerableRules.ENUMERABLE_JOIN_RULE.
> 
> On Wed, Oct 2, 2019 at 10:50 AM Madhav Suresh <mad...@u.northwestern.edu>
> wrote:
> 
>> 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
>> 

Reply via email to