Skip to main content

vortex_layout/
session.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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::indexed::Indexed;
18use crate::layouts::list::List;
19use crate::layouts::struct_::Struct;
20use crate::layouts::zoned::LegacyStats;
21use crate::layouts::zoned::Zoned;
22
23/// Registry of layout encodings.
24pub type LayoutRegistry = ArcSwapMap<Id, LayoutEncodingRef>;
25
26/// Session state for layout encodings.
27#[derive(Clone, Debug)]
28pub struct LayoutSession {
29    registry: LayoutRegistry,
30}
31
32impl LayoutSession {
33    /// Register a layout encoding in the session, replacing any existing encoding with the same ID.
34    pub fn register(&self, layout_ref: impl Into<LayoutEncodingRef>) {
35        let layout = layout_ref.into();
36        self.registry.insert(layout.id(), layout);
37    }
38
39    /// Register layout encodings in the session, replacing any existing encodings with the same IDs.
40    pub fn register_many(&self, layouts: impl IntoIterator<Item = LayoutEncodingRef>) {
41        for layout in layouts {
42            self.registry.insert(layout.id(), layout);
43        }
44    }
45
46    /// Returns the layout encoding registry.
47    pub fn registry(&self) -> &LayoutRegistry {
48        &self.registry
49    }
50}
51
52impl Default for LayoutSession {
53    fn default() -> Self {
54        let this = Self {
55            registry: LayoutRegistry::default(),
56        };
57
58        // Register the built-in layout encodings.
59        this.register(&Chunked as &dyn LayoutEncoding);
60        this.register(&Flat as &dyn LayoutEncoding);
61        this.register(&Struct as &dyn LayoutEncoding);
62        this.register(&Zoned as &dyn LayoutEncoding);
63        this.register(&LegacyStats as &dyn LayoutEncoding);
64        this.register(&Dict as &dyn LayoutEncoding);
65        this.register(&List as &dyn LayoutEncoding);
66        this.register(&Indexed as &dyn LayoutEncoding);
67        this
68    }
69}
70
71impl SessionVar for LayoutSession {
72    fn as_any(&self) -> &dyn Any {
73        self
74    }
75    fn as_any_mut(&mut self) -> &mut dyn Any {
76        self
77    }
78}
79
80/// Extension trait for accessing layout session data.
81pub trait LayoutSessionExt: SessionExt {
82    /// Returns the layout encoding registry.
83    fn layouts(&self) -> SessionGuard<'_, LayoutSession> {
84        self.get::<LayoutSession>()
85    }
86}
87impl<S: SessionExt> LayoutSessionExt for S {}