common_function/
function.rs1use std::fmt;
16use std::sync::Arc;
17
18use common_error::ext::{BoxedError, PlainError};
19use common_error::status_code::StatusCode;
20use common_query::error::{ExecuteSnafu, Result};
21use datafusion::arrow::datatypes::DataType;
22use datafusion::logical_expr::ColumnarValue;
23use datafusion_expr::{ScalarFunctionArgs, Signature};
24use datatypes::vectors::VectorRef;
25use session::context::{QueryContextBuilder, QueryContextRef};
26use snafu::ResultExt;
27
28use crate::state::FunctionState;
29
30#[derive(Clone)]
32pub struct FunctionContext {
33 pub query_ctx: QueryContextRef,
34 pub state: Arc<FunctionState>,
35}
36
37impl FunctionContext {
38 #[cfg(any(test, feature = "testing"))]
40 pub fn mock() -> Self {
41 Self {
42 query_ctx: QueryContextBuilder::default().build().into(),
43 state: Arc::new(FunctionState::mock()),
44 }
45 }
46}
47
48impl std::fmt::Display for FunctionContext {
49 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50 write!(f, "FunctionContext {{ query_ctx: {} }}", self.query_ctx)
51 }
52}
53
54impl Default for FunctionContext {
55 fn default() -> Self {
56 Self {
57 query_ctx: QueryContextBuilder::default().build().into(),
58 state: Arc::new(FunctionState::default()),
59 }
60 }
61}
62
63pub trait Function: fmt::Display + Sync + Send {
66 fn name(&self) -> &str;
68
69 fn return_type(&self, input_types: &[DataType]) -> Result<DataType>;
71
72 fn signature(&self) -> Signature;
74
75 fn invoke_with_args(
76 &self,
77 args: ScalarFunctionArgs,
78 ) -> datafusion_common::Result<ColumnarValue> {
79 let _ = args;
81 Err(datafusion_common::DataFusionError::NotImplemented(
82 "invoke_with_args".to_string(),
83 ))
84 }
85
86 fn eval(&self, _: &FunctionContext, _: &[VectorRef]) -> Result<VectorRef> {
89 Err(BoxedError::new(PlainError::new(
90 "unsupported".to_string(),
91 StatusCode::Unsupported,
92 )))
93 .context(ExecuteSnafu)
94 }
95
96 fn aliases(&self) -> &[String] {
97 &[]
98 }
99}
100
101pub type FunctionRef = Arc<dyn Function>;