reifydb_transaction/transaction/catalog/
view.rs1use reifydb_core::interface::catalog::{
5 change::CatalogTrackViewChangeOperations,
6 id::{NamespaceId, ViewId},
7 view::ViewDef,
8};
9use reifydb_type::Result;
10
11use crate::{
12 change::{
13 Change,
14 OperationType::{Create, Delete, Update},
15 TransactionalViewChanges,
16 },
17 transaction::{admin::AdminTransaction, subscription::SubscriptionTransaction},
18};
19
20impl CatalogTrackViewChangeOperations for AdminTransaction {
21 fn track_view_def_created(&mut self, view: ViewDef) -> Result<()> {
22 let change = Change {
23 pre: None,
24 post: Some(view),
25 op: Create,
26 };
27 self.changes.add_view_def_change(change);
28 Ok(())
29 }
30
31 fn track_view_def_updated(&mut self, pre: ViewDef, post: ViewDef) -> Result<()> {
32 let change = Change {
33 pre: Some(pre),
34 post: Some(post),
35 op: Update,
36 };
37 self.changes.add_view_def_change(change);
38 Ok(())
39 }
40
41 fn track_view_def_deleted(&mut self, view: ViewDef) -> Result<()> {
42 let change = Change {
43 pre: Some(view),
44 post: None,
45 op: Delete,
46 };
47 self.changes.add_view_def_change(change);
48 Ok(())
49 }
50}
51
52impl TransactionalViewChanges for AdminTransaction {
53 fn find_view(&self, id: ViewId) -> Option<&ViewDef> {
54 for change in self.changes.view_def.iter().rev() {
55 if let Some(view) = &change.post {
56 if view.id == id {
57 return Some(view);
58 }
59 } else if let Some(view) = &change.pre {
60 if view.id == id && change.op == Delete {
61 return None;
62 }
63 }
64 }
65 None
66 }
67
68 fn find_view_by_name(&self, namespace: NamespaceId, name: &str) -> Option<&ViewDef> {
69 self.changes
70 .view_def
71 .iter()
72 .rev()
73 .find_map(|change| change.post.as_ref().filter(|v| v.namespace == namespace && v.name == name))
74 }
75
76 fn is_view_deleted(&self, id: ViewId) -> bool {
77 self.changes
78 .view_def
79 .iter()
80 .rev()
81 .any(|change| change.op == Delete && change.pre.as_ref().map(|v| v.id) == Some(id))
82 }
83
84 fn is_view_deleted_by_name(&self, namespace: NamespaceId, name: &str) -> bool {
85 self.changes.view_def.iter().rev().any(|change| {
86 change.op == Delete
87 && change
88 .pre
89 .as_ref()
90 .map(|v| v.namespace == namespace && v.name == name)
91 .unwrap_or(false)
92 })
93 }
94}
95
96impl CatalogTrackViewChangeOperations for SubscriptionTransaction {
97 fn track_view_def_created(&mut self, view: ViewDef) -> Result<()> {
98 self.inner.track_view_def_created(view)
99 }
100
101 fn track_view_def_updated(&mut self, pre: ViewDef, post: ViewDef) -> Result<()> {
102 self.inner.track_view_def_updated(pre, post)
103 }
104
105 fn track_view_def_deleted(&mut self, view: ViewDef) -> Result<()> {
106 self.inner.track_view_def_deleted(view)
107 }
108}
109
110impl TransactionalViewChanges for SubscriptionTransaction {
111 fn find_view(&self, id: ViewId) -> Option<&ViewDef> {
112 self.inner.find_view(id)
113 }
114
115 fn find_view_by_name(&self, namespace: NamespaceId, name: &str) -> Option<&ViewDef> {
116 self.inner.find_view_by_name(namespace, name)
117 }
118
119 fn is_view_deleted(&self, id: ViewId) -> bool {
120 self.inner.is_view_deleted(id)
121 }
122
123 fn is_view_deleted_by_name(&self, namespace: NamespaceId, name: &str) -> bool {
124 self.inner.is_view_deleted_by_name(namespace, name)
125 }
126}