use std::any::Any;
use vortex_session::ArcSwapMap;
use vortex_session::SessionExt;
use vortex_session::SessionGuard;
use vortex_session::SessionVar;
use vortex_session::registry::Id;
use crate::layouts::indexed::index::IndexId;
use crate::layouts::indexed::index::IndexVTableRef;
type IndexRegistry = ArcSwapMap<Id, IndexVTableRef>;
#[derive(Clone, Debug, Default)]
pub struct IndexSession {
registry: IndexRegistry,
}
impl IndexSession {
pub fn register(&self, index: IndexVTableRef) {
self.registry.insert(index.id(), index);
}
pub fn find(&self, id: &IndexId) -> Option<IndexVTableRef> {
self.registry.get(id)
}
pub fn registry(&self) -> &IndexRegistry {
&self.registry
}
}
impl SessionVar for IndexSession {
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
pub trait IndexSessionExt: SessionExt {
fn indexes(&self) -> SessionGuard<'_, IndexSession> {
self.get::<IndexSession>()
}
}
impl<S: SessionExt> IndexSessionExt for S {}