reifydb_catalog/store/namespace/
find.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use reifydb_core::{
5	interface::{NamespaceDef, NamespaceId, NamespaceKey, QueryTransaction},
6	value::encoded::EncodedValues,
7};
8
9use crate::{
10	CatalogStore,
11	store::namespace::{convert_namespace, layout::namespace},
12};
13
14impl CatalogStore {
15	pub async fn find_namespace_by_name(
16		rx: &mut impl QueryTransaction,
17		name: impl AsRef<str>,
18	) -> crate::Result<Option<NamespaceDef>> {
19		let name = name.as_ref();
20
21		// Special case for system namespace - hardcoded with fixed ID
22		if name == "system" {
23			return Ok(Some(NamespaceDef::system()));
24		}
25
26		let batch = rx.range(NamespaceKey::full_scan()).await?;
27		Ok(batch.items.iter().find_map(|multi| {
28			let row: &EncodedValues = &multi.values;
29			let namespace_name = namespace::LAYOUT.get_utf8(row, namespace::NAME);
30			if name == namespace_name {
31				Some(convert_namespace(multi.clone()))
32			} else {
33				None
34			}
35		}))
36	}
37
38	pub async fn find_namespace(
39		rx: &mut impl QueryTransaction,
40		id: NamespaceId,
41	) -> crate::Result<Option<NamespaceDef>> {
42		// Special case for system namespace - hardcoded with fixed ID
43		if id == NamespaceId(1) {
44			return Ok(Some(NamespaceDef::system()));
45		}
46
47		Ok(rx.get(&NamespaceKey::encoded(id)).await?.map(convert_namespace))
48	}
49}
50
51#[cfg(test)]
52mod tests {
53	use reifydb_engine::test_utils::create_test_command_transaction;
54
55	use crate::{CatalogStore, store::namespace::NamespaceId, test_utils::create_namespace};
56
57	#[tokio::test]
58	async fn test_ok() {
59		let mut txn = create_test_command_transaction().await;
60
61		create_namespace(&mut txn, "test_namespace").await;
62
63		let namespace =
64			CatalogStore::find_namespace_by_name(&mut txn, "test_namespace").await.unwrap().unwrap();
65
66		assert_eq!(namespace.id, NamespaceId(1025));
67		assert_eq!(namespace.name, "test_namespace");
68	}
69
70	#[tokio::test]
71	async fn test_empty() {
72		let mut txn = create_test_command_transaction().await;
73
74		let result = CatalogStore::find_namespace_by_name(&mut txn, "test_namespace").await.unwrap();
75
76		assert_eq!(result, None);
77	}
78
79	#[tokio::test]
80	async fn test_not_found() {
81		let mut txn = create_test_command_transaction().await;
82
83		create_namespace(&mut txn, "another_namespace").await;
84
85		let result = CatalogStore::find_namespace_by_name(&mut txn, "test_namespace").await.unwrap();
86		assert_eq!(result, None);
87	}
88}