common_function/scalars/
math.rs1pub mod clamp;
16mod modulo;
17mod rate;
18
19use std::fmt;
20
21pub use clamp::{ClampFunction, ClampMaxFunction, ClampMinFunction};
22use datafusion::arrow::datatypes::DataType;
23use datafusion::error::DataFusionError;
24use datafusion::logical_expr::ColumnarValue;
25use datafusion_common::internal_err;
26use datafusion_expr::{ScalarFunctionArgs, Signature, Volatility};
27
28use crate::function::Function;
29use crate::function_registry::FunctionRegistry;
30use crate::scalars::math::modulo::ModuloFunction;
31use crate::scalars::math::rate::RateFunction;
32
33pub(crate) struct MathFunction;
34
35impl MathFunction {
36 pub fn register(registry: &FunctionRegistry) {
37 registry.register_scalar(ModuloFunction::default());
38 registry.register_scalar(RateFunction::default());
39 registry.register_scalar(RangeFunction::default());
40 registry.register_scalar(ClampFunction::default());
41 registry.register_scalar(ClampMinFunction::default());
42 registry.register_scalar(ClampMaxFunction::default());
43 }
44}
45
46#[derive(Clone, Debug)]
49struct RangeFunction {
50 signature: Signature,
51}
52
53impl fmt::Display for RangeFunction {
54 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
55 write!(f, "RANGE_FN")
56 }
57}
58
59impl Default for RangeFunction {
60 fn default() -> Self {
61 Self {
62 signature: Signature::variadic_any(Volatility::Immutable),
63 }
64 }
65}
66
67impl Function for RangeFunction {
68 fn name(&self) -> &str {
69 "range_fn"
70 }
71
72 fn return_type(&self, input_types: &[DataType]) -> datafusion_common::Result<DataType> {
74 input_types
75 .first()
76 .cloned()
77 .ok_or(DataFusionError::Internal(
78 "No expr found in range_fn".into(),
79 ))
80 }
81
82 fn signature(&self) -> &Signature {
85 &self.signature
86 }
87
88 fn invoke_with_args(&self, _: ScalarFunctionArgs) -> datafusion_common::Result<ColumnarValue> {
89 internal_err!("not expected to invoke 'range_fn' directly")
90 }
91}