Thanks Julian, for current patch, I choose 1 because it can applied both to Hep and Volcano. I make these latest changes:
• Add a new interface RelOptRuleCall.transformTo(RelNode, Map, BiFunction) to make the hints copy strategy overridable • Cache the hint strategies into RelOptCluster so that user can query the strategies during rule planning Another reason I didn’t choose 2 is that a RelNode’s parent node may also be derived from a Rule matching, so I have to lookup recursively to find the real original node for the hints. Best, Danny Chan 在 2019年10月18日 +0800 AM4:55,Julian Hyde <jh...@apache.org>,写道: > I wonder whether it is possible to add some kind of “action handler” to the > planner engine, called, for example, when a rule has fired and is registering > the RelNode created by the rule. People can write their own action handlers > to copy hints around. Since the action handlers are the user’s code, they can > iterate faster to find a hint-propagation strategy that works in practice. > > Another idea is to use VolcanoPlanner.Provenance[1]. A RelNode can find its > ancestor RelNodes, and the rules that fired to create it. So it can grab > hints from those ancestors. It does not need to copy those hints onto itself. > > Julian > > [1] > https://calcite.apache.org/apidocs/org/apache/calcite/plan/volcano/VolcanoPlanner.Provenance.html > > <https://calcite.apache.org/apidocs/org/apache/calcite/plan/volcano/VolcanoPlanner.Provenance.html> > > > On Oct 16, 2019, at 8:38 PM, Haisheng Yuan <h.y...@alibaba-inc.com> wrote: > > > > Julian, > > Your concern is very valid, and that is also our main concern. > > I was thinking whether we can put hint into the MEMO group, so that both > > logical and physical expression in the same group can share the same hint, > > without copying the hint explicitly. But for newly generated expression > > that doesn't belong to the original group, we still need to copy hints. > > What's worse, in HepPlanner, there is no such concept, we may still need to > > copy hints explicity in planner rules, if we want to keep the hint, which > > is burdensome. > > > > - Haisheng > > > > ------------------------------------------------------------------ > > 发件人:Danny Chan<yuzhao....@gmail.com> > > 日 期:2019年10月16日 14:54:46 > > 收件人:<dev@calcite.apache.org> > > 主 题:Re: [DISCUSS] Support Sql Hint for Calcite > > > > Thanks for the clarification. > > > > I understand you worried. Yes, the effort/memory would be wasted or > > meaningless if hints are not used. This is just what a hint does, it is a > > “hint” and non-mandatory, but we should give the chance to let user see > > them, it is the use that decide if to use the hints and how to use them. > > For big queries I have no confidence to cover the corner cases. So can we > > mark this feature as experimental and used for simple queries(no > > decorrelation) first ? > > > > For “reversible”, during the implementation, I try to make the > > modifications non-invasive with the current codes. That is why I made all > > the interfaces about the hint into one class named RelWithHInt. Different > > with trait, I didn’t force users to pass in the hints in the RelNode > > constructor. I think if is not a bigwork if we want to remove the API. > > > > Best, > > Danny Chan > > 在 2019年10月16日 +0800 AM11:14,Julian Hyde <jh...@apache.org>,写道: > > > By “skeptical” I mean that I think we can come up with a mechanism to > > > copy hints when applying planner rules, but even when we have implemented > > > that mechanism there will be many cases where people want a hint and that > > > hint is not copied to the RelNode where it is needed, and many other > > > cases where we spend the effort/memory of copying the hint to a RelNode > > > and the hint is not used. > > > > > > By “reversible” I mean if we come up with an API that does not work, how > > > do we change or remove that API without people complaining? > > > > > > Julian > > > > > > > > > > On Oct 15, 2019, at 7:11 PM, Danny Chan <yuzhao....@gmail.com> wrote: > > > > > > > > Thanks Julian > > > > > > > > > I am skeptical that RelWithHint will work for large queries. > > > > > > > > For “skeptical” do you mean how to transfer the hints during rule > > > > planning ? I’m also not that confident yet. > > > > > > > > > How do we introduce it in a reversible way > > > > Do you mean transform the RelWithHint back into the SqlHint ? I didn’t > > > > implement it in current patch, but I think we have the ability to do > > > > that because we have a inheritPath for each RelWithHint, we can collect > > > > all the hints together and merge them into the SqlHints, then propagate > > > > these SqlHints to the SqlNodes. > > > > > > > > > What are the other options? > > > > Do you mean the way to transfer hints during planning ? I have no other > > > > options yet. > > > > > > > > Best, > > > > Danny Chan > > > > 在 2019年10月16日 +0800 AM8:03,dev@calcite.apache.org,写道: > > > > > > > > > > I am skeptical that RelWithHint will work for large queries. > > > > > >