vortex_array/session/
mod.rs1use vortex_session::Ref;
5use vortex_session::SessionExt;
6use vortex_session::registry::Registry;
7
8use crate::arrays::BoolMaskedValidityRule;
9use crate::arrays::BoolVTable;
10use crate::arrays::ChunkedVTable;
11use crate::arrays::ConstantVTable;
12use crate::arrays::DecimalMaskedValidityRule;
13use crate::arrays::DecimalVTable;
14use crate::arrays::ExtensionVTable;
15use crate::arrays::FixedSizeListVTable;
16use crate::arrays::ListVTable;
17use crate::arrays::ListViewVTable;
18use crate::arrays::MaskedVTable;
19use crate::arrays::NullVTable;
20use crate::arrays::PrimitiveMaskedValidityRule;
21use crate::arrays::PrimitiveVTable;
22use crate::arrays::StructVTable;
23use crate::arrays::VarBinVTable;
24use crate::arrays::VarBinViewVTable;
25use crate::optimizer::ArrayOptimizer;
26use crate::scalar_fns::cast::array::CastArrayReduce;
27use crate::vtable::ArrayVTable;
28use crate::vtable::ArrayVTableExt;
29
30pub type ArrayRegistry = Registry<ArrayVTable>;
31
32#[derive(Debug)]
33pub struct ArraySession {
34 registry: ArrayRegistry,
36
37 optimizer: ArrayOptimizer,
39}
40
41impl ArraySession {
42 pub fn registry(&self) -> &ArrayRegistry {
43 &self.registry
44 }
45
46 pub fn optimizer(&self) -> &ArrayOptimizer {
47 &self.optimizer
48 }
49
50 pub fn optimizer_mut(&mut self) -> &mut ArrayOptimizer {
51 &mut self.optimizer
52 }
53
54 pub fn register(&self, encoding: ArrayVTable) {
56 self.registry.register(encoding)
57 }
58
59 pub fn register_many(&self, encodings: impl IntoIterator<Item = ArrayVTable>) {
61 self.registry.register_many(encodings);
62 }
63}
64
65impl Default for ArraySession {
66 fn default() -> Self {
67 let encodings = ArrayRegistry::default();
68
69 encodings.register_many([
71 NullVTable.as_vtable(),
72 BoolVTable.as_vtable(),
73 PrimitiveVTable.as_vtable(),
74 DecimalVTable.as_vtable(),
75 VarBinViewVTable.as_vtable(),
76 ListViewVTable.as_vtable(),
77 FixedSizeListVTable.as_vtable(),
78 StructVTable.as_vtable(),
79 ExtensionVTable.as_vtable(),
80 ]);
81
82 encodings.register_many([
84 ChunkedVTable.as_vtable(),
85 ConstantVTable.as_vtable(),
86 MaskedVTable.as_vtable(),
87 ListVTable.as_vtable(),
88 VarBinVTable.as_vtable(),
89 ]);
90
91 let mut session = Self {
92 registry: encodings,
93 optimizer: ArrayOptimizer::default(),
94 };
95
96 let optimizer = session.optimizer_mut();
97 optimizer.register_parent_rule(BoolMaskedValidityRule);
98 optimizer.register_parent_rule(PrimitiveMaskedValidityRule);
99 optimizer.register_parent_rule(DecimalMaskedValidityRule);
100
101 optimizer.register_reduce_rule(CastArrayReduce);
103
104 session
105 }
106}
107
108pub trait ArraySessionExt: SessionExt {
110 fn arrays(&self) -> Ref<'_, ArraySession> {
112 self.get::<ArraySession>()
113 }
114}
115
116impl<S: SessionExt> ArraySessionExt for S {}