[ https://issues.apache.org/jira/browse/CALCITE-3896?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17077812#comment-17077812 ]
Jinpeng Wu commented on CALCITE-3896: ------------------------------------- Hi, [~hyuan] . Looks like some useful change. Are you intending to use this to replace AC? I think we need to consider several cases before this: 1. How can the planner know that passing request [a] to MergeJoin[a,b] will generate exactly the same MergeJoin[a] in order to avoid redundancy. Enforcing needs only generate an output that satisfies [a], not exactly [a]. Or it could be another MergeJoin[a] with different inputs, thus different cost. 2. What if the implementation rule generating MergeJoin[a] comes after passThrough [a] to MergeJoin[a,b] 3. The method passThough could generate more than multiple candidates or none candidates > Pass through parent trait requests to child operators > ----------------------------------------------------- > > Key: CALCITE-3896 > URL: https://issues.apache.org/jira/browse/CALCITE-3896 > Project: Calcite > Issue Type: Improvement > Components: core > Reporter: Haisheng Yuan > Priority: Major > > This is not on-demand trait requests as described in [mailing > list|http://mail-archives.apache.org/mod_mbox/calcite-dev/201910.mbox/%3cd75b20f4-542a-4a73-897e-66ab426494c1.h.y...@alibaba-inc.com%3e], > which requires the overhaul of the core planner. This ticket tries to enable > VolcanoPlanner with basic and minimal ability to pass through parent trait > request to child operators without rules, though may not be flexible or > powerful, but should be able to work with current Calcite application with > minimal changes. > The method for physical operators to implement would be: > {code:java} > interface RelNode { > RelNode passThrough(RelTraitSet required); > } > {code} > Given that Calcite's physical operators decides its child operators' traits > when the physical operator is created in physical implementation rule, there > are some drawback that can't be avoided. e.g., given the following plan: > {code:java} > StreamAgg on [a] > +-- MergeJoin on [a, b, c] > |--- TableScan foo > +--- TableScan bar > {code} > Suppose the MergeJoin implementation rule generates several mergejoins that > distributes by [a], [a,b], [a,b,c] separately. Then we pass parent operator > StreamAgg's trait request to MergeJoin. Since MergeJoin[a] satisfies parent's > request, nothing to do. Next pass request to MergeJoin[a,b], we get > MergeJoin[a], then pass request to MergeJoin[a,b,c], we get MergeJoin[a] > again. We know they are redundant and there is no need to pass through parent > operator's trait request, but these MergeJoin operators are independent and > agnostic of each other's existence. > The ideal way is that in physical implementation rule, during the creation of > physical operator, it should not care about itself and its child operators' > physical traits. But this is another different topic. > Anyway, better than nothing, once it is done, we can provide the option to > obsolete or disable {{AbstractConverter}}, but still be able to do property > enforcement. -- This message was sent by Atlassian Jira (v8.3.4#803005)