common_function/
function.rs1use std::fmt;
16use std::sync::Arc;
17
18use common_query::error::Result;
19use common_query::prelude::Signature;
20use datatypes::data_type::ConcreteDataType;
21use datatypes::vectors::VectorRef;
22use session::context::{QueryContextBuilder, QueryContextRef};
23
24use crate::state::FunctionState;
25
26#[derive(Clone)]
28pub struct FunctionContext {
29 pub query_ctx: QueryContextRef,
30 pub state: Arc<FunctionState>,
31}
32
33impl FunctionContext {
34 #[cfg(any(test, feature = "testing"))]
36 pub fn mock() -> Self {
37 Self {
38 query_ctx: QueryContextBuilder::default().build().into(),
39 state: Arc::new(FunctionState::mock()),
40 }
41 }
42}
43
44impl Default for FunctionContext {
45 fn default() -> Self {
46 Self {
47 query_ctx: QueryContextBuilder::default().build().into(),
48 state: Arc::new(FunctionState::default()),
49 }
50 }
51}
52
53pub trait Function: fmt::Display + Sync + Send {
56 fn name(&self) -> &str;
58
59 fn return_type(&self, input_types: &[ConcreteDataType]) -> Result<ConcreteDataType>;
61
62 fn signature(&self) -> Signature;
64
65 fn eval(&self, ctx: &FunctionContext, columns: &[VectorRef]) -> Result<VectorRef>;
67}
68
69pub type FunctionRef = Arc<dyn Function>;
70
71#[async_trait::async_trait]
73pub trait AsyncFunction: fmt::Display + Sync + Send {
74 fn name(&self) -> &str;
76
77 fn return_type(&self, input_types: &[ConcreteDataType]) -> Result<ConcreteDataType>;
79
80 fn signature(&self) -> Signature;
82
83 async fn eval(&self, _func_ctx: FunctionContext, _columns: &[VectorRef]) -> Result<VectorRef>;
86}
87
88pub type AsyncFunctionRef = Arc<dyn AsyncFunction>;