jellyflow_runtime/runtime/rendering/
query.rs1use std::collections::HashSet;
2
3use crate::io::NodeGraphViewState;
4use crate::runtime::lookups::NodeGraphLookups;
5use jellyflow_core::core::{EdgeId, Graph, GroupId, NodeId};
6use serde::{Deserialize, Serialize};
7
8use super::order::{
9 EdgeRenderOrderOptions, GroupRenderOrderOptions, NodeRenderOrderOptions,
10 resolve_edge_render_order, resolve_group_render_order, resolve_node_render_order,
11};
12use super::visibility::{VisibleEdgeIdsRequest, resolve_visible_edge_ids};
13use super::visibility::{VisibleNodeIdsRequest, resolve_visible_node_ids};
14
15#[derive(Debug, Clone, Copy, PartialEq)]
16pub struct RenderingQueryOptions {
17 pub groups: GroupRenderOrderOptions,
18 pub nodes: NodeRenderOrderOptions,
19 pub edges: EdgeRenderOrderOptions,
20 pub visible_nodes: Option<VisibleNodeIdsRequest>,
21 pub visible_edges: Option<VisibleEdgeIdsRequest>,
22}
23
24impl RenderingQueryOptions {
25 pub fn new(
26 groups: GroupRenderOrderOptions,
27 nodes: NodeRenderOrderOptions,
28 edges: EdgeRenderOrderOptions,
29 ) -> Self {
30 Self {
31 groups,
32 nodes,
33 edges,
34 visible_nodes: None,
35 visible_edges: None,
36 }
37 }
38
39 pub fn with_visible_nodes(mut self, request: Option<VisibleNodeIdsRequest>) -> Self {
40 self.visible_nodes = request;
41 self
42 }
43
44 pub fn with_visible_edges(mut self, request: Option<VisibleEdgeIdsRequest>) -> Self {
45 self.visible_edges = request;
46 self
47 }
48}
49
50#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
51pub struct RenderingQueryResult {
52 pub group_order: Vec<GroupId>,
53 pub node_order: Vec<NodeId>,
54 pub edge_order: Vec<EdgeId>,
55 pub visible_node_ids: Vec<NodeId>,
56 pub visible_node_render_order: Vec<NodeId>,
57 pub visible_edge_ids: Vec<EdgeId>,
58 pub visible_edge_render_order: Vec<EdgeId>,
59}
60
61pub fn resolve_rendering_query(
62 graph: &Graph,
63 lookups: &NodeGraphLookups,
64 view_state: &NodeGraphViewState,
65 options: RenderingQueryOptions,
66) -> RenderingQueryResult {
67 let group_order = resolve_group_render_order(graph, view_state, options.groups);
68 let node_order = resolve_node_render_order(graph, view_state, options.nodes);
69 let edge_order = resolve_edge_render_order(graph, view_state, options.edges);
70 let (visible_node_ids, visible_node_render_order) =
71 resolve_visible_nodes(lookups, &node_order, options.visible_nodes);
72 let (visible_edge_ids, visible_edge_render_order) =
73 resolve_visible_edges(graph, lookups, &edge_order, options.visible_edges);
74
75 RenderingQueryResult {
76 group_order,
77 node_order,
78 edge_order,
79 visible_node_ids,
80 visible_node_render_order,
81 visible_edge_ids,
82 visible_edge_render_order,
83 }
84}
85
86fn resolve_visible_nodes(
87 lookups: &NodeGraphLookups,
88 node_order: &[NodeId],
89 request: Option<VisibleNodeIdsRequest>,
90) -> (Vec<NodeId>, Vec<NodeId>) {
91 let Some(request) = request else {
92 return (Vec::new(), Vec::new());
93 };
94
95 let visible_node_ids = resolve_visible_node_ids(lookups, request);
96 let visible: HashSet<NodeId> = visible_node_ids.iter().copied().collect();
97 let visible_node_render_order = node_order
98 .iter()
99 .copied()
100 .filter(|id| visible.contains(id))
101 .collect();
102
103 (visible_node_ids, visible_node_render_order)
104}
105
106fn resolve_visible_edges(
107 graph: &Graph,
108 lookups: &NodeGraphLookups,
109 edge_order: &[EdgeId],
110 request: Option<VisibleEdgeIdsRequest>,
111) -> (Vec<EdgeId>, Vec<EdgeId>) {
112 let Some(request) = request else {
113 return (Vec::new(), Vec::new());
114 };
115
116 let visible_edge_ids = resolve_visible_edge_ids(graph, lookups, request);
117 let visible: HashSet<EdgeId> = visible_edge_ids.iter().copied().collect();
118 let visible_edge_render_order = edge_order
119 .iter()
120 .copied()
121 .filter(|id| visible.contains(id))
122 .collect();
123
124 (visible_edge_ids, visible_edge_render_order)
125}