use std::collections::{HashMap, HashSet};
use std::sync::Arc;
use smallvec::SmallVec;
use uqa_core::Value;
use uqa_sql::ast::{ColumnType, InternalColumnRef};
use uqa_sql::expr::RowLookup;
use uqa_sql::ResultRow;
use crate::physical::{ExecError, ExecResult};
mod batches;
mod materialization;
mod name_binding;
mod outer_scope;
mod owned_row;
mod physical_row;
mod physical_row_view;
mod row_lock_origins;
mod schema_composition;
mod schema_construction;
mod schema_layout;
mod schema_projection;
mod schema_remap;
pub use batches::Batch;
pub use owned_row::OwnedPhysicalRow;
use physical_row::RowFragment;
pub use physical_row::{PhysicalRow, RowProjectionValue};
pub use physical_row_view::PhysicalRowView;
use row_lock_origins::concat_lock_origins;
pub use row_lock_origins::RowLockOrigin;
#[cfg(test)]
mod tests;
pub const DEFAULT_BATCH_SIZE: usize = 1024;
const NULL_SLOT: usize = usize::MAX;
const INLINE_ROW_FRAGMENTS: usize = 7;
static NULL_VALUE: Value = Value::Null;
#[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>>,
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>>,
exact_unqualified_precedence: bool,
extra_ambiguous_unqualified: HashSet<Box<str>>,
extra_ambiguous_qualified: HashSet<ColumnIdentity>,
}
pub(crate) struct PhysicalLayout {
pub(crate) columns: Vec<String>,
pub(crate) identities: Vec<ColumnIdentity>,
pub(crate) types: Vec<Option<ColumnType>>,
pub(crate) slots: Vec<Option<usize>>,
pub(crate) physical_width: usize,
pub(crate) aliases: Vec<(ColumnIdentity, Option<usize>, Option<ColumnType>)>,
pub(crate) internal: Vec<(InternalColumnRef, Option<usize>, Option<ColumnType>)>,
pub(crate) score_sources: Vec<(Option<String>, InternalColumnRef)>,
pub(crate) wildcard_hidden: HashSet<usize>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RowSchema {
index: Arc<SchemaIndex>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum ProjectedSlot {
Input(Option<usize>),
Computed(usize),
}