Julian>It really bugs me that it takes a couple of hours of careful reading
of the log to figure out that for your new Foo Convention you have a
FooProjectRule

I guess this case can be improved by searching the leaf empty subsets.

I've filed https://github.com/apache/calcite/pull/1024 which does that.
For missing EnumerableAggregateRule it produces the following message.

I think it is more-or-less human-readable, and it does point to
LogicalAggregate nodes.

I'm going to commit it unless there are better alternatives.

Node
rel#169:Subset#10.ENUMERABLE.[] is not implementable. It means there's not
enough rules to produce the node with desired properties
There are 4 empty subsets:
Leaf 0: rel#259:Subset#4.ENUMERABLE.[]
145:LogicalAggregate(group=[{0}])
  139:LogicalProject(subset=[rel#140:Subset#1.NONE.[]], deptno=[$1])
    82:EnumerableTableScan(subset=[rel#138:Subset#0.ENUMERABLE.[]],
table=[[hr, emps]])

Leaf 1: rel#256:Subset#1.ENUMERABLE.[0]
139:LogicalProject(deptno=[$1])
  82:EnumerableTableScan(subset=[rel#138:Subset#0.ENUMERABLE.[]],
table=[[hr, emps]])

Leaf 2: rel#255:Subset#8.ENUMERABLE.[0]
153:LogicalAggregate(group=[{0}])
  151:LogicalProject(subset=[rel#152:Subset#7.NONE.[]], deptno0=[$1])
    149:LogicalFilter(subset=[rel#150:Subset#6.NONE.[]], condition=[<=($0,
$1)])
      147:LogicalJoin(subset=[rel#148:Subset#5.NONE.[]], condition=[>=($0,
$1)], joinType=[inner])
        142:LogicalProject(subset=[rel#143:Subset#3.NONE.[]], deptno=[$0])
          84:EnumerableTableScan(subset=[rel#141:Subset#2.ENUMERABLE.[]],
table=[[hr, depts]])
        145:LogicalAggregate(subset=[rel#146:Subset#4.NONE.[]], group=[{0}])
          139:LogicalProject(subset=[rel#140:Subset#1.NONE.[]], deptno=[$1])
            82:EnumerableTableScan(subset=[rel#138:Subset#0.ENUMERABLE.[]],
table=[[hr, emps]])

Leaf 3: rel#273:Subset#8.ENUMERABLE.[]
153:LogicalAggregate(group=[{0}])
  151:LogicalProject(subset=[rel#152:Subset#7.NONE.[]], deptno0=[$1])
    149:LogicalFilter(subset=[rel#150:Subset#6.NONE.[]], condition=[<=($0,
$1)])
      147:LogicalJoin(subset=[rel#148:Subset#5.NONE.[]], condition=[>=($0,
$1)], joinType=[inner])
        142:LogicalProject(subset=[rel#143:Subset#3.NONE.[]], deptno=[$0])
          84:EnumerableTableScan(subset=[rel#141:Subset#2.ENUMERABLE.[]],
table=[[hr, depts]])
        145:LogicalAggregate(subset=[rel#146:Subset#4.NONE.[]], group=[{0}])
          139:LogicalProject(subset=[rel#140:Subset#1.NONE.[]], deptno=[$1])
            82:EnumerableTableScan(subset=[rel#138:Subset#0.ENUMERABLE.[]],
table=[[hr, emps]])

Root: rel#169:Subset#10.ENUMERABLE.[]
Original rel:
LogicalProject(deptno=[$0]): rowcount = 375.0, cumulative cost = {2385.0
rows, 1728.0 cpu, 0.0 io}, id = 137
  LogicalJoin(condition=[=($0, $1)], joinType=[inner]): rowcount = 375.0,
cumulative cost = {2010.0 rows, 1353.0 cpu, 0.0 io}, id = 136
    LogicalProject(deptno=[$1]): rowcount = 100.0, cumulative cost = {200.0
rows, 201.0 cpu, 0.0 io}, id = 127
      EnumerableTableScan(table=[[hr, emps]]): rowcount = 100.0, cumulative
cost = {100.0 rows, 101.0 cpu, 0.0 io}, id = 82
    LogicalAggregate(group=[{0}]): rowcount = 25.0, cumulative cost =
{1435.0 rows, 1152.0 cpu, 0.0 io}, id = 135
      LogicalProject(deptno0=[$1]): rowcount = 250.0, cumulative cost =
{1410.0 rows, 1152.0 cpu, 0.0 io}, id = 134
        LogicalFilter(condition=[<=($0, $1)]): rowcount = 250.0, cumulative
cost = {1160.0 rows, 902.0 cpu, 0.0 io}, id = 133
          LogicalJoin(condition=[>=($0, $1)], joinType=[inner]): rowcount =
500.0, cumulative cost = {910.0 rows, 402.0 cpu, 0.0 io}, id = 132
            LogicalProject(deptno=[$0]): rowcount = 100.0, cumulative cost
= {200.0 rows, 201.0 cpu, 0.0 io}, id = 128
              EnumerableTableScan(table=[[hr, depts]]): rowcount = 100.0,
cumulative cost = {100.0 rows, 101.0 cpu, 0.0 io}, id = 84
            LogicalAggregate(group=[{0}]): rowcount = 10.0, cumulative cost
= {210.0 rows, 201.0 cpu, 0.0 io}, id = 131
              LogicalProject(deptno=[$1]): rowcount = 100.0, cumulative
cost = {200.0 rows, 201.0 cpu, 0.0 io}, id = 130
                EnumerableTableScan(table=[[hr, emps]]): rowcount = 100.0,
cumulative cost = {100.0 rows, 101.0 cpu, 0.0 io}, id = 82

Sets:
Set#0, type: RecordType(JavaType(int) empid, JavaType(int) deptno,
JavaType(class java.lang.String) name, JavaType(float) salary,
JavaType(class java.lang.Integer) commission)
rel#138:Subset#0.ENUMERABLE.[], best=rel#82, importance=0.6561
rel#82:EnumerableTableSc...

Vladimir

Reply via email to