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

Julian Hyde commented on CALCITE-739:
-------------------------------------

Both suggestions are good. I like how you plan to use CNF internally (to prove 
a lemma) but throw it away (thereby avoiding an explosion in the size of the 
expression).

> Extend RexUtil.pullFactors to recognize additional common factors
> -----------------------------------------------------------------
>
>                 Key: CALCITE-739
>                 URL: https://issues.apache.org/jira/browse/CALCITE-739
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Jesus Camacho Rodriguez
>            Assignee: Jesus Camacho Rodriguez
>
> RexUtil.pullFactors canonizes at the term level (i.e. "a or b or a" becomes 
> "a or b" but does not attempt to recognize terms that are equivalent). 
> Further, it does not exploit the symmetry of '=' (i.e. a = b iff b = a).
> - A first extension would be to normalize comparisons between field 
> references and literals so that the lower field reference is always on the 
> left. So, "$6 = $3" becomes "$3 = $6"; "$6 > $3" becomes "$3< $6". And 
> "literal <= $5" becomes "$5 >= literal". This would not damage performance, 
> and would improve a few plans.
> - Another possible extension. Given the predicate "(a or b) and ((x and a) or 
> (y and b))", the first factor can be removed so the expression consists only 
> of "(x and a) or (y and b)".
> One possible way to recognize such cases is to transform the second factor to 
> CNF i.e. "(x or y) and (x or b) and (a or y) and (a or b)", and as it 
> contains "(a or b)", we would know that we can discard it. Then we could just 
> use the original expression i.e. "(x and a) or (y and b)" in the predicate, 
> once we have done the check.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to