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

ruanhui commented on CALCITE-6363:
----------------------------------

Thanks for your reply [~julianhyde] 

{quote}I would like to see some test cases for left and right joins. It is 
possible to move conditions across outer joins, in some cases.{quote}

Ok. Let me verify whether it can be applied to outer join.

{quote}I don't believe that all the changes to RexNormalize and RexUtil are 
necessary.{quote}

I think you mean the new static method RexUtil.canonizeNode ? The purpose of 
introducing this method is to reorder expressions. During rewriting, it is 
possible to generate some *different* but *equivalent* expressions. For 
example, we may get $1 > $2 and $2 < $1, $1 = $2 and $2 = $1, AND(condition1, 
condition2) and AND(condition2, condition1). To remove duplicates, I introduced 
this method, which can provide the following function:
a. literal/constant is always in right, such as: 10 > $1 -> $1 < 10
b. input ref with smaller index is in left, such as: $1 = $0 -> $0 = $1

Do you have any suggestion about how to do this better or we already have a 
better API in codebase ?
 
Thanks.

> Introduce a rule to derive more filters from inner join condition
> -----------------------------------------------------------------
>
>                 Key: CALCITE-6363
>                 URL: https://issues.apache.org/jira/browse/CALCITE-6363
>             Project: Calcite
>          Issue Type: New Feature
>          Components: core
>            Reporter: ruanhui
>            Priority: Minor
>              Labels: pull-request-available
>
> Sometimes we can infer more predicates from inner Join , for example, in the 
> query
> SELECT * FROM ta INNER JOIN tb ON ta.x = tb.y WHERE ta.x > 10
> we can infer condition tb.y > 10 and we can push it down to the table tb.
> In this way, it is possible to reduce the amount of data involved in the Join.
> To achieve this, here is my idea.
> The core data strucature is two Multimap:
> predicateMap : a map for inputRef to corresponding predicate such as: $1 -> 
> [$1 > 10, $1 < 20, $1 = $2]
> equivalenceMap : a map for inputRef to corresponding equivalent values or 
> inputRefs such as: $1 -> [$2, 1]
> The filter derivation is divided into 4 steps:
> 1. construct predicate map and equivalence map by traversing all conjunctions 
> in the condition
> 2. search map and rewrite predicates with equivalent inputRefs or literals
> 2.1 find all inputRefs that are equivalent to the current inputRef, and then 
> rewrite all predicates involving equivalent inputRefs using inputRef, for 
> example if we have inputRef $1 = equivInputRef $2, then we can rewrite \{$2 = 
> 10} to \{$1 = 10}.
> 2.2 find all predicates involving current inputRef. If any predicate refers 
> to another inputRef, rewrite the predicate with the literal/constant 
> equivalent to that inputRef, such as: if we have inputRef \{$1 > $2} and \{$2 
> = 10} then we can infer new condition \{$1 > 10}.
> 2.3 derive new predicates based on equivalence relation in equivalenceMultimap
> 3. compose all original predicates and derived predicates
> 4. simplify expression such as range merging, like \{$1 > 10 AND $1 > 20} => 
> \{$1 > 20}, \{$1 > $2 AND $1 > $2} => \{$1 > $2}
> Anyone interested in this, please feel free to comment on this issue.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to