jayzhan211 commented on PR #10560: URL: https://github.com/apache/datafusion/pull/10560#issuecomment-2154728354
> > I'm not sure if we really need the error check since we don't have any now > > I guess what I was thinking is that the reason there is no check now is because the rust compiler will ensure the types are correct (specifically that they are `AggregateUDF`. > > With the builder API as it is written now, you can call `order_by` on any arbitrary Expr (not just the appropriate `Expr::AggregateFunction` variant) > > So I was imagining if any of the methods had been called on an invalid Expr, `build()` would return an error > > Maybe something like > > ```rust > /// Traits to help build aggregate functions > trait AggregateExt { > // return a builder > fn order_by(self, order_by: Vec<Expr>) -> AggregateBuilder; > fn filter(self, filter: Box<Expr>) -> AggregateBuilder; > fn null_treatment(self, null_treatment: NullTreatment) -> AggregateBuilder; > fn distinct(self) -> AggregateBuilder; > } > > pub struct AggregateBuilder { > // if set to none, builder errors > udf: Option<Arc<AggregateUdf>>, > order_by: Vec<Expr>, > .... > } > > impl AggregateBuilder { > fn order_by(self, order_by: Vec<Expr>) -> AggregateBuilder { > self.order_by = order_by; > self > } > fn filter(self, filter: Box<Expr>) -> AggregateBuilder {..} > fn null_treatment(self, null_treatment: NullTreatment) -> AggregateBuilder {..} > fn distinct(self) -> AggregateBuilder {..} > // builds up any in progress aggregate > fn build(self) -> Result<Expr> { > let Some(udf) = self.udf else { > return plan_err!("Expr of type XXX is not an aggregate") > } > udf.order_by = self.order_by; > ... > Ok(Expr::AggregateFunction(udf)) > } > } > > impl AggregateExt for Expr { > fn order_by(self, order_by: Vec<Expr>) -> AggregateBuilder { > match self { > Expr::AggregateFunction(mut udaf) => { > AggregateBuilder { udf: Some(udaf) } > } > // wrong type passed -- error when build is called > _ => { > AggregateBuilder { udf: None } > } > } > } > ``` I'm not sure is it worth to introduce build()? just for handling non Expr::AggregateFunction cases 🤔 -- 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