You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by 徐仁和 <xu...@gmail.com> on 2022/03/07 09:00:51 UTC

Could calcite support SortProjectPullUpConstantsRule?

Hi community:

Could calcite support the rule to pull up constant project from sort, just
like `AggregateProjectPullUpConstantsRule`?

-- sql
select pay_amount, pay_id, user_id
from pay_tbl
where pay_id = 1234
group by pay_amount, pay_id, user_id
order by pay_amount, pay_id, user_id

-- origin rel tree
LogicalSort(sort0=[$0], sort1=[$1], sort2=[$2], dir0=[ASC], dir1=[ASC],
dir2=[ASC])
  LogicalProject(pay_amount=[$0], pay_id=[1234], user_id=[$1])
    LogicalAggregate(group=[{0, 1}])
      LogicalProject(pay_amount=[$1], user_id=[$3])
        LogicalFilter(condition=[=($0, 1234)])
          LogicalTableScan(table=[[default, pay_tbl]])

-- optimized rel tree
LogicalProject(pay_amount=[$0], pay_id=[1234], user_id=[$1])
  LogicalSort(sort0=[$0], sort2=[$1], dir0=[ASC], dir2=[ASC])
    LogicalProject(pay_amount=[$0], user_id=[$1])
      LogicalAggregate(group=[{0, 1}])
        LogicalProject(pay_amount=[$1], user_id=[$3])
          LogicalFilter(condition=[=($0, 1234)])
            LogicalTableScan(table=[[default, pay_tbl]])

Re: Could calcite support SortProjectPullUpConstantsRule?

Posted by Julian Hyde <jh...@gmail.com>.
Sounds reasonable. Please log a jira. 

Consider implementing this rule by inspecting predicates or unique keys, rather than by matching a Project or Filter. If you can ascertain that a sort column has only one value (counting NULL as a value for these purposes) then you can remove it from the sort. 

I find that using metadata in this way is very effective. You get the desired effect without moving relational operators around. 

Julian

> On Mar 7, 2022, at 1:01 AM, 徐仁和 <xu...@gmail.com> wrote:
> 
> Hi community:
> 
> Could calcite support the rule to pull up constant project from sort, just
> like `AggregateProjectPullUpConstantsRule`?
> 
> -- sql
> select pay_amount, pay_id, user_id
> from pay_tbl
> where pay_id = 1234
> group by pay_amount, pay_id, user_id
> order by pay_amount, pay_id, user_id
> 
> -- origin rel tree
> LogicalSort(sort0=[$0], sort1=[$1], sort2=[$2], dir0=[ASC], dir1=[ASC],
> dir2=[ASC])
>  LogicalProject(pay_amount=[$0], pay_id=[1234], user_id=[$1])
>    LogicalAggregate(group=[{0, 1}])
>      LogicalProject(pay_amount=[$1], user_id=[$3])
>        LogicalFilter(condition=[=($0, 1234)])
>          LogicalTableScan(table=[[default, pay_tbl]])
> 
> -- optimized rel tree
> LogicalProject(pay_amount=[$0], pay_id=[1234], user_id=[$1])
>  LogicalSort(sort0=[$0], sort2=[$1], dir0=[ASC], dir2=[ASC])
>    LogicalProject(pay_amount=[$0], user_id=[$1])
>      LogicalAggregate(group=[{0, 1}])
>        LogicalProject(pay_amount=[$1], user_id=[$3])
>          LogicalFilter(condition=[=($0, 1234)])
>            LogicalTableScan(table=[[default, pay_tbl]])