use std::path::Path;
use codenexus::index::IndexFacade;
use codenexus::query::QueryFacade;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use tempfile::TempDir;
fn write_rust_files(dir: &Path, count: usize) {
for i in 0..count {
let path = dir.join(format!("file_{i}.rs"));
let content = format!("fn func_{i}() {{ helper_{i}(); }}\nfn helper_{i}() {{}}\n");
std::fs::write(&path, content).unwrap();
}
}
fn bench_query(c: &mut Criterion) {
let tmp = TempDir::new().unwrap();
let root = tmp.path().to_path_buf();
std::mem::forget(tmp);
write_rust_files(&root, 50);
let db = root.join("bench.db");
let facade = IndexFacade::new(&db).unwrap();
let index_result = facade.index(&root, "bench", false).unwrap();
let project_id = index_result.project_id;
let query = QueryFacade::new(&db).unwrap();
let mut group = c.benchmark_group("query");
group.sample_size(50);
group.bench_function("cypher_match_functions", |b| {
b.iter(|| {
let result = query
.cypher("MATCH (f:Function) RETURN f.name AS name LIMIT 10;")
.unwrap();
black_box(result);
});
});
group.bench_function("cypher_count_functions", |b| {
b.iter(|| {
let result = query
.cypher("MATCH (f:Function) RETURN count(f) AS cnt;")
.unwrap();
black_box(result);
});
});
group.bench_function("search_by_name", |b| {
b.iter(|| {
let results = query.search("func", None, 50).unwrap();
black_box(results);
});
});
group.bench_function("search_by_name_project", |b| {
b.iter(|| {
let results = query.search("func", Some(project_id.as_str()), 50).unwrap();
black_box(results);
});
});
group.finish();
}
criterion_group!(benches, bench_query);
criterion_main!(benches);