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