use std::collections::HashSet;
use crate::config::Context;
use crate::db;
use crate::graph::code_graph;
use crate::search::fts;
pub fn graph_boost(ctx: &Context, query: &str) -> Vec<String> {
if ctx.falkordb.is_none() {
return vec![];
}
let mut conn = match db::connect_readonly(&ctx.database_url) {
Ok(conn) => conn,
Err(_) => return vec![],
};
let (resolved, _) = fts::resolve_graph_symbol(&mut conn, query, &ctx.project_id);
let Some(symbol) = resolved else {
return vec![];
};
let callers = code_graph::find_callers(ctx, &symbol.id, 0, 10).unwrap_or_default();
let usages = code_graph::find_usages(ctx, &symbol.id, 0, 10).unwrap_or_default();
let mut ids = Vec::new();
let mut seen = HashSet::new();
for r in callers.iter().chain(usages.iter()) {
if !r.id.is_empty() && seen.insert(r.id.clone()) {
ids.push(r.id.clone());
}
}
ids
}
pub fn graph_expand(ctx: &Context, seed_ids: &[String]) -> Vec<String> {
if seed_ids.is_empty() {
return vec![];
}
let callees = code_graph::find_callees_batch(ctx, seed_ids, 30).unwrap_or_default();
let callers = code_graph::find_callers_batch(ctx, seed_ids, 30).unwrap_or_default();
let mut ids = Vec::new();
let mut seen = HashSet::new();
for r in callees.iter().chain(callers.iter()) {
if !r.id.is_empty() && seen.insert(r.id.clone()) {
ids.push(r.id.clone());
}
}
ids
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
fn make_ctx_no_falkordb() -> Context {
Context {
database_url: "postgresql://localhost/nonexistent".to_string(),
project_root: PathBuf::from("/nonexistent"),
project_id: "test".to_string(),
quiet: true,
falkordb: None,
qdrant: None,
embedding: None,
code_vectors: crate::config::CodeVectorSettings::default(),
daemon_url: None,
}
}
#[test]
fn test_graph_boost_no_falkordb() {
let ctx = make_ctx_no_falkordb();
let result = graph_boost(&ctx, "some_function");
assert!(result.is_empty());
}
#[test]
fn test_graph_expand_no_falkordb() {
let ctx = make_ctx_no_falkordb();
let result = graph_expand(&ctx, &["some_function".to_string()]);
assert!(result.is_empty());
}
#[test]
fn test_graph_expand_empty_seeds() {
let ctx = make_ctx_no_falkordb();
let result = graph_expand(&ctx, &[]);
assert!(result.is_empty());
}
}