1use std::any::Any;
5
6use vortex_session::ArcSwapMap;
7use vortex_session::SessionExt;
8use vortex_session::SessionGuard;
9use vortex_session::SessionVar;
10use vortex_session::registry::Id;
11
12use crate::LayoutEncoding;
13use crate::LayoutEncodingRef;
14use crate::layouts::chunked::Chunked;
15use crate::layouts::dict::Dict;
16use crate::layouts::flat::Flat;
17use crate::layouts::list::List;
18use crate::layouts::struct_::Struct;
19use crate::layouts::zoned::LegacyStats;
20use crate::layouts::zoned::Zoned;
21
22pub type LayoutRegistry = ArcSwapMap<Id, LayoutEncodingRef>;
24
25#[derive(Clone, Debug)]
27pub struct LayoutSession {
28 registry: LayoutRegistry,
29}
30
31impl LayoutSession {
32 pub fn register(&self, layout_ref: impl Into<LayoutEncodingRef>) {
34 let layout = layout_ref.into();
35 self.registry.insert(layout.id(), layout);
36 }
37
38 pub fn register_many(&self, layouts: impl IntoIterator<Item = LayoutEncodingRef>) {
40 for layout in layouts {
41 self.registry.insert(layout.id(), layout);
42 }
43 }
44
45 pub fn registry(&self) -> &LayoutRegistry {
47 &self.registry
48 }
49}
50
51impl Default for LayoutSession {
52 fn default() -> Self {
53 let this = Self {
54 registry: LayoutRegistry::default(),
55 };
56
57 this.register(&Chunked as &dyn LayoutEncoding);
59 this.register(&Flat as &dyn LayoutEncoding);
60 this.register(&Struct as &dyn LayoutEncoding);
61 this.register(&Zoned as &dyn LayoutEncoding);
62 this.register(&LegacyStats as &dyn LayoutEncoding);
63 this.register(&Dict as &dyn LayoutEncoding);
64 this.register(&List as &dyn LayoutEncoding);
65 this
66 }
67}
68
69impl SessionVar for LayoutSession {
70 fn as_any(&self) -> &dyn Any {
71 self
72 }
73 fn as_any_mut(&mut self) -> &mut dyn Any {
74 self
75 }
76}
77
78pub trait LayoutSessionExt: SessionExt {
80 fn layouts(&self) -> SessionGuard<'_, LayoutSession> {
82 self.get::<LayoutSession>()
83 }
84}
85impl<S: SessionExt> LayoutSessionExt for S {}