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;