use super::{materialize_metadata, resolve_table_name, table_not_found, SchemaPublicationContext};
use uqa_sql::ast::TableKeyConstraint;
use uqa_storage::{StorageBackendError, StorageBackendResult};
pub fn append_key_constraint(
context: &SchemaPublicationContext<'_>,
table: &str,
constraint: &TableKeyConstraint,
) -> StorageBackendResult<()> {
let table_name = resolve_table_name(context.catalog, table)?;
let state = context
.catalog
.table_state(&table_name)?
.ok_or_else(|| table_not_found(&table_name))?;
let mut key_constraints = state.key_constraints();
key_constraints.push(constraint.clone());
let mut columns = state.columns();
uqa_sql::schema::keys::apply_primary_key_columns(&table_name, constraint, &mut columns)
.map_err(StorageBackendError::Other)?;
let mut constraints = state.constraints();
constraints.key_constraints = key_constraints;
materialize_metadata(context, &table_name, &mut columns, &mut constraints)?;
let indexes = crate::schema::indexes::registry::prepare_constraint_indexes(
&context.indexes,
&table_name,
state.object_id(),
&mut columns,
&mut constraints,
)?;
let state = super::current_table_state(context.catalog, &table_name, state.as_ref())?;
state.persist_candidate(&columns, &constraints)?;
state.publish_constraints(columns, constraints);
indexes.publish(&context.indexes)?;
state.refresh_value_indexes()?;
Ok(())
}