1use std::any::Any;
5
6use vortex_session::SessionExt;
7use vortex_session::SessionGuard;
8use vortex_session::SessionVar;
9use vortex_session::registry::Registry;
10
11use crate::LayoutEncodingRef;
12use crate::layouts::chunked::ChunkedLayoutEncoding;
13use crate::layouts::dict::DictLayoutEncoding;
14use crate::layouts::flat::FlatLayoutEncoding;
15use crate::layouts::list::ListLayoutEncoding;
16use crate::layouts::struct_::StructLayoutEncoding;
17use crate::layouts::zoned::LegacyStatsLayoutEncoding;
18use crate::layouts::zoned::ZonedLayoutEncoding;
19
20pub type LayoutRegistry = Registry<LayoutEncodingRef>;
21
22#[derive(Clone, Debug)]
24pub struct LayoutSession {
25 registry: LayoutRegistry,
26}
27
28impl LayoutSession {
29 pub fn register(&self, layout: LayoutEncodingRef) {
31 self.registry.register(layout.id(), layout);
32 }
33
34 pub fn register_many(&self, layouts: impl IntoIterator<Item = LayoutEncodingRef>) {
36 for layout in layouts {
37 self.registry.register(layout.id(), layout);
38 }
39 }
40
41 pub fn registry(&self) -> &LayoutRegistry {
43 &self.registry
44 }
45}
46
47impl Default for LayoutSession {
48 fn default() -> Self {
49 let layouts = LayoutRegistry::default();
50
51 layouts.register(ChunkedLayoutEncoding.id(), ChunkedLayoutEncoding.as_ref());
53 layouts.register(FlatLayoutEncoding.id(), FlatLayoutEncoding.as_ref());
54 layouts.register(StructLayoutEncoding.id(), StructLayoutEncoding.as_ref());
55 layouts.register(ZonedLayoutEncoding.id(), ZonedLayoutEncoding.as_ref());
56 layouts.register(
57 LegacyStatsLayoutEncoding.id(),
58 LegacyStatsLayoutEncoding.as_ref(),
59 );
60 layouts.register(DictLayoutEncoding.id(), DictLayoutEncoding.as_ref());
61 layouts.register(ListLayoutEncoding.id(), ListLayoutEncoding.as_ref());
62
63 Self { registry: layouts }
64 }
65}
66
67impl SessionVar for LayoutSession {
68 fn as_any(&self) -> &dyn Any {
69 self
70 }
71 fn as_any_mut(&mut self) -> &mut dyn Any {
72 self
73 }
74}
75
76pub trait LayoutSessionExt: SessionExt {
78 fn layouts(&self) -> SessionGuard<'_, LayoutSession> {
80 self.get::<LayoutSession>()
81 }
82}
83impl<S: SessionExt> LayoutSessionExt for S {}