Skip to main content

reifydb_transaction/transaction/catalog/
namespace.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use reifydb_core::interface::catalog::{
5	change::CatalogTrackNamespaceChangeOperations, id::NamespaceId, namespace::Namespace,
6};
7use reifydb_value::Result;
8
9use crate::{
10	change::{
11		Change,
12		OperationType::{Create, Delete},
13		TransactionalNamespaceChanges,
14	},
15	transaction::admin::AdminTransaction,
16};
17
18impl CatalogTrackNamespaceChangeOperations for AdminTransaction {
19	fn track_namespace_created(&mut self, namespace: Namespace) -> Result<()> {
20		let change = Change {
21			pre: None,
22			post: Some(namespace),
23			op: Create,
24		};
25		self.changes.add_namespace_change(change);
26		Ok(())
27	}
28
29	fn track_namespace_deleted(&mut self, namespace: Namespace) -> Result<()> {
30		let change = Change {
31			pre: Some(namespace),
32			post: None,
33			op: Delete,
34		};
35		self.changes.add_namespace_change(change);
36		Ok(())
37	}
38}
39
40impl TransactionalNamespaceChanges for AdminTransaction {
41	fn find_namespace(&self, id: NamespaceId) -> Option<&Namespace> {
42		for change in self.changes.namespace.iter().rev() {
43			if let Some(namespace) = &change.post {
44				if namespace.id() == id {
45					return Some(namespace);
46				}
47			} else if let Some(namespace) = &change.pre
48				&& namespace.id() == id && change.op == Delete
49			{
50				return None;
51			}
52		}
53		None
54	}
55
56	fn find_namespace_by_name(&self, name: &str) -> Option<&Namespace> {
57		self.changes.namespace.iter().rev().find_map(|change| change.post.as_ref().filter(|s| s.name() == name))
58	}
59
60	fn is_namespace_deleted(&self, id: NamespaceId) -> bool {
61		self.changes
62			.namespace
63			.iter()
64			.rev()
65			.any(|change| change.op == Delete && change.pre.as_ref().map(|s| s.id()) == Some(id))
66	}
67
68	fn is_namespace_deleted_by_name(&self, name: &str) -> bool {
69		self.changes
70			.namespace
71			.iter()
72			.rev()
73			.any(|change| change.op == Delete && change.pre.as_ref().map(|s| s.name()) == Some(name))
74	}
75}