You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Julian Hyde (JIRA)" <ji...@apache.org> on 2017/05/05 19:36:04 UTC
[jira] [Created] (CALCITE-1774) Allow rules to be registered during
planning process
Julian Hyde created CALCITE-1774:
------------------------------------
Summary: Allow rules to be registered during planning process
Key: CALCITE-1774
URL: https://issues.apache.org/jira/browse/CALCITE-1774
Project: Calcite
Issue Type: Bug
Reporter: Julian Hyde
Assignee: Julian Hyde
Allow rules to be registered during planning process.
At present, if you create a query via SQL, {{SqlToRelConverter}} calls [Table.toRel|https://calcite.apache.org/apidocs/org/apache/calcite/plan/RelOptTable.html#toRel-org.apache.calcite.plan.RelOptTable.ToRelContext-] on each {{TableScan}}. But if you create an equivalent query using {{RelBuilder}} those tables remain {{LogicalTableScan}}, and only get converted into physical tables when {{TableScanRule}} is called during planning.
Why is that a problem? Because physical tables, such as {{DruidQuery}}, register the rules they need when their override of [RelNode.onRegister|https://calcite.apache.org/apidocs/org/apache/calcite/rel/RelNode.html#onRegister-org.apache.calcite.plan.RelOptPlanner-] is called. But if planning has already started, registering those rules will not cause matches to be added to the queue.
For CALCITE-1769 I've added a hacky workaround to [Prepare.optimize], viz:
{code}
new RelVisitor() {
@Override public void visit(RelNode node, int ordinal, RelNode parent) {
if (node instanceof TableScan) {
final RelOptCluster cluster = node.getCluster();
final RelOptTable.ToRelContext context = RelOptUtil.getContext(cluster);
final RelNode r = node.getTable().toRel(context);
planner.registerClass(r);
}
super.visit(node, ordinal, parent);
}
}.go(root.rel);
{code}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)