reifydb-catalog 0.4.12

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

use reifydb_core::{
	encoded::row::EncodedRow,
	interface::catalog::{id::NamespaceId, namespace::Namespace},
	key::namespace::NamespaceKey,
};
use reifydb_transaction::transaction::Transaction;

use crate::{
	CatalogStore, Result,
	store::namespace::{convert_namespace, shape::namespace},
};

impl CatalogStore {
	pub(crate) fn find_namespace_by_name(
		rx: &mut Transaction<'_>,
		name: impl AsRef<str>,
	) -> Result<Option<Namespace>> {
		let name = name.as_ref();

		// Special case for system namespace - hardcoded with fixed ID
		if name == "system" {
			return Ok(Some(Namespace::system()));
		}

		if name == "default" {
			return Ok(Some(Namespace::default_namespace()));
		}

		let stream = rx.range(NamespaceKey::full_scan(), 1024)?;

		for entry in stream {
			let multi = entry?;
			let row: &EncodedRow = &multi.row;
			let namespace_name = namespace::SHAPE.get_utf8(row, namespace::NAME);
			if name == namespace_name {
				return Ok(Some(convert_namespace(multi)));
			}
		}

		Ok(None)
	}

	pub(crate) fn find_namespace(rx: &mut Transaction<'_>, id: NamespaceId) -> Result<Option<Namespace>> {
		// Special case for system namespace - hardcoded with fixed ID
		if id == NamespaceId::SYSTEM {
			return Ok(Some(Namespace::system()));
		}

		if id == NamespaceId::DEFAULT {
			return Ok(Some(Namespace::default_namespace()));
		}

		Ok(rx.get(&NamespaceKey::encoded(id))?.map(convert_namespace))
	}
}

#[cfg(test)]
pub mod tests {
	use reifydb_engine::test_harness::create_test_admin_transaction;
	use reifydb_transaction::transaction::Transaction;

	use crate::{CatalogStore, store::namespace::NamespaceId, test_utils::create_namespace};

	#[test]
	fn test_ok() {
		let mut txn = create_test_admin_transaction();

		create_namespace(&mut txn, "test_namespace");

		let namespace =
			CatalogStore::find_namespace_by_name(&mut Transaction::Admin(&mut txn), "test_namespace")
				.unwrap()
				.unwrap();

		assert_eq!(namespace.id(), NamespaceId(16385));
		assert_eq!(namespace.name(), "test_namespace");
	}

	#[test]
	fn test_empty() {
		let mut txn = create_test_admin_transaction();

		let result = CatalogStore::find_namespace_by_name(&mut Transaction::Admin(&mut txn), "test_namespace")
			.unwrap();

		assert_eq!(result, None);
	}

	#[test]
	fn test_not_found() {
		let mut txn = create_test_admin_transaction();

		create_namespace(&mut txn, "another_namespace");

		let result = CatalogStore::find_namespace_by_name(&mut Transaction::Admin(&mut txn), "test_namespace")
			.unwrap();
		assert_eq!(result, None);
	}
}