#[cfg(feature = "duckdb-graph")]
use serde_json::{json, Value};
#[cfg(feature = "duckdb-graph")]
use super::HandlerContext;
#[cfg(feature = "duckdb-graph")]
use crate::graph::duckdb_graph::TemporalGraph;
#[cfg(feature = "duckdb-graph")]
pub fn handle_memory_graph_path(ctx: &HandlerContext, params: Value) -> Value {
let scope = match params.get("scope").and_then(|v| v.as_str()) {
Some(s) => s.to_string(),
None => return json!({"error": "missing required param: scope"}),
};
let source_id = match params.get("source_id").and_then(|v| v.as_i64()) {
Some(id) => id,
None => return json!({"error": "missing required param: source_id"}),
};
let target_id = match params.get("target_id").and_then(|v| v.as_i64()) {
Some(id) => id,
None => return json!({"error": "missing required param: target_id"}),
};
let max_depth = params
.get("max_depth")
.and_then(|v| v.as_u64())
.unwrap_or(4)
.min(255) as u8;
let db_path = ctx.storage.db_path().to_string();
let graph = match TemporalGraph::new(&db_path) {
Ok(g) => g,
Err(e) => return json!({"error": format!("failed to open DuckDB graph: {}", e)}),
};
match graph.find_connection(&scope, source_id, target_id, max_depth) {
Ok(paths) => json!(paths),
Err(e) => json!({"error": e.to_string()}),
}
}
#[cfg(feature = "duckdb-graph")]
pub fn handle_memory_temporal_snapshot(ctx: &HandlerContext, params: Value) -> Value {
let scope = match params.get("scope").and_then(|v| v.as_str()) {
Some(s) => s.to_string(),
None => return json!({"error": "missing required param: scope"}),
};
let timestamp = match params.get("timestamp").and_then(|v| v.as_str()) {
Some(t) => t.to_string(),
None => return json!({"error": "missing required param: timestamp"}),
};
let db_path = ctx.storage.db_path().to_string();
let graph = match TemporalGraph::new(&db_path) {
Ok(g) => g,
Err(e) => return json!({"error": format!("failed to open DuckDB graph: {}", e)}),
};
match graph.snapshot_at(&scope, ×tamp) {
Ok(edges) => json!(edges),
Err(e) => json!({"error": e.to_string()}),
}
}
#[cfg(feature = "duckdb-graph")]
pub fn handle_memory_scope_snapshot(ctx: &HandlerContext, params: Value) -> Value {
let scope = match params.get("scope").and_then(|v| v.as_str()) {
Some(s) => s.to_string(),
None => return json!({"error": "missing required param: scope"}),
};
let from_timestamp = match params.get("from_timestamp").and_then(|v| v.as_str()) {
Some(t) => t.to_string(),
None => return json!({"error": "missing required param: from_timestamp"}),
};
let to_timestamp = match params.get("to_timestamp").and_then(|v| v.as_str()) {
Some(t) => t.to_string(),
None => return json!({"error": "missing required param: to_timestamp"}),
};
let db_path = ctx.storage.db_path().to_string();
let graph = match TemporalGraph::new(&db_path) {
Ok(g) => g,
Err(e) => return json!({"error": format!("failed to open DuckDB graph: {}", e)}),
};
match graph.graph_diff(&scope, &from_timestamp, &to_timestamp) {
Ok(diff) => json!({
"added": diff.added,
"removed": diff.removed,
"changed": diff.changed.into_iter().map(|(before, after)| json!({
"before": before,
"after": after,
})).collect::<Vec<_>>(),
}),
Err(e) => json!({"error": e.to_string()}),
}
}