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 4819e7a3e9 Minor: Move `Monotonicity` to `expr` crate (#7820)
4819e7a3e9 is described below

commit 4819e7a3e935c37d72557978ed76870d08288471
Author: Yongting You <[email protected]>
AuthorDate: Sun Oct 15 02:33:49 2023 -0700

    Minor: Move `Monotonicity` to `expr` crate (#7820)
    
    * move Monotonicity datafusion-physical-expr -> datafusion-expr
    
    * review comments
---
 datafusion/expr/src/built_in_function.rs        | 45 ++++++++++++++++++-
 datafusion/expr/src/lib.rs                      |  4 +-
 datafusion/expr/src/signature.rs                |  8 ++++
 datafusion/physical-expr/src/functions.rs       | 58 ++++---------------------
 datafusion/physical-expr/src/scalar_function.rs |  2 +-
 5 files changed, 64 insertions(+), 53 deletions(-)

diff --git a/datafusion/expr/src/built_in_function.rs 
b/datafusion/expr/src/built_in_function.rs
index 3ce573eaf1..991ad03220 100644
--- a/datafusion/expr/src/built_in_function.rs
+++ b/datafusion/expr/src/built_in_function.rs
@@ -21,8 +21,8 @@ use crate::nullif::SUPPORTED_NULLIF_TYPES;
 use crate::signature::TIMEZONE_WILDCARD;
 use crate::type_coercion::functions::data_types;
 use crate::{
-    conditional_expressions, struct_expressions, utils, Signature, 
TypeSignature,
-    Volatility,
+    conditional_expressions, struct_expressions, utils, FuncMonotonicity, 
Signature,
+    TypeSignature, Volatility,
 };
 use arrow::datatypes::{DataType, Field, Fields, IntervalUnit, TimeUnit};
 use datafusion_common::{internal_err, plan_err, DataFusionError, Result};
@@ -1283,6 +1283,47 @@ impl BuiltinScalarFunction {
             }
         }
     }
+
+    /// This function specifies monotonicity behaviors for built-in scalar 
functions.
+    /// The list can be extended, only mathematical and datetime functions are
+    /// considered for the initial implementation of this feature.
+    pub fn monotonicity(&self) -> Option<FuncMonotonicity> {
+        if matches!(
+            &self,
+            BuiltinScalarFunction::Atan
+                | BuiltinScalarFunction::Acosh
+                | BuiltinScalarFunction::Asinh
+                | BuiltinScalarFunction::Atanh
+                | BuiltinScalarFunction::Ceil
+                | BuiltinScalarFunction::Degrees
+                | BuiltinScalarFunction::Exp
+                | BuiltinScalarFunction::Factorial
+                | BuiltinScalarFunction::Floor
+                | BuiltinScalarFunction::Ln
+                | BuiltinScalarFunction::Log10
+                | BuiltinScalarFunction::Log2
+                | BuiltinScalarFunction::Radians
+                | BuiltinScalarFunction::Round
+                | BuiltinScalarFunction::Signum
+                | BuiltinScalarFunction::Sinh
+                | BuiltinScalarFunction::Sqrt
+                | BuiltinScalarFunction::Cbrt
+                | BuiltinScalarFunction::Tanh
+                | BuiltinScalarFunction::Trunc
+                | BuiltinScalarFunction::Pi
+        ) {
+            Some(vec![Some(true)])
+        } else if matches!(
+            &self,
+            BuiltinScalarFunction::DateTrunc | BuiltinScalarFunction::DateBin
+        ) {
+            Some(vec![None, Some(true)])
+        } else if *self == BuiltinScalarFunction::Log {
+            Some(vec![Some(true), Some(false)])
+        } else {
+            None
+        }
+    }
 }
 
 fn aliases(func: &BuiltinScalarFunction) -> &'static [&'static str] {
diff --git a/datafusion/expr/src/lib.rs b/datafusion/expr/src/lib.rs
index fee0bdf5c1..21c0d750a3 100644
--- a/datafusion/expr/src/lib.rs
+++ b/datafusion/expr/src/lib.rs
@@ -74,7 +74,9 @@ pub use logical_plan::*;
 pub use nullif::SUPPORTED_NULLIF_TYPES;
 pub use operator::Operator;
 pub use partition_evaluator::PartitionEvaluator;
-pub use signature::{Signature, TypeSignature, Volatility, TIMEZONE_WILDCARD};
+pub use signature::{
+    FuncMonotonicity, Signature, TypeSignature, Volatility, TIMEZONE_WILDCARD,
+};
 pub use table_source::{TableProviderFilterPushDown, TableSource, TableType};
 pub use udaf::AggregateUDF;
 pub use udf::ScalarUDF;
diff --git a/datafusion/expr/src/signature.rs b/datafusion/expr/src/signature.rs
index 0d732ee6e5..399aefc4b6 100644
--- a/datafusion/expr/src/signature.rs
+++ b/datafusion/expr/src/signature.rs
@@ -226,3 +226,11 @@ impl Signature {
         }
     }
 }
