common_function/scalars/
math.rs1pub mod clamp;
16mod modulo;
17mod rate;
18
19use std::fmt;
20
21pub use clamp::{ClampFunction, ClampMaxFunction, ClampMinFunction};
22use common_query::error::Result;
23use datafusion::arrow::datatypes::DataType;
24use datafusion::error::DataFusionError;
25use datafusion_expr::{Signature, Volatility};
26use datatypes::vectors::VectorRef;
27pub use rate::RateFunction;
28
29use crate::function::{Function, FunctionContext};
30use crate::function_registry::FunctionRegistry;
31use crate::scalars::math::modulo::ModuloFunction;
32
33pub(crate) struct MathFunction;
34
35impl MathFunction {
36 pub fn register(registry: &FunctionRegistry) {
37 registry.register_scalar(ModuloFunction);
38 registry.register_scalar(RateFunction);
39 registry.register_scalar(RangeFunction);
40 registry.register_scalar(ClampFunction);
41 registry.register_scalar(ClampMinFunction);
42 registry.register_scalar(ClampMaxFunction);
43 }
44}
45
46#[derive(Clone, Debug, Default)]
49struct RangeFunction;
50
51impl fmt::Display for RangeFunction {
52 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
53 write!(f, "RANGE_FN")
54 }
55}
56
57impl Function for RangeFunction {
58 fn name(&self) -> &str {
59 "range_fn"
60 }
61
62 fn return_type(&self, input_types: &[DataType]) -> Result<DataType> {
64 input_types
65 .first()
66 .cloned()
67 .ok_or(DataFusionError::Internal(
68 "No expr found in range_fn".into(),
69 ))
70 .map_err(Into::into)
71 }
72
73 fn signature(&self) -> Signature {
76 Signature::variadic_any(Volatility::Immutable)
77 }
78
79 fn eval(&self, _func_ctx: &FunctionContext, _columns: &[VectorRef]) -> Result<VectorRef> {
80 Err(DataFusionError::Internal(
81 "range_fn just a empty function used in range select, It should not be eval!".into(),
82 )
83 .into())
84 }
85}