Skip to main content

reifydb_transaction/transaction/catalog/
namespace.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_core::interface::catalog::{
5	change::CatalogTrackNamespaceChangeOperations, id::NamespaceId, namespace::Namespace,
6};
7use reifydb_type::Result;
8
9use crate::{
10	change::{
11		Change,
12		OperationType::{Create, Delete, Update},
13		TransactionalNamespaceChanges,
14	},
15	transaction::{admin::AdminTransaction, subscription::SubscriptionTransaction},
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_updated(&mut self, pre: Namespace, post: Namespace) -> Result<()> {
30		let change = Change {
31			pre: Some(pre),
32			post: Some(post),
33			op: Update,
34		};
35		self.changes.add_namespace_change(change);
36		Ok(())
37	}
38
39	fn track_namespace_deleted(&mut self, namespace: Namespace) -> Result<()> {
40		let change = Change {
41			pre: Some(namespace),
42			post: None,
43			op: Delete,
44		};
45		self.changes.add_namespace_change(change);
46		Ok(())
47	}
48}
49
50impl TransactionalNamespaceChanges for AdminTransaction {
51	fn find_namespace(&self, id: NamespaceId) -> Option<&Namespace> {
52		for change in self.changes.namespace.iter().rev() {
53			if let Some(namespace) = &change.post {
54				if namespace.id() == id {
55					return Some(namespace);
56				}
57			} else if let Some(namespace) = &change.pre {
58				if namespace.id() == id && change.op == Delete {
59					return None;
60				}
61			}
62		}
63		None
64	}
65
66	fn find_namespace_by_name(&self, name: &str) -> Option<&Namespace> {
67		self.changes.namespace.iter().rev().find_map(|change| change.post.as_ref().filter(|s| s.name() == name))
68	}
69
70	fn is_namespace_deleted(&self, id: NamespaceId) -> bool {
71		self.changes
72			.namespace
73			.iter()
74			.rev()
75			.any(|change| change.op == Delete && change.pre.as_ref().map(|s| s.id()) == Some(id))
76	}
77
78	fn is_namespace_deleted_by_name(&self, name: &str) -> bool {
79		self.changes
80			.namespace
81			.iter()
82			.rev()
83			.any(|change| change.op == Delete && change.pre.as_ref().map(|s| s.name()) == Some(name))
84	}
85}
86
87impl CatalogTrackNamespaceChangeOperations for SubscriptionTransaction {
88	fn track_namespace_created(&mut self, namespace: Namespace) -> Result<()> {
89		self.inner.track_namespace_created(namespace)
90	}
91
92	fn track_namespace_updated(&mut self, pre: Namespace, post: Namespace) -> Result<()> {
93		self.inner.track_namespace_updated(pre, post)
94	}
95
96	fn track_namespace_deleted(&mut self, namespace: Namespace) -> Result<()> {
97		self.inner.track_namespace_deleted(namespace)
98	}
99}
100
101impl TransactionalNamespaceChanges for SubscriptionTransaction {
102	fn find_namespace(&self, id: NamespaceId) -> Option<&Namespace> {
103		self.inner.find_namespace(id)
104	}
105
106	fn find_namespace_by_name(&self, name: &str) -> Option<&Namespace> {
107		self.inner.find_namespace_by_name(name)
108	}
109
110	fn is_namespace_deleted(&self, id: NamespaceId) -> bool {
111		self.inner.is_namespace_deleted(id)
112	}
113
114	fn is_namespace_deleted_by_name(&self, name: &str) -> bool {
115		self.inner.is_namespace_deleted_by_name(name)
116	}
117}