jayzhan211 commented on PR #10354:
URL: https://github.com/apache/datafusion/pull/10354#issuecomment-2100125239

   > ## Option 1 - Original expression as a parameter
   > ```rust
   >     fn simplify(
   >         &self,
   >         expr: Expr, 
   >     ) -> Result<datafusion_common::tree_node::Transformed<Expr>> {
   >         // we know it'll always be AggregateFunction but we have to match 
on it 
   >         // which is not terribly hard but it makes api a bit odd 
   >         if let Expr::AggregateFunction(agg) = expr {
   >             ...
   >             Ok(datafusion_common::tree_node::Transformed::yes(...))
   >         } else {
   >             // no re-creation of expression if not used 
   >             Ok(datafusion_common::tree_node::Transformed::no(expr))
   >         }
   >     }
   > ```
   > 
   > default implementation is just:
   > 
   > ```rust
   >     fn simplify(
   >         &self,
   >         expr: Expr, 
   >     ) -> Result<datafusion_common::tree_node::Transformed<Expr>> {
   >             // no re-creation of expression if not used 
   >             Ok(datafusion_common::tree_node::Transformed::no(expr))
   >     }
   > ```
   > 
   > ## Option 2 - AggregationFunction as a parameter
   > ```rust
   >     fn simplify(
   >         &self,
   >         agg: AggregateFunction, 
   >     ) -> Result<datafusion_common::tree_node::Transformed<Expr>> {
   >         // we know its aggregate function, no need to do extra matching, 
but we need to re-create expression 
   >         // issue user can return `no` with new expression in it 
   >         
Ok(datafusion_common::tree_node::Transformed::no(Expr::AggregateFunction(agg)))
   >     }
   > ```
   > 
   > ## Option 3 - AggregationFunction as a parameter with parametrised 
`ExprSimplifyResult`
   > ```rust
   >     fn simplify(
   >         &self,
   >         agg: AggregateFunction, 
   >     ) -> Result<ExprSimplifyResult<AggregateFunction>> {
   >        // user cant return `no` with new expression 
   >        // simplifier will re-crete expression in case original has been 
returned 
   >         Ok(ExprSimplifyResult::Original(agg))        
   >    }
   > ```
   > 
   > IMHO, I prefer option number 3, which would involve parametrizing 
`ExprSimplifyResult`, second best is option number 2. wdyt @jayzhan211, @alamb
   
   Given these 3, I prefer 2. And we can do even further, 
   
   If user does not implement simplify, it is equivalent to Transformed::no or 
ExprSimplifyResult::Original, so we can just have `Result<Expr>`
   ```rust
   fn simplify(
           &self,
           agg: AggregateFunction, 
       ) -> Result<Expr> {
           // we know its aggregate function, no need to do extra matching, but 
we need to re-create expression 
           // issue user can return `no` with new expression in it 
           Ok(Expr::AggregateFunction(agg))
       }
   ```
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org
For additional commands, e-mail: github-h...@datafusion.apache.org

Reply via email to