velesdb_server/handlers/graph/
types.rs1use serde::{Deserialize, Serialize};
6use utoipa::{IntoParams, ToSchema};
7use velesdb_core::api_types::serde_id;
8
9#[derive(Debug, Clone, Serialize, ToSchema)]
11pub struct TraversalResultItem {
12 #[serde(serialize_with = "serde_id::serialize_id_as_string")]
14 pub target_id: u64,
15 pub depth: u32,
17 pub path: Vec<u64>,
19}
20
21#[derive(Debug, Deserialize, IntoParams)]
23pub struct EdgeQueryParams {
24 #[param(example = "KNOWS")]
26 pub label: Option<String>,
27}
28
29#[derive(Debug, Deserialize, ToSchema)]
31pub struct TraverseRequest {
32 #[serde(deserialize_with = "serde_id::deserialize_id_from_string_or_number")]
34 pub source: u64,
35 #[serde(default = "default_strategy")]
37 pub strategy: String,
38 #[serde(default = "default_max_depth")]
40 pub max_depth: u32,
41 #[serde(default = "default_limit")]
43 pub limit: usize,
44 #[serde(default)]
46 pub rel_types: Vec<String>,
47}
48
49fn default_strategy() -> String {
50 "bfs".to_string()
51}
52
53fn default_max_depth() -> u32 {
54 3
55}
56
57fn default_limit() -> usize {
58 100
59}
60
61#[derive(Debug, Serialize, ToSchema)]
63pub struct TraverseResponse {
64 pub results: Vec<TraversalResultItem>,
66 pub has_more: bool,
68 pub stats: TraversalStats,
70}
71
72#[derive(Debug, Serialize, ToSchema)]
74pub struct TraversalStats {
75 pub visited: usize,
77 pub depth_reached: u32,
79}
80
81#[derive(Debug, Serialize, ToSchema)]
83pub struct DegreeResponse {
84 pub in_degree: usize,
86 pub out_degree: usize,
88}
89
90#[derive(Debug, Serialize, ToSchema)]
92pub struct EdgesResponse {
93 pub edges: Vec<EdgeResponse>,
95 pub count: usize,
97}
98
99#[derive(Debug, Serialize, ToSchema)]
101pub struct EdgeResponse {
102 #[serde(serialize_with = "serde_id::serialize_id_as_string")]
104 pub id: u64,
105 #[serde(serialize_with = "serde_id::serialize_id_as_string")]
107 pub source: u64,
108 #[serde(serialize_with = "serde_id::serialize_id_as_string")]
110 pub target: u64,
111 pub label: String,
113 pub properties: serde_json::Value,
115}
116
117#[derive(Debug, Deserialize, ToSchema)]
119pub struct AddEdgeRequest {
120 #[serde(deserialize_with = "serde_id::deserialize_id_from_string_or_number")]
122 pub id: u64,
123 #[serde(deserialize_with = "serde_id::deserialize_id_from_string_or_number")]
125 pub source: u64,
126 #[serde(deserialize_with = "serde_id::deserialize_id_from_string_or_number")]
128 pub target: u64,
129 pub label: String,
131 #[serde(default)]
133 pub properties: serde_json::Value,
134}
135
136#[derive(Debug, Serialize, ToSchema)]
142pub struct EdgeCountResponse {
143 pub count: usize,
145}
146
147#[derive(Debug, Deserialize, IntoParams)]
149pub struct NodeEdgeQueryParams {
150 #[serde(default = "default_direction")]
152 #[param(example = "out")]
153 pub direction: String,
154 #[param(example = "KNOWS")]
156 pub label: Option<String>,
157}
158
159fn default_direction() -> String {
160 "out".to_string()
161}
162
163#[derive(Debug, Serialize, ToSchema)]
165pub struct NodeListResponse {
166 pub node_ids: Vec<u64>,
168 pub count: usize,
170}
171
172#[derive(Debug, Deserialize, ToSchema)]
174pub struct UpsertNodePayloadRequest {
175 pub payload: serde_json::Value,
177}
178
179#[derive(Debug, Serialize, ToSchema)]
181pub struct NodePayloadResponse {
182 #[serde(serialize_with = "serde_id::serialize_id_as_string")]
184 pub node_id: u64,
185 pub payload: Option<serde_json::Value>,
187}
188
189#[derive(Debug, Deserialize, ToSchema)]
191pub struct ParallelTraverseRequest {
192 pub sources: Vec<u64>,
194 #[serde(default = "default_max_depth")]
196 pub max_depth: u32,
197 #[serde(default = "default_limit")]
199 pub limit: usize,
200 #[serde(default)]
202 pub rel_types: Vec<String>,
203}
204
205#[derive(Debug, Deserialize, ToSchema)]
207pub struct GraphSearchRequest {
208 pub vector: Vec<f32>,
210 #[serde(default = "default_graph_search_k")]
212 pub top_k: usize,
213}
214
215fn default_graph_search_k() -> usize {
216 10
217}
218
219#[derive(Debug, Serialize, ToSchema)]
221pub struct GraphSearchResponse {
222 pub results: Vec<GraphSearchResultItem>,
224}
225
226#[derive(Debug, Serialize, ToSchema)]
228pub struct GraphSearchResultItem {
229 #[serde(serialize_with = "serde_id::serialize_id_as_string")]
231 pub id: u64,
232 pub score: f32,
234 pub payload: Option<serde_json::Value>,
236}
237
238#[derive(Debug, Deserialize, IntoParams)]
244pub struct StreamTraverseParams {
245 #[serde(deserialize_with = "serde_id::deserialize_id_from_string_or_number")]
247 #[param(example = 123)]
248 pub start_node: u64,
249 #[serde(default = "default_algorithm")]
251 #[param(example = "bfs")]
252 pub algorithm: String,
253 #[serde(default = "default_stream_max_depth")]
255 #[param(example = 5)]
256 pub max_depth: u32,
257 #[serde(default = "default_stream_limit")]
259 #[param(example = 1000)]
260 pub limit: usize,
261 #[serde(default)]
263 #[param(example = "KNOWS,FOLLOWS")]
264 pub relationship_types: Option<String>,
265}
266
267fn default_algorithm() -> String {
268 "bfs".to_string()
269}
270
271fn default_stream_max_depth() -> u32 {
272 5
273}
274
275fn default_stream_limit() -> usize {
276 1000
277}
278
279#[derive(Debug, Serialize, ToSchema)]
281pub struct StreamNodeEvent {
282 #[serde(serialize_with = "serde_id::serialize_id_as_string")]
284 pub id: u64,
285 pub depth: u32,
287 pub path: Vec<u64>,
289}
290
291#[derive(Debug, Serialize, ToSchema)]
293pub struct StreamStatsEvent {
294 pub nodes_visited: usize,
296 pub elapsed_ms: u64,
298}
299
300#[derive(Debug, Serialize, ToSchema)]
302pub struct StreamDoneEvent {
303 pub total_nodes: usize,
305 pub max_depth_reached: u32,
307 pub elapsed_ms: u64,
309}
310
311#[derive(Debug, Serialize, ToSchema)]
313pub struct StreamErrorEvent {
314 pub error: String,
316}