This is an automated email from the ASF dual-hosted git repository.
jayzhan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new b4069a65a9 Remove `AggregateFunctionDefinition` (#11803)
b4069a65a9 is described below
commit b4069a65a9bb207370d382bdde93f1c98d69b9eb
Author: 张林伟 <[email protected]>
AuthorDate: Mon Aug 5 08:15:57 2024 +0800
Remove `AggregateFunctionDefinition` (#11803)
* Remove [200~if udf.name() == count => {
* Apply review suggestions
---
datafusion/core/src/physical_planner.rs | 69 ++++++++++------------
datafusion/expr/src/expr.rs | 34 +++--------
datafusion/expr/src/expr_schema.rs | 47 +++++++--------
datafusion/expr/src/tree_node.rs | 31 ++++------
datafusion/functions-nested/src/planner.rs | 4 +-
.../optimizer/src/analyzer/count_wildcard_rule.rs | 8 +--
datafusion/optimizer/src/analyzer/type_coercion.rs | 42 +++++++------
datafusion/optimizer/src/decorrelate.rs | 20 +++----
.../src/simplify_expressions/expr_simplifier.rs | 8 +--
.../optimizer/src/single_distinct_to_groupby.rs | 17 +++---
datafusion/proto/src/logical_plan/to_proto.rs | 50 ++++++++--------
datafusion/sql/src/unparser/expr.rs | 2 +-
datafusion/substrait/src/logical_plan/producer.rs | 11 +---
13 files changed, 144 insertions(+), 199 deletions(-)
diff --git a/datafusion/core/src/physical_planner.rs
b/datafusion/core/src/physical_planner.rs
index 03e20b886e..378a892111 100644
--- a/datafusion/core/src/physical_planner.rs
+++ b/datafusion/core/src/physical_planner.rs
@@ -74,8 +74,8 @@ use datafusion_common::{
};
use datafusion_expr::dml::CopyTo;
use datafusion_expr::expr::{
- self, AggregateFunction, AggregateFunctionDefinition, Alias, Between,
BinaryExpr,
- Cast, GroupingSet, InList, Like, TryCast, WindowFunction,
+ self, AggregateFunction, Alias, Between, BinaryExpr, Cast, GroupingSet,
InList, Like,
+ TryCast, WindowFunction,
};
use datafusion_expr::expr_rewriter::unnormalize_cols;
use datafusion_expr::expr_vec_fmt;
@@ -223,18 +223,15 @@ fn create_physical_name(e: &Expr, is_first_expr: bool) ->
Result<String> {
create_function_physical_name(&fun.to_string(), false, args,
Some(order_by))
}
Expr::AggregateFunction(AggregateFunction {
- func_def,
+ func,
distinct,
args,
filter: _,
order_by,
null_treatment: _,
- }) => create_function_physical_name(
- func_def.name(),
- *distinct,
- args,
- order_by.as_ref(),
- ),
+ }) => {
+ create_function_physical_name(func.name(), *distinct, args,
order_by.as_ref())
+ }
Expr::GroupingSet(grouping_set) => match grouping_set {
GroupingSet::Rollup(exprs) => Ok(format!(
"ROLLUP ({})",
@@ -1817,7 +1814,7 @@ pub fn create_aggregate_expr_with_name_and_maybe_filter(
) -> Result<AggregateExprWithOptionalArgs> {
match e {
Expr::AggregateFunction(AggregateFunction {
- func_def,
+ func,
distinct,
args,
filter,
@@ -1839,36 +1836,34 @@ pub fn create_aggregate_expr_with_name_and_maybe_filter(
.unwrap_or(sqlparser::ast::NullTreatment::RespectNulls)
== NullTreatment::IgnoreNulls;
- let (agg_expr, filter, order_by) = match func_def {
- AggregateFunctionDefinition::UDF(fun) => {
- let sort_exprs = order_by.clone().unwrap_or(vec![]);
- let physical_sort_exprs = match order_by {
- Some(exprs) => Some(create_physical_sort_exprs(
- exprs,
- logical_input_schema,
- execution_props,
- )?),
- None => None,
- };
+ let (agg_expr, filter, order_by) = {
+ let sort_exprs = order_by.clone().unwrap_or(vec![]);
+ let physical_sort_exprs = match order_by {
+ Some(exprs) => Some(create_physical_sort_exprs(
+ exprs,
+ logical_input_schema,
+ execution_props,
+ )?),
+ None => None,
+ };
- let ordering_reqs: Vec<PhysicalSortExpr> =
- physical_sort_exprs.clone().unwrap_or(vec![]);
+ let ordering_reqs: Vec<PhysicalSortExpr> =
+ physical_sort_exprs.clone().unwrap_or(vec![]);
- let agg_expr = udaf::create_aggregate_expr_with_dfschema(
- fun,
- &physical_args,
- args,
- &sort_exprs,
- &ordering_reqs,
- logical_input_schema,
- name,
- ignore_nulls,
- *distinct,
- false,
- )?;
+ let agg_expr = udaf::create_aggregate_expr_with_dfschema(
+ func,
+ &physical_args,
+ args,
+ &sort_exprs,
+ &ordering_reqs,
+ logical_input_schema,
+ name,
+ ignore_nulls,
+ *distinct,
+ false,
+ )?;
- (agg_expr, filter, physical_sort_exprs)
- }
+ (agg_expr, filter, physical_sort_exprs)
};
Ok((agg_expr, filter, order_by))
diff --git a/datafusion/expr/src/expr.rs b/datafusion/expr/src/expr.rs
index 7088434948..1a51c181f4 100644
--- a/datafusion/expr/src/expr.rs
+++ b/datafusion/expr/src/expr.rs
@@ -627,22 +627,6 @@ impl Sort {
}
}
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-/// Defines which implementation of an aggregate function DataFusion should
call.
-pub enum AggregateFunctionDefinition {
- /// Resolved to a user defined aggregate function
- UDF(Arc<crate::AggregateUDF>),
-}
-
-impl AggregateFunctionDefinition {
- /// Function's name for display
- pub fn name(&self) -> &str {
- match self {
- AggregateFunctionDefinition::UDF(udf) => udf.name(),
- }
- }
-}
-
/// Aggregate function
///
/// See also [`ExprFunctionExt`] to set these fields on `Expr`
@@ -651,7 +635,7 @@ impl AggregateFunctionDefinition {
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub struct AggregateFunction {
/// Name of the function
- pub func_def: AggregateFunctionDefinition,
+ pub func: Arc<crate::AggregateUDF>,
/// List of expressions to feed to the functions as arguments
pub args: Vec<Expr>,
/// Whether this is a DISTINCT aggregation or not
@@ -666,7 +650,7 @@ pub struct AggregateFunction {
impl AggregateFunction {
/// Create a new AggregateFunction expression with a user-defined function
(UDF)
pub fn new_udf(
- udf: Arc<crate::AggregateUDF>,
+ func: Arc<crate::AggregateUDF>,
args: Vec<Expr>,
distinct: bool,
filter: Option<Box<Expr>>,
@@ -674,7 +658,7 @@ impl AggregateFunction {
null_treatment: Option<NullTreatment>,
) -> Self {
Self {
- func_def: AggregateFunctionDefinition::UDF(udf),
+ func,
args,
distinct,
filter,
@@ -1666,14 +1650,14 @@ impl Expr {
func.hash(hasher);
}
Expr::AggregateFunction(AggregateFunction {
- func_def,
+ func,
args: _args,
distinct,
filter: _filter,
order_by: _order_by,
null_treatment,
}) => {
- func_def.hash(hasher);
+ func.hash(hasher);
distinct.hash(hasher);
null_treatment.hash(hasher);
}
@@ -1870,7 +1854,7 @@ impl fmt::Display for Expr {
Ok(())
}
Expr::AggregateFunction(AggregateFunction {
- func_def,
+ func,
distinct,
ref args,
filter,
@@ -1878,7 +1862,7 @@ impl fmt::Display for Expr {
null_treatment,
..
}) => {
- fmt_function(f, func_def.name(), *distinct, args, true)?;
+ fmt_function(f, func.name(), *distinct, args, true)?;
if let Some(nt) = null_treatment {
write!(f, " {}", nt)?;
}
@@ -2190,14 +2174,14 @@ fn write_name<W: Write>(w: &mut W, e: &Expr) ->
Result<()> {
write!(w, "{window_frame}")?;
}
Expr::AggregateFunction(AggregateFunction {
- func_def,
+ func,
distinct,
args,
filter,
order_by,
null_treatment,
}) => {
- write_function_name(w, func_def.name(), *distinct, args)?;
+ write_function_name(w, func.name(), *distinct, args)?;
if let Some(fe) = filter {
write!(w, " FILTER (WHERE {fe})")?;
};
diff --git a/datafusion/expr/src/expr_schema.rs
b/datafusion/expr/src/expr_schema.rs
index 6344b892ad..676903d59a 100644
--- a/datafusion/expr/src/expr_schema.rs
+++ b/datafusion/expr/src/expr_schema.rs
@@ -17,8 +17,8 @@
use super::{Between, Expr, Like};
use crate::expr::{
- AggregateFunction, AggregateFunctionDefinition, Alias, BinaryExpr, Cast,
InList,
- InSubquery, Placeholder, ScalarFunction, Sort, TryCast, Unnest,
WindowFunction,
+ AggregateFunction, Alias, BinaryExpr, Cast, InList, InSubquery,
Placeholder,
+ ScalarFunction, Sort, TryCast, Unnest, WindowFunction,
};
use crate::type_coercion::binary::get_result_type;
use crate::type_coercion::functions::{
@@ -193,28 +193,24 @@ impl ExprSchemable for Expr {
_ => fun.return_type(&data_types, &nullability),
}
}
- Expr::AggregateFunction(AggregateFunction { func_def, args, .. })
=> {
+ Expr::AggregateFunction(AggregateFunction { func, args, .. }) => {
let data_types = args
.iter()
.map(|e| e.get_type(schema))
.collect::<Result<Vec<_>>>()?;
- match func_def {
- AggregateFunctionDefinition::UDF(fun) => {
- let new_types =
data_types_with_aggregate_udf(&data_types, fun)
- .map_err(|err| {
- plan_datafusion_err!(
- "{} {}",
- err,
- utils::generate_signature_error_msg(
- fun.name(),
- fun.signature().clone(),
- &data_types
- )
+ let new_types = data_types_with_aggregate_udf(&data_types,
func)
+ .map_err(|err| {
+ plan_datafusion_err!(
+ "{} {}",
+ err,
+ utils::generate_signature_error_msg(
+ func.name(),
+ func.signature().clone(),
+ &data_types
)
- })?;
- Ok(fun.return_type(&new_types)?)
- }
- }
+ )
+ })?;
+ Ok(func.return_type(&new_types)?)
}
Expr::Not(_)
| Expr::IsNull(_)
@@ -329,13 +325,12 @@ impl ExprSchemable for Expr {
}
}
Expr::Cast(Cast { expr, .. }) => expr.nullable(input_schema),
- Expr::AggregateFunction(AggregateFunction { func_def, .. }) => {
- match func_def {
- // TODO: UDF should be able to customize nullability
- AggregateFunctionDefinition::UDF(udf) if udf.name() ==
"count" => {
- Ok(false)
- }
- AggregateFunctionDefinition::UDF(_) => Ok(true),
+ Expr::AggregateFunction(AggregateFunction { func, .. }) => {
+ // TODO: UDF should be able to customize nullability
+ if func.name() == "count" {
+ Ok(false)
+ } else {
+ Ok(true)
}
}
Expr::ScalarVariable(_, _)
diff --git a/datafusion/expr/src/tree_node.rs b/datafusion/expr/src/tree_node.rs
index a8062c0c07..450ebb6c22 100644
--- a/datafusion/expr/src/tree_node.rs
+++ b/datafusion/expr/src/tree_node.rs
@@ -18,9 +18,8 @@
//! Tree node implementation for logical expr
use crate::expr::{
- AggregateFunction, AggregateFunctionDefinition, Alias, Between,
BinaryExpr, Case,
- Cast, GroupingSet, InList, InSubquery, Like, Placeholder, ScalarFunction,
Sort,
- TryCast, Unnest, WindowFunction,
+ AggregateFunction, Alias, Between, BinaryExpr, Case, Cast, GroupingSet,
InList,
+ InSubquery, Like, Placeholder, ScalarFunction, Sort, TryCast, Unnest,
WindowFunction,
};
use crate::{Expr, ExprFunctionExt};
@@ -304,7 +303,7 @@ impl TreeNode for Expr {
}),
Expr::AggregateFunction(AggregateFunction {
args,
- func_def,
+ func,
distinct,
filter,
order_by,
@@ -316,20 +315,16 @@ impl TreeNode for Expr {
order_by,
transform_option_vec(order_by, &mut f)
)?
- .map_data(
- |(new_args, new_filter, new_order_by)| match func_def {
- AggregateFunctionDefinition::UDF(fun) => {
- Ok(Expr::AggregateFunction(AggregateFunction::new_udf(
- fun,
- new_args,
- distinct,
- new_filter,
- new_order_by,
- null_treatment,
- )))
- }
- },
- )?,
+ .map_data(|(new_args, new_filter, new_order_by)| {
+ Ok(Expr::AggregateFunction(AggregateFunction::new_udf(
+ func,
+ new_args,
+ distinct,
+ new_filter,
+ new_order_by,
+ null_treatment,
+ )))
+ })?,
Expr::GroupingSet(grouping_set) => match grouping_set {
GroupingSet::Rollup(exprs) => transform_vec(exprs, &mut f)?
.update_data(|ve|
Expr::GroupingSet(GroupingSet::Rollup(ve))),
diff --git a/datafusion/functions-nested/src/planner.rs
b/datafusion/functions-nested/src/planner.rs
index fee3e83a0d..f980362105 100644
--- a/datafusion/functions-nested/src/planner.rs
+++ b/datafusion/functions-nested/src/planner.rs
@@ -20,7 +20,6 @@
use datafusion_common::{exec_err, utils::list_ndims, DFSchema, Result};
use datafusion_expr::expr::ScalarFunction;
use datafusion_expr::{
- expr::AggregateFunctionDefinition,
planner::{ExprPlanner, PlannerResult, RawBinaryExpr, RawFieldAccessExpr},
sqlparser, Expr, ExprSchemable, GetFieldAccess,
};
@@ -171,6 +170,5 @@ impl ExprPlanner for FieldAccessPlanner {
}
fn is_array_agg(agg_func: &datafusion_expr::expr::AggregateFunction) -> bool {
- let AggregateFunctionDefinition::UDF(udf) = &agg_func.func_def;
- return udf.name() == "array_agg";
+ return agg_func.func.name() == "array_agg";
}
diff --git a/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs
b/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs
index 6f83296667..e2da6c66ab 100644
--- a/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs
+++ b/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs
@@ -21,9 +21,7 @@ use crate::utils::NamePreserver;
use datafusion_common::config::ConfigOptions;
use datafusion_common::tree_node::{Transformed, TransformedResult, TreeNode};
use datafusion_common::Result;
-use datafusion_expr::expr::{
- AggregateFunction, AggregateFunctionDefinition, WindowFunction,
-};
+use datafusion_expr::expr::{AggregateFunction, WindowFunction};
use datafusion_expr::utils::COUNT_STAR_EXPANSION;
use datafusion_expr::{lit, Expr, LogicalPlan, WindowFunctionDefinition};
@@ -56,10 +54,10 @@ fn is_wildcard(expr: &Expr) -> bool {
fn is_count_star_aggregate(aggregate_function: &AggregateFunction) -> bool {
matches!(aggregate_function,
AggregateFunction {
- func_def: AggregateFunctionDefinition::UDF(udf),
+ func,
args,
..
- } if udf.name() == "count" && (args.len() == 1 &&
is_wildcard(&args[0]) || args.is_empty()))
+ } if func.name() == "count" && (args.len() == 1 &&
is_wildcard(&args[0]) || args.is_empty()))
}
fn is_count_star_window_aggregate(window_function: &WindowFunction) -> bool {
diff --git a/datafusion/optimizer/src/analyzer/type_coercion.rs
b/datafusion/optimizer/src/analyzer/type_coercion.rs
index bcd1cbcce2..2823b0fca2 100644
--- a/datafusion/optimizer/src/analyzer/type_coercion.rs
+++ b/datafusion/optimizer/src/analyzer/type_coercion.rs
@@ -28,8 +28,8 @@ use datafusion_common::{
DataFusionError, Result, ScalarValue,
};
use datafusion_expr::expr::{
- self, AggregateFunctionDefinition, Between, BinaryExpr, Case, Exists,
InList,
- InSubquery, Like, ScalarFunction, WindowFunction,
+ self, Between, BinaryExpr, Case, Exists, InList, InSubquery, Like,
ScalarFunction,
+ WindowFunction,
};
use datafusion_expr::expr_schema::cast_subquery;
use datafusion_expr::logical_plan::tree_node::unwrap_arc;
@@ -393,31 +393,29 @@ impl<'a> TreeNodeRewriter for TypeCoercionRewriter<'a> {
)))
}
Expr::AggregateFunction(expr::AggregateFunction {
- func_def,
+ func,
args,
distinct,
filter,
order_by,
null_treatment,
- }) => match func_def {
- AggregateFunctionDefinition::UDF(fun) => {
- let new_expr =
coerce_arguments_for_signature_with_aggregate_udf(
- args,
- self.schema,
- &fun,
- )?;
- Ok(Transformed::yes(Expr::AggregateFunction(
- expr::AggregateFunction::new_udf(
- fun,
- new_expr,
- distinct,
- filter,
- order_by,
- null_treatment,
- ),
- )))
- }
- },
+ }) => {
+ let new_expr =
coerce_arguments_for_signature_with_aggregate_udf(
+ args,
+ self.schema,
+ &func,
+ )?;
+ Ok(Transformed::yes(Expr::AggregateFunction(
+ expr::AggregateFunction::new_udf(
+ func,
+ new_expr,
+ distinct,
+ filter,
+ order_by,
+ null_treatment,
+ ),
+ )))
+ }
Expr::WindowFunction(WindowFunction {
fun,
args,
diff --git a/datafusion/optimizer/src/decorrelate.rs
b/datafusion/optimizer/src/decorrelate.rs
index 6dbf1641bd..fdd9ef8a8b 100644
--- a/datafusion/optimizer/src/decorrelate.rs
+++ b/datafusion/optimizer/src/decorrelate.rs
@@ -28,7 +28,7 @@ use datafusion_common::tree_node::{
Transformed, TransformedResult, TreeNode, TreeNodeRecursion,
TreeNodeRewriter,
};
use datafusion_common::{plan_err, Column, DFSchemaRef, Result, ScalarValue};
-use datafusion_expr::expr::{AggregateFunctionDefinition, Alias};
+use datafusion_expr::expr::Alias;
use datafusion_expr::simplify::SimplifyContext;
use datafusion_expr::utils::{conjunction, find_join_exprs, split_conjunction};
use datafusion_expr::{expr, EmptyRelation, Expr, LogicalPlan,
LogicalPlanBuilder};
@@ -433,19 +433,13 @@ fn agg_exprs_evaluation_result_on_empty_batch(
.clone()
.transform_up(|expr| {
let new_expr = match expr {
- Expr::AggregateFunction(expr::AggregateFunction {
- func_def, ..
- }) => match func_def {
- AggregateFunctionDefinition::UDF(fun) => {
- if fun.name() == "count" {
-
Transformed::yes(Expr::Literal(ScalarValue::Int64(Some(
- 0,
- ))))
- } else {
-
Transformed::yes(Expr::Literal(ScalarValue::Null))
- }
+ Expr::AggregateFunction(expr::AggregateFunction { func, ..
}) => {
+ if func.name() == "count" {
+
Transformed::yes(Expr::Literal(ScalarValue::Int64(Some(0))))
+ } else {
+ Transformed::yes(Expr::Literal(ScalarValue::Null))
}
- },
+ }
_ => Transformed::no(expr),
};
Ok(new_expr)
diff --git a/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
b/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
index 1e1418744f..979a1499d0 100644
--- a/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
+++ b/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
@@ -32,9 +32,7 @@ use datafusion_common::{
tree_node::{Transformed, TransformedResult, TreeNode, TreeNodeRewriter},
};
use datafusion_common::{internal_err, DFSchema, DataFusionError, Result,
ScalarValue};
-use datafusion_expr::expr::{
- AggregateFunctionDefinition, InList, InSubquery, WindowFunction,
-};
+use datafusion_expr::expr::{InList, InSubquery, WindowFunction};
use datafusion_expr::simplify::ExprSimplifyResult;
use datafusion_expr::{
and, lit, or, BinaryExpr, Case, ColumnarValue, Expr, Like, Operator,
Volatility,
@@ -1408,9 +1406,9 @@ impl<'a, S: SimplifyInfo> TreeNodeRewriter for
Simplifier<'a, S> {
}
Expr::AggregateFunction(datafusion_expr::expr::AggregateFunction {
- func_def: AggregateFunctionDefinition::UDF(ref udaf),
+ ref func,
..
- }) => match (udaf.simplify(), expr) {
+ }) => match (func.simplify(), expr) {
(Some(simplify_function), Expr::AggregateFunction(af)) => {
Transformed::yes(simplify_function(af, info)?)
}
diff --git a/datafusion/optimizer/src/single_distinct_to_groupby.rs
b/datafusion/optimizer/src/single_distinct_to_groupby.rs
index fba42d7f88..9a0fab14d3 100644
--- a/datafusion/optimizer/src/single_distinct_to_groupby.rs
+++ b/datafusion/optimizer/src/single_distinct_to_groupby.rs
@@ -26,7 +26,6 @@ use datafusion_common::{
internal_err, qualified_name, tree_node::Transformed, DataFusionError,
Result,
};
use datafusion_expr::builder::project;
-use datafusion_expr::expr::AggregateFunctionDefinition;
use datafusion_expr::{
col,
expr::AggregateFunction,
@@ -70,7 +69,7 @@ fn is_single_distinct_agg(aggr_expr: &[Expr]) -> Result<bool>
{
let mut aggregate_count = 0;
for expr in aggr_expr {
if let Expr::AggregateFunction(AggregateFunction {
- func_def: AggregateFunctionDefinition::UDF(fun),
+ func,
distinct,
args,
filter,
@@ -86,9 +85,9 @@ fn is_single_distinct_agg(aggr_expr: &[Expr]) -> Result<bool>
{
for e in args {
fields_set.insert(e);
}
- } else if fun.name() != "sum"
- && fun.name().to_lowercase() != "min"
- && fun.name().to_lowercase() != "max"
+ } else if func.name() != "sum"
+ && func.name().to_lowercase() != "min"
+ && func.name().to_lowercase() != "max"
{
return Ok(false);
}
@@ -184,7 +183,7 @@ impl OptimizerRule for SingleDistinctToGroupBy {
.into_iter()
.map(|aggr_expr| match aggr_expr {
Expr::AggregateFunction(AggregateFunction {
- func_def: AggregateFunctionDefinition::UDF(udf),
+ func,
mut args,
distinct,
..
@@ -200,7 +199,7 @@ impl OptimizerRule for SingleDistinctToGroupBy {
.push(arg.alias(SINGLE_DISTINCT_ALIAS));
}
Ok(Expr::AggregateFunction(AggregateFunction::new_udf(
- udf,
+ func,
vec![col(SINGLE_DISTINCT_ALIAS)],
false, // intentional to remove distinct
here
None,
@@ -213,7 +212,7 @@ impl OptimizerRule for SingleDistinctToGroupBy {
let alias_str = format!("alias{}", index);
inner_aggr_exprs.push(
Expr::AggregateFunction(AggregateFunction::new_udf(
- Arc::clone(&udf),
+ Arc::clone(&func),
args,
false,
None,
@@ -223,7 +222,7 @@ impl OptimizerRule for SingleDistinctToGroupBy {
.alias(&alias_str),
);
Ok(Expr::AggregateFunction(AggregateFunction::new_udf(
- udf,
+ func,
vec![col(&alias_str)],
false,
None,
diff --git a/datafusion/proto/src/logical_plan/to_proto.rs
b/datafusion/proto/src/logical_plan/to_proto.rs
index 74d9d61b3a..ab81ce8af9 100644
--- a/datafusion/proto/src/logical_plan/to_proto.rs
+++ b/datafusion/proto/src/logical_plan/to_proto.rs
@@ -21,8 +21,8 @@
use datafusion_common::{TableReference, UnnestOptions};
use datafusion_expr::expr::{
- self, AggregateFunctionDefinition, Alias, Between, BinaryExpr, Cast,
GroupingSet,
- InList, Like, Placeholder, ScalarFunction, Sort, Unnest,
+ self, Alias, Between, BinaryExpr, Cast, GroupingSet, InList, Like,
Placeholder,
+ ScalarFunction, Sort, Unnest,
};
use datafusion_expr::{
logical_plan::PlanType, logical_plan::StringifiedPlan,
BuiltInWindowFunction, Expr,
@@ -361,38 +361,34 @@ pub fn serialize_expr(
}
}
Expr::AggregateFunction(expr::AggregateFunction {
- ref func_def,
+ ref func,
ref args,
ref distinct,
ref filter,
ref order_by,
null_treatment: _,
- }) => match func_def {
- AggregateFunctionDefinition::UDF(fun) => {
- let mut buf = Vec::new();
- let _ = codec.try_encode_udaf(fun, &mut buf);
- protobuf::LogicalExprNode {
- expr_type: Some(ExprType::AggregateUdfExpr(Box::new(
- protobuf::AggregateUdfExprNode {
- fun_name: fun.name().to_string(),
- args: serialize_exprs(args, codec)?,
- distinct: *distinct,
- filter: match filter {
- Some(e) => {
- Some(Box::new(serialize_expr(e.as_ref(),
codec)?))
- }
- None => None,
- },
- order_by: match order_by {
- Some(e) => serialize_exprs(e, codec)?,
- None => vec![],
- },
- fun_definition: (!buf.is_empty()).then_some(buf),
+ }) => {
+ let mut buf = Vec::new();
+ let _ = codec.try_encode_udaf(func, &mut buf);
+ protobuf::LogicalExprNode {
+ expr_type: Some(ExprType::AggregateUdfExpr(Box::new(
+ protobuf::AggregateUdfExprNode {
+ fun_name: func.name().to_string(),
+ args: serialize_exprs(args, codec)?,
+ distinct: *distinct,
+ filter: match filter {
+ Some(e) =>
Some(Box::new(serialize_expr(e.as_ref(), codec)?)),
+ None => None,
},
- ))),
- }
+ order_by: match order_by {
+ Some(e) => serialize_exprs(e, codec)?,
+ None => vec![],
+ },
+ fun_definition: (!buf.is_empty()).then_some(buf),
+ },
+ ))),
}
- },
+ }
Expr::ScalarVariable(_, _) => {
return Err(Error::General(
diff --git a/datafusion/sql/src/unparser/expr.rs
b/datafusion/sql/src/unparser/expr.rs
index 9b44848a91..de130754ab 100644
--- a/datafusion/sql/src/unparser/expr.rs
+++ b/datafusion/sql/src/unparser/expr.rs
@@ -337,7 +337,7 @@ impl Unparser<'_> {
escape_char: escape_char.map(|c| c.to_string()),
}),
Expr::AggregateFunction(agg) => {
- let func_name = agg.func_def.name();
+ let func_name = agg.func.name();
let args = self.function_args_to_sql(&agg.args)?;
let filter = match &agg.filter {
diff --git a/datafusion/substrait/src/logical_plan/producer.rs
b/datafusion/substrait/src/logical_plan/producer.rs
index a782af8eb2..ee04749f5e 100644
--- a/datafusion/substrait/src/logical_plan/producer.rs
+++ b/datafusion/substrait/src/logical_plan/producer.rs
@@ -49,8 +49,7 @@ use datafusion::common::{
use datafusion::common::{substrait_err, DFSchemaRef};
#[allow(unused_imports)]
use datafusion::logical_expr::expr::{
- AggregateFunctionDefinition, Alias, BinaryExpr, Case, Cast, GroupingSet,
InList,
- InSubquery, Sort, WindowFunction,
+ Alias, BinaryExpr, Case, Cast, GroupingSet, InList, InSubquery, Sort,
WindowFunction,
};
use datafusion::logical_expr::{expr, Between, JoinConstraint, LogicalPlan,
Operator};
use datafusion::prelude::Expr;
@@ -764,9 +763,7 @@ pub fn to_substrait_agg_measure(
extensions: &mut Extensions,
) -> Result<Measure> {
match expr {
- Expr::AggregateFunction(expr::AggregateFunction { func_def, args,
distinct, filter, order_by, null_treatment: _, }) => {
- match func_def {
- AggregateFunctionDefinition::UDF(fun) => {
+ Expr::AggregateFunction(expr::AggregateFunction { func, args,
distinct, filter, order_by, null_treatment: _, }) => {
let sorts = if let Some(order_by) = order_by {
order_by.iter().map(|expr|
to_substrait_sort_field(ctx, expr, schema,
extensions)).collect::<Result<Vec<_>>>()?
} else {
@@ -776,7 +773,7 @@ pub fn to_substrait_agg_measure(
for arg in args {
arguments.push(FunctionArgument { arg_type:
Some(ArgType::Value(to_substrait_rex(ctx, arg, schema, 0, extensions)?)) });
}
- let function_anchor =
extensions.register_function(fun.name().to_string());
+ let function_anchor =
extensions.register_function(func.name().to_string());
Ok(Measure {
measure: Some(AggregateFunction {
function_reference: function_anchor,
@@ -796,8 +793,6 @@ pub fn to_substrait_agg_measure(
None => None
}
})
- }
- }
}
Expr::Alias(Alias{expr,..})=> {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]