reifydb_catalog/store/namespace/
find.rs1use 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 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 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}