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::struct_::StructLayoutEncoding;
16use crate::layouts::zoned::LegacyStatsLayoutEncoding;
17use crate::layouts::zoned::ZonedLayoutEncoding;
18
19pub type LayoutRegistry = Registry<LayoutEncodingRef>;
20
21#[derive(Clone, Debug)]
23pub struct LayoutSession {
24 registry: LayoutRegistry,
25}
26
27impl LayoutSession {
28 pub fn register(&self, layout: LayoutEncodingRef) {
30 self.registry.register(layout.id(), layout);
31 }
32
33 pub fn register_many(&self, layouts: impl IntoIterator<Item = LayoutEncodingRef>) {
35 for layout in layouts {
36 self.registry.register(layout.id(), layout);
37 }
38 }
39
40 pub fn registry(&self) -> &LayoutRegistry {
42 &self.registry
43 }
44}
45
46impl Default for LayoutSession {
47 fn default() -> Self {
48 let layouts = LayoutRegistry::default();
49
50 layouts.register(ChunkedLayoutEncoding.id(), ChunkedLayoutEncoding.as_ref());
52 layouts.register(FlatLayoutEncoding.id(), FlatLayoutEncoding.as_ref());
53 layouts.register(StructLayoutEncoding.id(), StructLayoutEncoding.as_ref());
54 layouts.register(ZonedLayoutEncoding.id(), ZonedLayoutEncoding.as_ref());
55 layouts.register(
56 LegacyStatsLayoutEncoding.id(),
57 LegacyStatsLayoutEncoding.as_ref(),
58 );
59 layouts.register(DictLayoutEncoding.id(), DictLayoutEncoding.as_ref());
60
61 Self { registry: layouts }
62 }
63}
64
65impl SessionVar for LayoutSession {
66 fn as_any(&self) -> &dyn Any {
67 self
68 }
69 fn as_any_mut(&mut self) -> &mut dyn Any {
70 self
71 }
72}
73
74pub trait LayoutSessionExt: SessionExt {
76 fn layouts(&self) -> SessionGuard<'_, LayoutSession> {
78 self.get::<LayoutSession>()
79 }
80}
81impl<S: SessionExt> LayoutSessionExt for S {}