reifydb_catalog/store/flow_edge/
delete.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use 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		// First, get the edge to find the flow ID for index deletion
14		let edge = CatalogStore::find_flow_edge(txn, edge_id).await?;
15
16		if let Some(edge_def) = edge {
17			// Delete from main flow_edge table
18			txn.remove(&FlowEdgeKey::encoded(edge_id)).await?;
19
20			// Delete from flow_edge_by_flow index
21			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		// Edge should exist
49		assert!(CatalogStore::find_flow_edge(&mut txn, edge.id).await.unwrap().is_some());
50
51		// Delete edge
52		CatalogStore::delete_flow_edge(&mut txn, edge.id).await.unwrap();
53
54		// Edge should no longer exist
55		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		// Edge should be in flow index
69		let edges = CatalogStore::list_flow_edges_by_flow(&mut txn, flow.id).await.unwrap();
70		assert_eq!(edges.len(), 1);
71
72		// Delete edge
73		CatalogStore::delete_flow_edge(&mut txn, edge.id).await.unwrap();
74
75		// Edge should be removed from flow index
76		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		// Deleting a non-existent edge should succeed silently
85		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		// Delete first edge
102		CatalogStore::delete_flow_edge(&mut txn, edge1.id).await.unwrap();
103
104		// First edge should be gone, second should remain
105		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		// List should only have second edge
109		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}