reifydb-catalog 0.4.13

Database catalog and metadata management for ReifyDB
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2025 ReifyDB

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());
	}
}