reifydb_catalog/store/flow_edge/
delete.rs1use reifydb_core::{
5 interface::{CommandTransaction, FlowEdgeId},
6 key::{FlowEdgeByFlowKey, FlowEdgeKey},
7};
8
9use crate::CatalogStore;
10
11impl CatalogStore {
12 pub async fn delete_flow_edge(txn: &mut impl CommandTransaction, edge_id: FlowEdgeId) -> crate::Result<()> {
13 let edge = CatalogStore::find_flow_edge(txn, edge_id).await?;
15
16 if let Some(edge_def) = edge {
17 txn.remove(&FlowEdgeKey::encoded(edge_id)).await?;
19
20 txn.remove(&FlowEdgeByFlowKey::encoded(edge_def.flow, edge_id)).await?;
22 }
23
24 Ok(())
25 }
26}
27
28#[cfg(test)]
29mod tests {
30 use reifydb_core::interface::FlowEdgeId;
31 use reifydb_engine::test_utils::create_test_command_transaction;
32
33 use crate::{
34 CatalogStore,
35 test_utils::{create_flow_edge, create_flow_node, create_namespace, ensure_test_flow},
36 };
37
38 #[tokio::test]
39 async fn test_delete_flow_edge() {
40 let mut txn = create_test_command_transaction().await;
41 let _namespace = create_namespace(&mut txn, "test_namespace").await;
42 let flow = ensure_test_flow(&mut txn).await;
43
44 let node1 = create_flow_node(&mut txn, flow.id, 1, &[0x01]).await;
45 let node2 = create_flow_node(&mut txn, flow.id, 4, &[0x02]).await;
46 let edge = create_flow_edge(&mut txn, flow.id, node1.id, node2.id).await;
47
48 assert!(CatalogStore::find_flow_edge(&mut txn, edge.id).await.unwrap().is_some());
50
51 CatalogStore::delete_flow_edge(&mut txn, edge.id).await.unwrap();
53
54 assert!(CatalogStore::find_flow_edge(&mut txn, edge.id).await.unwrap().is_none());
56 }
57
58 #[tokio::test]
59 async fn test_delete_edge_removes_from_index() {
60 let mut txn = create_test_command_transaction().await;
61 let _namespace = create_namespace(&mut txn, "test_namespace").await;
62 let flow = ensure_test_flow(&mut txn).await;
63
64 let node1 = create_flow_node(&mut txn, flow.id, 1, &[0x01]).await;
65 let node2 = create_flow_node(&mut txn, flow.id, 4, &[0x02]).await;
66 let edge = create_flow_edge(&mut txn, flow.id, node1.id, node2.id).await;
67
68 let edges = CatalogStore::list_flow_edges_by_flow(&mut txn, flow.id).await.unwrap();
70 assert_eq!(edges.len(), 1);
71
72 CatalogStore::delete_flow_edge(&mut txn, edge.id).await.unwrap();
74
75 let edges = CatalogStore::list_flow_edges_by_flow(&mut txn, flow.id).await.unwrap();
77 assert!(edges.is_empty());
78 }
79
80 #[tokio::test]
81 async fn test_delete_nonexistent_edge() {
82 let mut txn = create_test_command_transaction().await;
83
84 CatalogStore::delete_flow_edge(&mut txn, FlowEdgeId(999)).await.unwrap();
86 }
87
88 #[tokio::test]
89 async fn test_delete_one_edge_keeps_others() {
90 let mut txn = create_test_command_transaction().await;
91 let _namespace = create_namespace(&mut txn, "test_namespace").await;
92 let flow = ensure_test_flow(&mut txn).await;
93
94 let node1 = create_flow_node(&mut txn, flow.id, 1, &[0x01]).await;
95 let node2 = create_flow_node(&mut txn, flow.id, 4, &[0x02]).await;
96 let node3 = create_flow_node(&mut txn, flow.id, 5, &[0x03]).await;
97
98 let edge1 = create_flow_edge(&mut txn, flow.id, node1.id, node2.id).await;
99 let edge2 = create_flow_edge(&mut txn, flow.id, node2.id, node3.id).await;
100
101 CatalogStore::delete_flow_edge(&mut txn, edge1.id).await.unwrap();
103
104 assert!(CatalogStore::find_flow_edge(&mut txn, edge1.id).await.unwrap().is_none());
106 assert!(CatalogStore::find_flow_edge(&mut txn, edge2.id).await.unwrap().is_some());
107
108 let edges = CatalogStore::list_flow_edges_by_flow(&mut txn, flow.id).await.unwrap();
110 assert_eq!(edges.len(), 1);
111 assert_eq!(edges[0].id, edge2.id);
112 }
113}