-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Description
Is your feature request related to a problem or challenge?
While reviewing #9869 from @tinfoil-knight I was confused about the ScalarUDFImpl::monotonicity API
// This function specifies monotonicity behaviors for User defined scalar functions.
fn monotonicity(&self) -> Result<Option<Vec<Option<bool>>>, DataFusionError> {..}The challenge is the cognative complexity of understanding what Result<Option<Vec<Option<bool>>> means
The actual code is defined in terms FuncMonotonicity https://github.com/apache/arrow-datafusion/blob/57c0bc65280c467ef6f5a498c6e78a616401b286/datafusion/expr/src/signature.rs#L350-L356
However, since it is a typedef it doesn't show up in the Rust docs
Describe the solution you'd like
An easy to understand Monotonicity API
Describe alternatives you've considered
I think it would be great to have an API like this:
// This function specifies monotonicity behaviors for User defined scalar functions.
fn monotonicity(&self) -> Result<Monotonicity>, DataFusionError> {..}And then we could make Monotonicity an enum that captured the relevant data. This would both be easier to understand and likely more efficient as well
Something like
/// Monotonicity of a function with respect to its arguments.
///
/// A function is [monotonic] if it preserves the relative order of its inputs.
///
/// [monotonic]: https://en.wikipedia.org/wiki/Monotonic_function
pub enum Monotonicity {
/// not monotonic or unknown monotonicity
None,
/// Increasing with respect to all of its arguments
Increasing,
/// Decreasing with respect to all of its arguments
Decreasing,
/// 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.
Mixed(Vec<bool>),
}I think this would be much eaiser to reason about
Additional context
No response