TL;DR: RelNodes don’t really have parents. Be careful if you are relying on the 
parent concept too much. Rely on rules instead.

In the Volcano model, a RelNode doesn’t really have a parent. It might be used 
in several places. (RelSet has a field ‘List<RelNode> parents’ that is kept up 
to date as planing progresses. But it’s really for Volcano’s internal use.)

Even if you are not using Volcano, there are reasons to want the RelNode graph 
to be a dag, so again, a RelNode doesn’t have a unique parent.

RelShuttleImpl has a stack. You can use that to find the parent. But the 
“parent” is just “where we came from as we traversed the RelNode graph”. There 
may be other “parents” that you do not know about.

If you have a Project and want to find all parents that are Filters, don’t even 
think about “iterating over the parents” of the Project. Just write a rule that 
matches a Filter on a Project, and trust Volcano to do its job.

Julian




> On Apr 22, 2019, at 6:15 AM, Yuzhao Chen <[email protected]> wrote:
> 
> 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