Skip to main content

jellyflow_runtime/runtime/rendering/
query.rs

1use 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}