reifydb_transaction/transaction/catalog/
view.rs1use reifydb_core::interface::catalog::{
5 change::CatalogTrackViewChangeOperations,
6 id::{NamespaceId, ViewId},
7 view::View,
8};
9use reifydb_type::Result;
10
11use crate::{
12 change::{
13 Change,
14 OperationType::{Create, Delete, Update},
15 TransactionalViewChanges,
16 },
17 transaction::admin::AdminTransaction,
18};
19
20impl CatalogTrackViewChangeOperations for AdminTransaction {
21 fn track_view_created(&mut self, view: View) -> Result<()> {
22 let change = Change {
23 pre: None,
24 post: Some(view),
25 op: Create,
26 };
27 self.changes.add_view_change(change);
28 Ok(())
29 }
30
31 fn track_view_updated(&mut self, pre: View, post: View) -> Result<()> {
32 let change = Change {
33 pre: Some(pre),
34 post: Some(post),
35 op: Update,
36 };
37 self.changes.add_view_change(change);
38 Ok(())
39 }
40
41 fn track_view_deleted(&mut self, view: View) -> Result<()> {
42 let change = Change {
43 pre: Some(view),
44 post: None,
45 op: Delete,
46 };
47 self.changes.add_view_change(change);
48 Ok(())
49 }
50}
51
52impl TransactionalViewChanges for AdminTransaction {
53 fn find_view(&self, id: ViewId) -> Option<&View> {
54 for change in self.changes.view.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 && view.id() == id && change.op == Delete
61 {
62 return None;
63 }
64 }
65 None
66 }
67
68 fn find_view_by_name(&self, namespace: NamespaceId, name: &str) -> Option<&View> {
69 self.changes.view.iter().rev().find_map(|change| {
70 change.post.as_ref().filter(|v| v.namespace() == namespace && v.name() == name)
71 })
72 }
73
74 fn is_view_deleted(&self, id: ViewId) -> bool {
75 self.changes
76 .view
77 .iter()
78 .rev()
79 .any(|change| change.op == Delete && change.pre.as_ref().map(|v| v.id()) == Some(id))
80 }
81
82 fn is_view_deleted_by_name(&self, namespace: NamespaceId, name: &str) -> bool {
83 self.changes.view.iter().rev().any(|change| {
84 change.op == Delete
85 && change
86 .pre
87 .as_ref()
88 .map(|v| v.namespace() == namespace && v.name() == name)
89 .unwrap_or(false)
90 })
91 }
92}