Aitozi created CALCITE-5595: ------------------------------- Summary: Support transformParentTo in RelOptRuleCall Key: CALCITE-5595 URL: https://issues.apache.org/jira/browse/CALCITE-5595 Project: Calcite Issue Type: New Feature Components: core Reporter: Aitozi
RelOptRuleCall only supports to produce an equivalent relNode of the current root node. But when writing the rule to deal with the Common subExprs. It also have to change the current root's parent node. For example: Union / \ Project(b,c) Project(b,d) \ / Spool | Scan(a,b,c,d) Then, with Rule to match on the {{Spool}} , I want to push the unified project (b, c, d in this case) down to the {{Spool}} node. The parent's of the {{Spool}} node have to adjust the project inputRef according to the new produce type of the new Spool. To solve this, one way is to use a {{RexShuttle}} to update the inputRef of the parents. But it still have to handle the type assertion of {{RelOptUtil.verifyTypeEquivalence}} during {{HepRuleCall#transformTo}} . Another way is provide a new interface like {code:java} transformParentTo(RelNode parent, int idx) {code} So, in the rule, we can create a new parent to transform the old idx parent node to the new one. I lean to the second way, it looks more flexible and can be integrated to the current optimization flow, I have implemented it in our internal version. Looking forward to the community's suggestion. Thanks -- This message was sent by Atlassian Jira (v8.20.10#820010)