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 std::fmt::Display for FunctionContext {
45 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46 write!(f, "FunctionContext {{ query_ctx: {} }}", self.query_ctx)
47 }
48}
49
50impl Default for FunctionContext {
51 fn default() -> Self {
52 Self {
53 query_ctx: QueryContextBuilder::default().build().into(),
54 state: Arc::new(FunctionState::default()),
55 }
56 }
57}
58
59pub trait Function: fmt::Display + Sync + Send {
62 fn name(&self) -> &str;
64
65 fn return_type(&self, input_types: &[ConcreteDataType]) -> Result<ConcreteDataType>;
67
68 fn signature(&self) -> Signature;
70
71 fn eval(&self, ctx: &FunctionContext, columns: &[VectorRef]) -> Result<VectorRef>;
73}
74
75pub type FunctionRef = Arc<dyn Function>;