use crate::ast::{ColumnType, InternalColumnRef};
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
mod name_binding;
mod open_columns;
mod outer_scope;
mod schema_composition;
mod schema_construction;
mod schema_layout;
mod schema_projection;
mod schema_remap;
const NULL_SLOT: usize = usize::MAX;
#[derive(Debug, thiserror::Error)]
#[error("{0}")]
pub struct SchemaLayoutError(pub String);
type SchemaLayoutResult<T> = Result<T, SchemaLayoutError>;
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ColumnIdentity {
qualifier: Option<Box<str>>,
column: Box<str>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
struct ScoreSource {
qualifier: Option<Box<str>>,
column: InternalColumnRef,
}
impl ColumnIdentity {
#[must_use]
pub fn unqualified(column: impl Into<String>) -> Self {
Self {
qualifier: None,
column: Box::<str>::from(column.into()),
}
}
#[must_use]
pub fn qualified(qualifier: impl Into<String>, column: impl Into<String>) -> Self {
Self {
qualifier: Some(Box::<str>::from(qualifier.into())),
column: Box::<str>::from(column.into()),
}
}
#[must_use]
pub fn qualifier(&self) -> Option<&str> {
self.qualifier.as_deref()
}
#[must_use]
pub fn column(&self) -> &str {
&self.column
}
}
#[derive(Debug, PartialEq, Eq)]
struct SchemaIndex {
columns: Box<[String]>,
identities: Box<[ColumnIdentity]>,
slots: Box<[usize]>,
physical_width: usize,
exact: HashMap<Box<str>, usize>,
unqualified: HashMap<Box<str>, usize>,
qualified: HashMap<ColumnIdentity, usize>,
aliases: HashMap<ColumnIdentity, usize>,
executor_attributes: HashMap<InternalColumnRef, usize>,
ambiguous_unqualified: HashSet<Box<str>>,
ambiguous_qualified: HashSet<ColumnIdentity>,
cold: Box<SchemaColdMetadata>,
}
#[derive(Debug, PartialEq, Eq)]
struct SchemaColdMetadata {
columns: Box<[Option<ColumnType>]>,
aliases: HashMap<ColumnIdentity, Option<ColumnType>>,
executor_attribute_types: HashMap<InternalColumnRef, Option<ColumnType>>,
score_sources: Vec<ScoreSource>,
wildcard_hidden: HashSet<usize>,
binding_only: HashMap<ColumnIdentity, Option<ColumnType>>,
open_qualifiers: HashSet<Option<Box<str>>>,
identity_layout: bool,
}
#[derive(Default)]
struct SchemaBuildMetadata {
aliases: HashMap<ColumnIdentity, usize>,
alias_types: HashMap<ColumnIdentity, Option<ColumnType>>,
internal: HashMap<InternalColumnRef, usize>,
internal_types: HashMap<InternalColumnRef, Option<ColumnType>>,
score_sources: Vec<ScoreSource>,
wildcard_hidden: HashSet<usize>,
binding_only: HashMap<ColumnIdentity, Option<ColumnType>>,
open_qualifiers: HashSet<Option<Box<str>>>,
exact_unqualified_precedence: bool,
extra_ambiguous_unqualified: HashSet<Box<str>>,
extra_ambiguous_qualified: HashSet<ColumnIdentity>,
}
pub struct PhysicalLayout {
pub columns: Vec<String>,
pub identities: Vec<ColumnIdentity>,
pub types: Vec<Option<ColumnType>>,
pub slots: Vec<Option<usize>>,
pub physical_width: usize,
pub aliases: Vec<(ColumnIdentity, Option<usize>, Option<ColumnType>)>,
pub internal: Vec<(InternalColumnRef, Option<usize>, Option<ColumnType>)>,
pub score_sources: Vec<(Option<String>, InternalColumnRef)>,
pub wildcard_hidden: HashSet<usize>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RowSchema {
index: Arc<SchemaIndex>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProjectedSlot {
Input(Option<usize>),
Computed(usize),
}
impl RowSchema {
#[doc(hidden)]
pub fn layout_slots(&self) -> &[usize] {
&self.index.slots
}
#[doc(hidden)]
pub fn is_identity_layout(&self) -> bool {
self.index.cold.identity_layout
}
}
pub mod join_output;
mod declarations;
pub use declarations::{SchemaBindingContext, SchemaExpressionCatalog};
pub mod generated;
pub mod indexes;
pub mod columns;
pub mod constraints;
pub mod defaults;
pub mod domains;
pub mod dependencies;
pub mod check_inheritance;
pub mod table_creation;
pub mod inheritance;
pub mod foreign_keys;
pub mod sequences;
pub mod constraint_metadata;
pub mod keys;
pub mod constraint_changes;
pub mod constraint_views;
pub mod table_alteration;
pub mod removal;
pub mod namespaces;
pub mod relation_alteration;
pub mod view_creation;
pub mod truncate;
pub mod foreign_tables;