reifydb_catalog/store/flow_node/
find.rs1use flow_node::LAYOUT;
5use reifydb_core::{
6 interface::{FlowId, FlowNodeDef, FlowNodeId, QueryTransaction},
7 key::FlowNodeKey,
8};
9
10use crate::{CatalogStore, store::flow_node::layout::flow_node};
11
12impl CatalogStore {
13 pub async fn find_flow_node(
14 txn: &mut impl QueryTransaction,
15 node_id: FlowNodeId,
16 ) -> crate::Result<Option<FlowNodeDef>> {
17 let Some(multi) = txn.get(&FlowNodeKey::encoded(node_id)).await? else {
18 return Ok(None);
19 };
20
21 let row = multi.values;
22 let id = FlowNodeId(LAYOUT.get_u64(&row, flow_node::ID));
23 let flow = FlowId(LAYOUT.get_u64(&row, flow_node::FLOW));
24 let node_type = LAYOUT.get_u8(&row, flow_node::TYPE);
25 let data = LAYOUT.get_blob(&row, flow_node::DATA).clone();
26
27 Ok(Some(FlowNodeDef {
28 id,
29 flow,
30 node_type,
31 data,
32 }))
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use reifydb_core::interface::FlowNodeId;
39 use reifydb_engine::test_utils::create_test_command_transaction;
40
41 use crate::{
42 CatalogStore,
43 test_utils::{create_flow_node, create_namespace, ensure_test_flow},
44 };
45
46 #[tokio::test]
47 async fn test_find_flow_node_ok() {
48 let mut txn = create_test_command_transaction().await;
49 let _namespace = create_namespace(&mut txn, "test_namespace").await;
50 let flow = ensure_test_flow(&mut txn).await;
51
52 let node = create_flow_node(&mut txn, flow.id, 1, &[0x01, 0x02, 0x03]).await;
53
54 let result = CatalogStore::find_flow_node(&mut txn, node.id).await.unwrap();
55 assert!(result.is_some());
56 let found = result.unwrap();
57 assert_eq!(found.id, node.id);
58 assert_eq!(found.flow, flow.id);
59 assert_eq!(found.node_type, 1);
60 }
61
62 #[tokio::test]
63 async fn test_find_flow_node_not_found() {
64 let mut txn = create_test_command_transaction().await;
65
66 let result = CatalogStore::find_flow_node(&mut txn, FlowNodeId(999)).await.unwrap();
67 assert!(result.is_none());
68 }
69}