Darpan Lunagariya (e6data computing) created CALCITE-7737:
-------------------------------------------------------------

             Summary: Predicate rewriting using function preimages
                 Key: CALCITE-7737
                 URL: https://issues.apache.org/jira/browse/CALCITE-7737
             Project: Calcite
          Issue Type: Improvement
          Components: core
            Reporter: Darpan Lunagariya (e6data computing)


{code}
h2. Description
Add support for rewriting predicates on function results into equivalent 
predicates on their input columns using function preimages.

For a function {{f}} and result domain {{D}}, the preimage is:
{code:none}
preimage(f, D) = {x | f(x) belongs to D}
{code}

Therefore:
{code:none}
SEARCH(f(column), D) <=> SEARCH(column, preimage(f, D))
{code}

The rewrite is applied only when exact equivalence can be established.

h2. Example

The {{YEAR}} function is monotonic over a date-time input: as the input 
increases, the extracted year never decreases.

{code:sql}
YEAR(event_time) = 2020
{code}

The exact preimage of {{2020}} is the corresponding timestamp interval:
{code:sql}
event_time >= TIMESTAMP '2020-01-01 00:00:00'
AND event_time < TIMESTAMP '2021-01-01 00:00:00'
{code}

The function predicate can therefore be replaced with the base-column range.

h2. Initial scope
The initial generic implementation focuses on monotonic functions. For a 
monotonic function, the preimage of an ordered result range can be represented 
using straightforward input boundaries. These boundaries can be derived using a 
symbolic inverse or bisection.
Non-monotonic functions may produce multiple disjoint input ranges and usually 
require function-specific reasoning. They are not impossible to support, but 
are outside the initial generic scope.

h2. Benefits
Enables file, row-group and page pruning using min/max statistics.
Avoids evaluating the function for every row when the original predicate is 
replaced with its exact preimage.
{code}



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

Reply via email to