common_function/
function_factory.rs1use std::sync::Arc;
16
17use datafusion_expr::ScalarUDF;
18
19use crate::function::{FunctionContext, FunctionRef};
20use crate::scalars::udf::create_udf;
21
22#[derive(Clone)]
24pub struct ScalarFunctionFactory {
25 name: String,
26 factory: Arc<dyn Fn(FunctionContext) -> ScalarUDF + Send + Sync>,
27}
28
29impl ScalarFunctionFactory {
30 pub fn name(&self) -> &str {
32 &self.name
33 }
34
35 pub fn provide(&self, ctx: FunctionContext) -> ScalarUDF {
37 (self.factory)(ctx)
38 }
39}
40
41impl From<ScalarUDF> for ScalarFunctionFactory {
42 fn from(df_udf: ScalarUDF) -> Self {
43 let name = df_udf.name().to_string();
44 let func = Arc::new(move |_ctx| df_udf.clone());
45 Self {
46 name,
47 factory: func,
48 }
49 }
50}
51
52impl From<FunctionRef> for ScalarFunctionFactory {
53 fn from(func: FunctionRef) -> Self {
54 let name = func.name().to_string();
55 let func = Arc::new(move |ctx: FunctionContext| {
56 create_udf(func.clone(), ctx.query_ctx, ctx.state)
57 });
58 Self {
59 name,
60 factory: func,
61 }
62 }
63}