[
https://issues.apache.org/jira/browse/CALCITE-739?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jesus Camacho Rodriguez updated CALCITE-739:
--------------------------------------------
Description:
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.
was:
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.
> 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)