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 >> >>
