[ 
https://issues.apache.org/jira/browse/CALCITE-3977?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17106399#comment-17106399
 ] 

Ruben Q L commented on CALCITE-3977:
------------------------------------

Looking inside RelDecorrelator code, it seems that this use case (a correlation 
variable with several field accesses) is not supported.
The main classes inside RelDecorrelator to identify / reference a correlation 
(CorRef and CorDef) are based on a:
{code}
public final CorrelationId corr;
public final int field;
{code}

For my examples, I am considering the Bookstoreschema:
{code}
  public static class Author {
    public final int aid;
    public final String name;
    public final Place birthPlace;
    ...
  }
  public static class Place {
    public final Coordinate coords;
    public final String city;
    public final String country;
    ...
  }
{code}

The RelDecorrelator approach works fine to decorrelate plans which use for 
example {{$cor0.name}}, where we will have {{CorrelationId=$cor0}} and 
{{field=1}}, i.e. {{$cor0.1}}.
However, in plans like the one described in this ticket, using 
{{$cor0.birthPlace.city}}, this is not enough. It seems that the {{int field}} 
would require to be a list (or array), so that we can have a CorRef / CorDef 
with several "layers", i.e. {{$cor0.2.1}}. Right now these scenarios are not 
correctly handled, hence the current bug.
Maybe [~julianhyde] (who seems the main contributor to the RelDecorrelator), 
can confirm my assumption, and suggest an approach (maybe, as I proposed, 
changing {{int field}} into {{int[] fields}} ?) in order to improve this module 
to support this scenario.

> RelDecorrelator does not resolve correlation variable with field accesses
> -------------------------------------------------------------------------
>
>                 Key: CALCITE-3977
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3977
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.22.0
>            Reporter: Thomas Rebele
>            Priority: Major
>         Attachments: Calcite3977.java
>
>
> The RelCorrelator seems to have problems with some plans that contain a field 
> access (probably a RexFieldAccess, but I haven't looked further into it). In 
> this ticket there's a filter on *$cor0.birthPlace.city*.
> Here the complete plan:
> {code:java}
> before decorrelate
> LogicalCorrelate(correlation=[$cor0], joinType=[left], requiredColumns=[{}])
>   LogicalTableScan(table=[[bookstore, authors]])
>   LogicalFilter(condition=[=('Munich', $cor0.birthPlace.city)])
>     LogicalTableScan(table=[[bookstore, authors]])
> after decorrelate
> LogicalJoin(condition=[=($2, $8)], joinType=[left])
>   LogicalTableScan(table=[[bookstore, authors]])
>   LogicalJoin(condition=[true], joinType=[inner])
>     LogicalFilter(condition=[=('Munich', $cor0.birthPlace.city)])
>       LogicalTableScan(table=[[bookstore, authors]])
>     LogicalAggregate(group=[{0}])
>       LogicalProject(birthPlace=[$2])
>         LogicalTableScan(table=[[bookstore, authors]])
> {code}
> There seem to be two problems:
>  * The LogicalCorrelate has been removed, but the $cor0.birthPlace.city is 
> still in the filter condition.
>  * The inner join does not seem to be necessary. If it is, could somebody 
> explain, why?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to