+
+/// Monotonicity of the `ScalarFunctionExpr` with respect to its arguments.
+/// Each element of this vector corresponds to an argument and indicates 
whether
+/// the function's behavior is monotonic, or non-monotonic/unknown for that 
argument, namely:
+/// - `None` signifies unknown monotonicity or non-monotonicity.
+/// - `Some(true)` indicates that the function is monotonically increasing 
w.r.t. the argument in question.
+/// - Some(false) indicates that the function is monotonically decreasing 
w.r.t. the argument in question.
+pub type FuncMonotonicity = Vec<Option<bool>>;
diff --git a/datafusion/physical-expr/src/functions.rs 
b/datafusion/physical-expr/src/functions.rs
index 5de0dc366b..e04a68615a 100644
--- a/datafusion/physical-expr/src/functions.rs
+++ b/datafusion/physical-expr/src/functions.rs
@@ -45,6 +45,7 @@ use arrow::{
     datatypes::{DataType, Int32Type, Int64Type, Schema},
 };
 use datafusion_common::{internal_err, DataFusionError, Result, ScalarValue};
+pub use datafusion_expr::FuncMonotonicity;
 use datafusion_expr::{
     BuiltinScalarFunction, ColumnarValue, ScalarFunctionImplementation,
 };
@@ -180,7 +181,7 @@ pub fn create_physical_expr(
         _ => create_physical_fun(fun, execution_props)?,
     };
 
-    let monotonicity = get_func_monotonicity(fun);
+    let monotonicity = fun.monotonicity();
 
     Ok(Arc::new(ScalarFunctionExpr::new(
         &format!("{fun}"),
@@ -903,13 +904,13 @@ pub fn create_physical_fun(
     })
 }
 
-/// Monotonicity of the `ScalarFunctionExpr` with respect to its arguments.
-/// Each element of this vector corresponds to an argument and indicates 
whether
-/// the function's behavior is monotonic, or non-monotonic/unknown for that 
argument, namely:
-/// - `None` signifies unknown monotonicity or non-monotonicity.
-/// - `Some(true)` indicates that the function is monotonically increasing 
w.r.t. the argument in question.
-/// - Some(false) indicates that the function is monotonically decreasing 
w.r.t. the argument in question.
-pub type FuncMonotonicity = Vec<Option<bool>>;
+#[deprecated(
+    since = "32.0.0",
+    note = "Moved to `expr` crate. Please use 
`BuiltinScalarFunction::monotonicity()` instead"
+)]
+pub fn get_func_monotonicity(fun: &BuiltinScalarFunction) -> 
Option<FuncMonotonicity> {
+    fun.monotonicity()
+}
 
 /// Determines a [`ScalarFunctionExpr`]'s monotonicity for the given arguments
 /// and the function's behavior depending on its arguments.
@@ -964,47 +965,6 @@ fn func_order_in_one_dimension(
     }
 }
 
-/// This function specifies monotonicity behaviors for built-in scalar 
functions.
-/// The list can be extended, only mathematical and datetime functions are
-/// considered for the initial implementation of this feature.
-pub fn get_func_monotonicity(fun: &BuiltinScalarFunction) -> 
Option<FuncMonotonicity> {
-    if matches!(
-        fun,
-        BuiltinScalarFunction::Atan
-            | BuiltinScalarFunction::Acosh
-            | BuiltinScalarFunction::Asinh
-            | BuiltinScalarFunction::Atanh
-            | BuiltinScalarFunction::Ceil
-            | BuiltinScalarFunction::Degrees
-            | BuiltinScalarFunction::Exp
-            | BuiltinScalarFunction::Factorial
-            | BuiltinScalarFunction::Floor
-            | BuiltinScalarFunction::Ln
-            | BuiltinScalarFunction::Log10
-            | BuiltinScalarFunction::Log2
-            | BuiltinScalarFunction::Radians
-            | BuiltinScalarFunction::Round
-            | BuiltinScalarFunction::Signum
-            | BuiltinScalarFunction::Sinh
-            | BuiltinScalarFunction::Sqrt
-            | BuiltinScalarFunction::Cbrt
-            | BuiltinScalarFunction::Tanh
-            | BuiltinScalarFunction::Trunc
-            | BuiltinScalarFunction::Pi
-    ) {
-        Some(vec![Some(true)])
-    } else if matches!(
-        fun,
-        BuiltinScalarFunction::DateTrunc | BuiltinScalarFunction::DateBin
-    ) {
-        Some(vec![None, Some(true)])
-    } else if *fun == BuiltinScalarFunction::Log {
-        Some(vec![Some(true), Some(false)])
-    } else {
-        None
-    }
-}
-
 #[cfg(test)]
 mod tests {
     use super::*;
diff --git a/datafusion/physical-expr/src/scalar_function.rs 
b/datafusion/physical-expr/src/scalar_function.rs
index 517553f90f..dc48baa23a 100644
--- a/datafusion/physical-expr/src/scalar_function.rs
+++ b/datafusion/physical-expr/src/scalar_function.rs
@@ -30,7 +30,6 @@
 //! to a function that supports f64, it is coerced to f64.
 
 use crate::functions::out_ordering;
-use crate::functions::FuncMonotonicity;
 use crate::physical_expr::down_cast_any_ref;
 use crate::sort_properties::SortProperties;
 use crate::utils::expr_list_eq_strict_order;
@@ -41,6 +40,7 @@ use datafusion_common::Result;
 use datafusion_expr::expr_vec_fmt;
 use datafusion_expr::BuiltinScalarFunction;
 use datafusion_expr::ColumnarValue;
+use datafusion_expr::FuncMonotonicity;
 use datafusion_expr::ScalarFunctionImplementation;
 use std::any::Any;
 use std::fmt::Debug;

Reply via email to