use reifydb_core::{
interface::catalog::id::{PrimaryKeyId, ViewId},
key::view::ViewKey,
return_internal_error,
};
use reifydb_transaction::transaction::admin::AdminTransaction;
use crate::{CatalogStore, Result, store::view::shape::view};
impl CatalogStore {
pub(crate) fn set_view_primary_key(
txn: &mut AdminTransaction,
view_id: ViewId,
primary_key_id: PrimaryKeyId,
) -> Result<()> {
let multi = match txn.get(&ViewKey::encoded(view_id))? {
Some(v) => v,
None => return_internal_error!(format!(
"View with ID {} not found when setting primary key. This indicates a critical catalog inconsistency.",
view_id.0
)),
};
let mut updated_row = multi.row.clone();
view::SHAPE.set_u64(&mut updated_row, view::PRIMARY_KEY, primary_key_id.0);
txn.set(&ViewKey::encoded(view_id), updated_row)?;
Ok(())
}
}
#[cfg(test)]
pub mod tests {
use reifydb_core::interface::catalog::id::{PrimaryKeyId, ViewId};
use reifydb_engine::test_harness::create_test_admin_transaction;
use reifydb_type::{
fragment::Fragment,
value::{constraint::TypeConstraint, r#type::Type},
};
use crate::{
CatalogStore,
store::view::create::{ViewColumnToCreate, ViewStorageConfig, ViewToCreate},
test_utils::ensure_test_namespace,
};
#[test]
fn test_set_view_primary_key() {
let mut txn = create_test_admin_transaction();
let namespace = ensure_test_namespace(&mut txn);
let view = CatalogStore::create_deferred_view(
&mut txn,
ViewToCreate {
name: Fragment::internal("test_view"),
namespace: namespace.id(),
columns: vec![ViewColumnToCreate {
name: Fragment::internal("id"),
fragment: Fragment::None,
constraint: TypeConstraint::unconstrained(Type::Uint8),
}],
storage: ViewStorageConfig::default(),
},
)
.unwrap();
CatalogStore::set_view_primary_key(&mut txn, view.id(), PrimaryKeyId(42)).unwrap();
}
#[test]
fn test_set_view_primary_key_nonexistent() {
let mut txn = create_test_admin_transaction();
let result = CatalogStore::set_view_primary_key(&mut txn, ViewId(999), PrimaryKeyId(1));
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.to_string().contains("View with ID 999 not found"));
assert!(err.to_string().contains("critical catalog inconsistency"));
}
}