use crate::ast::{SchemaDocument, View};
use crate::catalog::{Catalog, CatalogRelation, RelationKind};
use crate::error::HolocronError;
use crate::resolve::scope::Scope;
use crate::resolve::select::resolve_columns;
pub fn resolve_views(
mut catalog: Catalog,
document: &SchemaDocument,
) -> Result<Catalog, Vec<HolocronError>> {
let mut errors = Vec::new();
for view in &document.views {
match resolve_view(view, &catalog) {
Ok(relation) => {
if let Err(error) = catalog.insert_relation(relation, view.name.span) {
errors.push(error);
}
}
Err(error) => errors.push(error),
}
}
if errors.is_empty() {
Ok(catalog)
} else {
Err(errors)
}
}
fn resolve_view(view: &View, catalog: &Catalog) -> Result<CatalogRelation, HolocronError> {
let scope = Scope::build(view, catalog)?;
let columns = resolve_columns(view, &scope)?;
Ok(CatalogRelation {
name: view.name.value.clone(),
kind: RelationKind::View,
columns,
})
}