use nodedb_types::DatabaseId;
use crate::resolver::derived::open_subquery_relation;
use crate::types::{CollectionInfo, SqlCatalog, SqlCatalogError};
pub(crate) struct CteCatalog<'a> {
pub(crate) inner: &'a dyn SqlCatalog,
pub(crate) relations: Vec<(String, CollectionInfo)>,
}
impl<'a> CteCatalog<'a> {
pub(crate) fn open(inner: &'a dyn SqlCatalog, name: &str) -> Self {
Self {
inner,
relations: vec![(name.to_string(), open_subquery_relation(name))],
}
}
}
impl SqlCatalog for CteCatalog<'_> {
fn get_collection(
&self,
database_id: DatabaseId,
name: &str,
) -> std::result::Result<Option<CollectionInfo>, SqlCatalogError> {
if let Some((_, info)) = self.relations.iter().find(|(key, _)| key == name) {
return Ok(Some(info.clone()));
}
self.inner.get_collection(database_id, name)
}
}