vortex_array/scalar_fn/
session.rs1use std::any::Any;
5use std::sync::Arc;
6
7use vortex_session::ArcSwapMap;
8use vortex_session::SessionExt;
9use vortex_session::SessionGuard;
10use vortex_session::SessionVar;
11use vortex_session::registry::Id;
12
13use crate::scalar_fn::ScalarFnPluginRef;
14use crate::scalar_fn::ScalarFnVTable;
15use crate::scalar_fn::fns::between::Between;
16use crate::scalar_fn::fns::binary::Binary;
17use crate::scalar_fn::fns::byte_length::ByteLength;
18use crate::scalar_fn::fns::cast::Cast;
19use crate::scalar_fn::fns::ext_storage::ExtStorage;
20use crate::scalar_fn::fns::fill_null::FillNull;
21use crate::scalar_fn::fns::get_item::GetItem;
22use crate::scalar_fn::fns::is_nan::IsNan;
23use crate::scalar_fn::fns::is_not_null::IsNotNull;
24use crate::scalar_fn::fns::is_null::IsNull;
25use crate::scalar_fn::fns::like::Like;
26use crate::scalar_fn::fns::list_contains::ListContains;
27use crate::scalar_fn::fns::list_length::ListLength;
28use crate::scalar_fn::fns::list_sum::ListSum;
29use crate::scalar_fn::fns::literal::Literal;
30use crate::scalar_fn::fns::mask::Mask;
31use crate::scalar_fn::fns::merge::Merge;
32use crate::scalar_fn::fns::not::Not;
33use crate::scalar_fn::fns::pack::Pack;
34use crate::scalar_fn::fns::select::Select;
35use crate::scalar_fn::fns::stat::StatFn;
36use crate::scalar_fn::fns::variant_get::VariantGet;
37use crate::scalar_fn::fns::zip::Zip;
38
39pub type ScalarFnRegistry = ArcSwapMap<Id, ScalarFnPluginRef>;
41
42#[derive(Clone, Debug)]
44pub struct ScalarFnSession {
45 registry: ScalarFnRegistry,
46}
47
48impl ScalarFnSession {
49 pub fn registry(&self) -> &ScalarFnRegistry {
50 &self.registry
51 }
52
53 pub fn register<V: ScalarFnVTable>(&self, vtable: V) {
55 self.registry
56 .insert(vtable.id(), Arc::new(vtable) as ScalarFnPluginRef);
57 }
58}
59
60impl Default for ScalarFnSession {
61 fn default() -> Self {
62 let this = Self {
63 registry: ScalarFnRegistry::default(),
64 };
65
66 this.register(Between);
68 this.register(Binary);
69 this.register(ByteLength);
70 this.register(Cast);
71 this.register(ExtStorage);
72 this.register(FillNull);
73 this.register(GetItem);
74 this.register(IsNan);
75 this.register(IsNotNull);
76 this.register(IsNull);
77 this.register(Like);
78 this.register(ListContains);
79 this.register(ListLength);
80 this.register(ListSum);
81 this.register(Literal);
82 this.register(Mask);
83 this.register(Merge);
84 this.register(Not);
85 this.register(Pack);
86 this.register(Select);
87 this.register(StatFn);
88 this.register(VariantGet);
89 this.register(Zip);
90
91 this
92 }
93}
94
95impl SessionVar for ScalarFnSession {
96 fn as_any(&self) -> &dyn Any {
97 self
98 }
99
100 fn as_any_mut(&mut self) -> &mut dyn Any {
101 self
102 }
103}
104
105pub trait ScalarFnSessionExt: SessionExt {
107 fn scalar_fns(&self) -> SessionGuard<'_, ScalarFnSession> {
109 self.get::<ScalarFnSession>()
110 }
111}
112impl<S: SessionExt> ScalarFnSessionExt for S {}