Thx, Stamatis, that somehow make sense, if i pass around the parent node every 
time I visit a RelNode and keep the parents in the cache, but it is still not 
that intuitive. Actually I what a to add a new RelTrait which bind to a 
specific scope, for example:

         join-rel(trait1)
       /           \
    join2     join3

Join-rel has a trait trait1, and I want all the children of join-rel can see 
this trait, with Calcite’s default metadata handler, I can only see the trait 
from children nodes(traits propagate from the inputs), and I have no idea how 
to propagate a trait reversely?


Best,
Danny Chan
在 2019年4月22日 +0800 PM8:44,Stamatis Zampetakis <[email protected]>,写道:
> Hi Danny,
>
> Apart from RelShuttle there is also RelVisitor which has a visit method
> that provides the parent [1]. Not sure, if it suits your needs.
>
> Best,
> Stamatis
>
> [1]
> https://github.com/apache/calcite/blob/ee83efd360793ef4201f4cdfc2af8d837b76ca69/core/src/main/java/org/apache/calcite/rel/RelVisitor.java#L43
>
>
> On Mon, Apr 22, 2019 at 2:14 PM Yuzhao Chen <[email protected]> wrote:
>
> > Now for RelNode, we have method getInput()[1] to fetch the input
> > RelNodes, but how we fetch the parent ?
> >
> > For example, we have plan:
> >
> > join-rel
> > / \
> > scan1 scan2
> >
> >
> > We can get scan1 and scan2 in join-rel directly with method getInput, but
> > how can we get the join rel in scan1 and scan 2 ?
> >
> > I know that there is a RelShuttle that can visit every RelNode and if I
> > make a cache for the inputs mapping, finally I can get the ‘parents’ from
> > the cache, but this is boring code and not that intuitive.
> >
> > Do you guys have any good ideas ?
> >
> > [1]
> > https://github.com/apache/calcite/blob/ee83efd360793ef4201f4cdfc2af8d837b76ca69/core/src/main/java/org/apache/calcite/rel/RelNode.java#L132
> >
> >
> > Best,
> > Danny Chan
> >

Reply via email to