velesdb_core/collection/graph/
edge_removal.rs1use super::edge::EdgeStore;
8
9impl EdgeStore {
10 pub fn remove_edge(&mut self, edge_id: u64) {
14 if let Some(edge) = self.edges.remove(&edge_id) {
15 let source = edge.source();
16 self.purge_outgoing_index(edge_id, source);
17 self.purge_incoming_index(edge_id, edge.target());
18 self.purge_label_indices(edge_id, source, edge.label());
19 self.csr_snapshot = None;
21 }
22 }
23
24 pub fn remove_edge_outgoing_only(&mut self, edge_id: u64) {
29 if let Some(edge) = self.edges.remove(&edge_id) {
30 let source = edge.source();
31 self.purge_outgoing_index(edge_id, source);
32 self.purge_label_indices(edge_id, source, edge.label());
33 self.csr_snapshot = None;
35 }
36 }
37
38 pub fn remove_edge_incoming_only(&mut self, edge_id: u64) {
42 if let Some(edge) = self.edges.remove(&edge_id) {
43 self.purge_incoming_index(edge_id, edge.target());
44 self.csr_snapshot = None;
46 }
47 }
48
49 pub fn remove_node_edges(&mut self, node_id: u64) {
54 let outgoing_ids: Vec<u64> = self.outgoing.remove(&node_id).unwrap_or_default();
56
57 let incoming_ids: Vec<u64> = self.incoming.remove(&node_id).unwrap_or_default();
59
60 for edge_id in outgoing_ids {
62 if let Some(edge) = self.edges.remove(&edge_id) {
63 self.purge_incoming_index(edge_id, edge.target());
64 self.purge_label_indices(edge_id, node_id, edge.label());
65 }
66 }
67
68 for edge_id in incoming_ids {
70 if let Some(edge) = self.edges.remove(&edge_id) {
71 let source = edge.source();
72 self.purge_outgoing_index(edge_id, source);
73 self.purge_label_indices(edge_id, source, edge.label());
74 }
75 }
76
77 self.csr_snapshot = None;
79 }
80
81 #[inline]
83 fn purge_incoming_index(&mut self, edge_id: u64, target_node: u64) {
84 if let Some(ids) = self.incoming.get_mut(&target_node) {
85 ids.retain(|&id| id != edge_id);
86 }
87 }
88
89 #[inline]
91 fn purge_outgoing_index(&mut self, edge_id: u64, source_node: u64) {
92 if let Some(ids) = self.outgoing.get_mut(&source_node) {
93 ids.retain(|&id| id != edge_id);
94 }
95 }
96
97 #[inline]
99 fn purge_label_indices(&mut self, edge_id: u64, source_node: u64, label: &str) {
100 if let Some(ids) = self.by_label.get_mut(label) {
101 ids.retain(|&id| id != edge_id);
102 }
103 if let Some(ids) = self
104 .outgoing_by_label
105 .get_mut(&(source_node, label.to_string()))
106 {
107 ids.retain(|&id| id != edge_id);
108 }
109 }
110}