This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new bbec7870e6 Minor: Make it easier to work with Expr::ScalarFunction 
(#8350)
bbec7870e6 is described below

commit bbec7870e69d130690690238e4b1d6bd49c31cac
Author: Andrew Lamb <[email protected]>
AuthorDate: Wed Nov 29 12:18:04 2023 -0500

    Minor: Make it easier to work with Expr::ScalarFunction (#8350)
---
 datafusion/core/src/physical_planner.rs           |  6 +++---
 datafusion/expr/src/expr.rs                       | 15 ++++++++++-----
 datafusion/substrait/src/logical_plan/producer.rs | 12 ++++++------
 3 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/datafusion/core/src/physical_planner.rs 
b/datafusion/core/src/physical_planner.rs
index e0f1201aea..ef364c22ee 100644
--- a/datafusion/core/src/physical_planner.rs
+++ b/datafusion/core/src/physical_planner.rs
@@ -217,13 +217,13 @@ fn create_physical_name(e: &Expr, is_first_expr: bool) -> 
Result<String> {
 
             Ok(name)
         }
-        Expr::ScalarFunction(expr::ScalarFunction { func_def, args }) => {
+        Expr::ScalarFunction(fun) => {
             // function should be resolved during `AnalyzerRule`s
-            if let ScalarFunctionDefinition::Name(_) = func_def {
+            if let ScalarFunctionDefinition::Name(_) = fun.func_def {
                 return internal_err!("Function `Expr` with name should be 
resolved.");
             }
 
-            create_function_physical_name(func_def.name(), false, args)
+            create_function_physical_name(fun.name(), false, &fun.args)
         }
         Expr::WindowFunction(WindowFunction { fun, args, .. }) => {
             create_function_physical_name(&fun.to_string(), false, args)
diff --git a/datafusion/expr/src/expr.rs b/datafusion/expr/src/expr.rs
index 13e488dac0..b46d204faa 100644
--- a/datafusion/expr/src/expr.rs
+++ b/datafusion/expr/src/expr.rs
@@ -362,6 +362,13 @@ pub struct ScalarFunction {
     pub args: Vec<Expr>,
 }
 
+impl ScalarFunction {
+    // return the Function's name
+    pub fn name(&self) -> &str {
+        self.func_def.name()
+    }
+}
+
 impl ScalarFunctionDefinition {
     /// Function's name for display
     pub fn name(&self) -> &str {
@@ -1219,8 +1226,8 @@ impl fmt::Display for Expr {
                     write!(f, " NULLS LAST")
                 }
             }
-            Expr::ScalarFunction(ScalarFunction { func_def, args }) => {
-                fmt_function(f, func_def.name(), false, args, true)
+            Expr::ScalarFunction(fun) => {
+                fmt_function(f, fun.name(), false, &fun.args, true)
             }
             Expr::WindowFunction(WindowFunction {
                 fun,
@@ -1552,9 +1559,7 @@ fn create_name(e: &Expr) -> Result<String> {
                 }
             }
         }
-        Expr::ScalarFunction(ScalarFunction { func_def, args }) => {
-            create_function_name(func_def.name(), false, args)
-        }
+        Expr::ScalarFunction(fun) => create_function_name(fun.name(), false, 
&fun.args),
         Expr::WindowFunction(WindowFunction {
             fun,
             args,
diff --git a/datafusion/substrait/src/logical_plan/producer.rs 
b/datafusion/substrait/src/logical_plan/producer.rs
index 95604e6d2d..2be3e7b4e8 100644
--- a/datafusion/substrait/src/logical_plan/producer.rs
+++ b/datafusion/substrait/src/logical_plan/producer.rs
@@ -33,8 +33,8 @@ use datafusion::common::{exec_err, internal_err, 
not_impl_err};
 #[allow(unused_imports)]
 use datafusion::logical_expr::aggregate_function;
 use datafusion::logical_expr::expr::{
-    Alias, BinaryExpr, Case, Cast, GroupingSet, InList,
-    ScalarFunction as DFScalarFunction, ScalarFunctionDefinition, Sort, 
WindowFunction,
+    Alias, BinaryExpr, Case, Cast, GroupingSet, InList, 
ScalarFunctionDefinition, Sort,
+    WindowFunction,
 };
 use datafusion::logical_expr::{expr, Between, JoinConstraint, LogicalPlan, 
Operator};
 use datafusion::prelude::Expr;
@@ -822,9 +822,9 @@ pub fn to_substrait_rex(
                 Ok(substrait_or_list)
             }
         }
-        Expr::ScalarFunction(DFScalarFunction { func_def, args }) => {
+        Expr::ScalarFunction(fun) => {
             let mut arguments: Vec<FunctionArgument> = vec![];
-            for arg in args {
+            for arg in &fun.args {
                 arguments.push(FunctionArgument {
                     arg_type: Some(ArgType::Value(to_substrait_rex(
                         arg,
@@ -836,12 +836,12 @@ pub fn to_substrait_rex(
             }
 
             // function should be resolved during `AnalyzerRule`
-            if let ScalarFunctionDefinition::Name(_) = func_def {
+            if let ScalarFunctionDefinition::Name(_) = fun.func_def {
                 return internal_err!("Function `Expr` with name should be 
resolved.");
             }
 
             let function_anchor =
-                _register_function(func_def.name().to_string(), 
extension_info);
+                _register_function(fun.name().to_string(), extension_info);
             Ok(Expression {
                 rex_type: Some(RexType::ScalarFunction(ScalarFunction {
                     function_reference: function_anchor,

Reply via email to