If you put ReduceExpressionsRule in a HepPlanner, then you do not have
to rely the costing factor,  since HepPlanner is heuristic-rule based,
not cost-based.

Actually, Calcite has one unit test in RelOptRuleTest [1] [2], which
shows how constant reduce rules work.

[1] 
https://github.com/apache/calcite/blob/master/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java#L834
[2] 
https://github.com/apache/calcite/blob/master/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml#L644-L667


On Tue, Jun 14, 2016 at 10:10 PM, Jason Altekruse <[email protected]> wrote:
> The first place I would recommend looking is how you are costing projects
> and filters. If the costing function for these relational operators does
> not take into account the complexity of the expressions contained, possibly
> by only considering the number of top level expressions, the reduced plan
> would not be exposing with a lower cost that it is preferable to the
> original plan.
>
> You can see here that the default project Rel appears to only consider the
> number of expressions and the input size when computing costs [1]. You
> probably want to have some visitor that will walk each of the expressions
> to come up with a more accurate cost. I don't know if this functionality is
> provided somewhere else in calcite.
>
> [1] -
> https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/rel/core/Project.java#L216
>
> Jason Altekruse
> Software Engineer at Dremio
> Apache Drill Committer
>
> On Tue, Jun 14, 2016 at 9:58 PM, Jark Wu <[email protected]> wrote:
>
>> Hi all,
>>
>> I want to reduce the constant expression in sql, replacing them with a
>> corresponding constant.
>>
>> For instance I have a sql query :
>>
>> SELECT a, b, c+(2+3) as d FROM Orders WHERE b > (1+4)
>>
>>
>> I want some planner rules can optimize this query to reduce the constant
>> exprssions:
>>
>> SELECT a, b, c+5 as d FROM Orders WHERE b > 5
>>
>>
>> It seems that ReduceExpressionsRule is what I need, and I tried it many
>> times but it didn’t work.
>>
>> Is the way I used wrong ? Or there is any exist rule to use, or I have to
>> implement one myself ?
>>
>>
>>
>> - Jark Wu
>>
>>

Reply via email to