use reifydb_core::{
interface::catalog::{column::Column, id::ColumnId, shape::ShapeId},
key::column::ColumnKey,
};
use reifydb_transaction::transaction::Transaction;
use crate::{CatalogStore, Result, store::column::shape::primitive_column};
impl CatalogStore {
pub(crate) fn find_column_by_name(
rx: &mut Transaction<'_>,
shape: impl Into<ShapeId>,
column_name: &str,
) -> Result<Option<Column>> {
let mut stream = rx.range(ColumnKey::full_scan(shape), 1024)?;
let mut found_id = None;
for entry in stream.by_ref() {
let multi = entry?;
let row = multi.row;
let column = ColumnId(primitive_column::SHAPE.get_u64(&row, primitive_column::ID));
let name = primitive_column::SHAPE.get_utf8(&row, primitive_column::NAME);
if name == column_name {
found_id = Some(column);
break;
}
}
drop(stream);
if let Some(id) = found_id {
Ok(Some(Self::get_column(rx, id)?))
} else {
Ok(None)
}
}
}
#[cfg(test)]
pub mod tests {
use reifydb_core::interface::catalog::id::{ColumnId, TableId};
use reifydb_engine::test_harness::create_test_admin_transaction;
use reifydb_transaction::transaction::Transaction;
use reifydb_type::value::{constraint::TypeConstraint, r#type::Type};
use crate::{CatalogStore, test_utils::create_test_column};
#[test]
fn test_ok() {
let mut txn = create_test_admin_transaction();
create_test_column(&mut txn, "col_1", TypeConstraint::unconstrained(Type::Int1), vec![]);
create_test_column(&mut txn, "col_2", TypeConstraint::unconstrained(Type::Int2), vec![]);
create_test_column(&mut txn, "col_3", TypeConstraint::unconstrained(Type::Int4), vec![]);
let result = CatalogStore::find_column_by_name(&mut Transaction::Admin(&mut txn), TableId(1), "col_3")
.unwrap()
.unwrap();
assert_eq!(result.id, ColumnId(16387));
assert_eq!(result.name, "col_3");
assert_eq!(result.constraint.get_type(), Type::Int4);
assert_eq!(result.auto_increment, false);
}
#[test]
fn test_not_found() {
let mut txn = create_test_admin_transaction();
create_test_column(&mut txn, "col_1", TypeConstraint::unconstrained(Type::Int1), vec![]);
let result =
CatalogStore::find_column_by_name(&mut Transaction::Admin(&mut txn), TableId(1), "not_found")
.unwrap();
assert!(result.is_none());
}
}