use std::collections::HashSet;
use std::path::Path;
use std::sync::Arc;
use std::time::{Duration, Instant};
use sqry_core::graph::Language;
use sqry_core::graph::unified::concurrent::{CodeGraph, GraphSnapshot};
use sqry_core::graph::unified::node::id::NodeId;
use sqry_core::graph::unified::node::kind::NodeKind;
use sqry_core::graph::unified::storage::arena::NodeEntry;
use sqry_db::planner::{
FusedPlanBatch, PathPattern, PlanNode, Predicate, PredicateValue, QueryBuilder, QueryPlan,
SetOperation, StringPattern, execute_batch, execute_plan, fuse_plans,
};
use sqry_db::{QueryDb, QueryDbConfig};
fn add_node(graph: &mut CodeGraph, entry: NodeEntry) -> NodeId {
let id = graph.nodes_mut().alloc(entry.clone()).expect("alloc node");
graph
.indices_mut()
.add(id, entry.kind, entry.name, entry.qualified_name, entry.file);
id
}
fn build_wide_fixture() -> Arc<GraphSnapshot> {
let mut graph = CodeGraph::new();
const FILES: usize = 10;
const FUNCS_PER_FILE: usize = 20;
const METHODS_PER_FILE: usize = 20;
let mut file_ids = Vec::with_capacity(FILES);
for idx in 0..FILES {
let path = format!("src/mod_{idx:02}.rs");
let fid = graph
.files_mut()
.register_with_language(Path::new(&path), Some(Language::Rust))
.expect("register file");
file_ids.push(fid);
}
let public_vis = graph.strings_mut().intern("public").expect("intern vis");
for (fi, &fid) in file_ids.iter().enumerate() {
for j in 0..FUNCS_PER_FILE {
let raw = format!("fn_{fi}_{j}");
let name = graph.strings_mut().intern(&raw).expect("intern fn name");
add_node(
&mut graph,
NodeEntry::new(NodeKind::Function, name, fid)
.with_qualified_name(name)
.with_byte_range((j as u32) * 100, (j as u32) * 100 + 80)
.with_visibility(public_vis),
);
}
for j in 0..METHODS_PER_FILE {
let raw = format!("m_{fi}_{j}");
let name = graph
.strings_mut()
.intern(&raw)
.expect("intern method name");
add_node(
&mut graph,
NodeEntry::new(NodeKind::Method, name, fid)
.with_qualified_name(name)
.with_byte_range(2000 + (j as u32) * 100, 2080 + (j as u32) * 100),
);
}
}
Arc::new(graph.snapshot())
}
fn scan_node(kind: NodeKind) -> PlanNode {
PlanNode::NodeScan {
kind: Some(kind),
visibility: None,
name_pattern: None,
}
}
fn filter_has_caller_node() -> PlanNode {
PlanNode::Filter {
predicate: Predicate::HasCaller,
}
}
fn filter_has_callee_node() -> PlanNode {
PlanNode::Filter {
predicate: Predicate::HasCallee,
}
}
fn filter_is_unused_node() -> PlanNode {
PlanNode::Filter {
predicate: Predicate::IsUnused,
}
}
fn filter_in_file_node(glob: &str) -> PlanNode {
PlanNode::Filter {
predicate: Predicate::InFile(PathPattern::new(glob)),
}
}
fn filter_matches_name_node(glob: &str) -> PlanNode {
PlanNode::Filter {
predicate: Predicate::MatchesName(StringPattern::glob(glob)),
}
}
fn filter_callers_pattern_node(glob: &str) -> PlanNode {
PlanNode::Filter {
predicate: Predicate::Callers(PredicateValue::Pattern(StringPattern::glob(glob))),
}
}
fn filter_callers_subquery_node(plan: PlanNode) -> PlanNode {
PlanNode::Filter {
predicate: Predicate::Callers(PredicateValue::Subquery(Box::new(plan))),
}
}
fn chain_plan(steps: Vec<PlanNode>) -> QueryPlan {
QueryPlan::new(PlanNode::Chain { steps })
}
fn standalone_plan(node: PlanNode) -> QueryPlan {
QueryPlan::new(node)
}
fn setop_node(op: SetOperation, left: PlanNode, right: PlanNode) -> PlanNode {
PlanNode::SetOp {
op,
left: Box::new(left),
right: Box::new(right),
}
}
fn shared_canonical_plans(batch: &FusedPlanBatch) -> HashSet<PlanNode> {
batch
.shared_nodes()
.iter()
.map(|shared| shared.canonical_plan().clone())
.collect()
}
#[test]
fn proof2_fuser_eliminates_redundant_scan_for_same_prefix_pair() {
let p_unused_fns = QueryBuilder::new()
.scan(NodeKind::Function)
.filter(Predicate::IsUnused)
.build()
.expect("build unused-functions plan");
let p_has_caller_fns = QueryBuilder::new()
.scan(NodeKind::Function)
.filter(Predicate::HasCaller)
.build()
.expect("build has-caller functions plan");
let batch = fuse_plans(vec![p_unused_fns, p_has_caller_fns]);
let stats = batch.stats();
assert_eq!(stats.total_plans, 2);
assert_eq!(
stats.fusion_groups, 1,
"two plans sharing a NodeScan(Function) prefix must fuse into one group"
);
assert_eq!(
stats.scans_eliminated, 1,
"one redundant NodeScan must be eliminated"
);
}
#[test]
fn proof2_different_kind_prefixes_produce_two_groups() {
let p_unused_fns = QueryBuilder::new()
.scan(NodeKind::Function)
.filter(Predicate::IsUnused)
.build()
.expect("build unused-functions plan");
let p_unused_methods = QueryBuilder::new()
.scan(NodeKind::Method)
.filter(Predicate::IsUnused)
.build()
.expect("build unused-methods plan");
let batch = fuse_plans(vec![p_unused_fns, p_unused_methods]);
let stats = batch.stats();
assert_eq!(stats.total_plans, 2);
assert_eq!(
stats.fusion_groups, 2,
"Function and Method scans are structurally distinct under the \
current fuser and must not merge"
);
assert_eq!(stats.scans_eliminated, 0);
}
#[test]
fn proof2_fused_execution_visits_shared_prefix_once() {
let snapshot = build_wide_fixture();
let db = QueryDb::new(snapshot, QueryDbConfig::default());
let p_all_fns = QueryBuilder::new()
.scan(NodeKind::Function)
.build()
.unwrap();
let p_has_caller_fns = QueryBuilder::new()
.scan(NodeKind::Function)
.filter(Predicate::HasCaller)
.build()
.unwrap();
let p_has_callee_fns = QueryBuilder::new()
.scan(NodeKind::Function)
.filter(Predicate::HasCallee)
.build()
.unwrap();
let standalone_all = execute_plan(&p_all_fns, &db);
let standalone_has_caller = execute_plan(&p_has_caller_fns, &db);
let standalone_has_callee = execute_plan(&p_has_callee_fns, &db);
let batch = fuse_plans(vec![
p_all_fns.clone(),
p_has_caller_fns.clone(),
p_has_callee_fns.clone(),
]);
assert_eq!(batch.stats().total_plans, 3);
assert_eq!(
batch.stats().fusion_groups,
1,
"three plans sharing the Function scan must all fuse into one group"
);
assert_eq!(batch.stats().scans_eliminated, 2);
let fused_out = execute_batch(&batch, &db);
assert_eq!(fused_out.len(), 3);
assert_eq!(fused_out[0], standalone_all);
assert_eq!(fused_out[1], standalone_has_caller);
assert_eq!(fused_out[2], standalone_has_callee);
}
#[test]
fn proof2_fused_wall_clock_is_cheaper_than_two_standalone_runs() {
const TOLERANCE: f64 = 1.10; const ITERATIONS: u32 = 5;
let snapshot = build_wide_fixture();
let db = QueryDb::new(snapshot, QueryDbConfig::default());
let p1 = QueryBuilder::new()
.scan(NodeKind::Function)
.filter(Predicate::HasCaller)
.build()
.unwrap();
let p2 = QueryBuilder::new()
.scan(NodeKind::Function)
.filter(Predicate::HasCallee)
.build()
.unwrap();
let _ = execute_plan(&p1, &db);
let _ = execute_plan(&p2, &db);
db.invalidate_all();
let mut min_two_standalone = Duration::MAX;
let mut min_fused = Duration::MAX;
for _ in 0..ITERATIONS {
db.invalidate_all();
let t0 = Instant::now();
let _ = execute_plan(&p1, &db);
let _ = execute_plan(&p2, &db);
let d = t0.elapsed();
if d < min_two_standalone {
min_two_standalone = d;
}
db.invalidate_all();
let batch = fuse_plans(vec![p1.clone(), p2.clone()]);
let t0 = Instant::now();
let _ = execute_batch(&batch, &db);
let d = t0.elapsed();
if d < min_fused {
min_fused = d;
}
}
let limit = min_two_standalone.mul_f64(TOLERANCE);
assert!(
min_fused <= limit,
"fused batch wall-clock {min_fused:?} exceeded {TOLERANCE}x \
the two-standalone baseline {min_two_standalone:?} (limit \
{limit:?}). scans_eliminated still proves fusion is working — \
see the scans_eliminated tests above."
);
}
#[test]
fn proof2_singleton_batch_is_a_no_op_fusion() {
let p = QueryBuilder::new()
.scan(NodeKind::Function)
.filter(Predicate::IsUnused)
.build()
.unwrap();
let batch = fuse_plans(vec![p]);
assert_eq!(batch.stats().total_plans, 1);
assert_eq!(batch.stats().fusion_groups, 1);
assert_eq!(batch.stats().scans_eliminated, 0);
}
#[test]
fn proof2_prefix_structural_equality_is_metadata_sensitive() {
let p_pub = QueryBuilder::new()
.scan_with(
sqry_db::planner::ScanFilters::new()
.with_kind(NodeKind::Function)
.with_visibility(sqry_core::schema::Visibility::Public),
)
.build()
.unwrap();
let p_any_vis = QueryBuilder::new()
.scan(NodeKind::Function)
.build()
.unwrap();
let batch = fuse_plans(vec![p_pub, p_any_vis]);
assert_eq!(
batch.stats().fusion_groups,
2,
"different visibility filters must produce two fusion groups"
);
assert_eq!(batch.stats().scans_eliminated, 0);
}
#[test]
fn proof2_universal_predicate_shared_across_distinct_kinds() {
let p_function = chain_plan(vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
]);
let p_method = chain_plan(vec![scan_node(NodeKind::Method), filter_has_caller_node()]);
let batch = fuse_plans(vec![p_function, p_method]);
assert_eq!(batch.stats().fusion_groups, 2);
assert_eq!(batch.stats().scans_eliminated, 0);
assert_eq!(
batch.stats().shared_nodes_promoted,
0,
"literal-subtree promotion must not synthesize a shared node across distinct scan roots",
);
assert!(batch.shared_nodes().is_empty());
}
#[test]
fn proof2_deep_prefix_match_shares_scan_filter_prefix() {
let shared_prefix = PlanNode::Chain {
steps: vec![scan_node(NodeKind::Function), filter_has_caller_node()],
};
let p1 = chain_plan(vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
filter_has_callee_node(),
]);
let p2 = chain_plan(vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
filter_is_unused_node(),
]);
let batch = fuse_plans(vec![p1, p2]);
let shared_plans = shared_canonical_plans(&batch);
assert_eq!(batch.stats().shared_nodes_promoted, 1);
assert!(shared_plans.contains(&shared_prefix));
}
#[test]
fn proof2_setop_operand_shared_across_plans() {
let shared_operand = scan_node(NodeKind::Function);
let p1 = standalone_plan(setop_node(
SetOperation::Union,
shared_operand.clone(),
scan_node(NodeKind::Method),
));
let p2 = standalone_plan(setop_node(
SetOperation::Union,
shared_operand.clone(),
scan_node(NodeKind::Class),
));
let batch = fuse_plans(vec![p1, p2]);
let shared_plans = shared_canonical_plans(&batch);
assert_eq!(batch.stats().shared_nodes_promoted, 1);
assert!(shared_plans.contains(&shared_operand));
}
#[test]
fn proof2_deeply_nested_subtree_shared() {
let nested_shared = PlanNode::Chain {
steps: vec![scan_node(NodeKind::Function), filter_has_caller_node()],
};
let p1 = standalone_plan(setop_node(
SetOperation::Union,
nested_shared.clone(),
scan_node(NodeKind::Method),
));
let p2 = standalone_plan(setop_node(
SetOperation::Difference,
nested_shared.clone(),
scan_node(NodeKind::Class),
));
let batch = fuse_plans(vec![p1, p2]);
let shared_plans = shared_canonical_plans(&batch);
assert!(shared_plans.contains(&nested_shared));
}
#[test]
fn proof2_no_false_sharing_scan_kind_preserves_boundary() {
let batch = fuse_plans(vec![
standalone_plan(scan_node(NodeKind::Function)),
standalone_plan(scan_node(NodeKind::Method)),
]);
assert_eq!(batch.stats().fusion_groups, 2);
assert_eq!(batch.stats().shared_nodes_promoted, 0);
assert!(batch.shared_nodes().is_empty());
}
#[test]
fn proof2_batch_of_10_complex_queries_promotes_shared_prefixes_and_preserves_results() {
let snapshot = build_wide_fixture();
let db = QueryDb::new(snapshot, QueryDbConfig::default());
let plans: Vec<QueryPlan> = (0..10)
.map(|index| {
let suffix = if index % 2 == 0 {
filter_in_file_node(&format!("src/mod_{index:02}.rs"))
} else {
filter_matches_name_node(&format!("fn_*_{}", index % 20))
};
chain_plan(vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
suffix,
])
})
.collect();
let batch = fuse_plans(plans.clone());
assert!(
batch.stats().shared_nodes_promoted >= 1,
"the overlapping-prefix batch must produce at least one shared node",
);
assert!(
batch.stats().scans_eliminated >= 1,
"the overlapping-prefix batch must eliminate redundant scans",
);
let standalone_results: Vec<Vec<_>> =
plans.iter().map(|plan| execute_plan(plan, &db)).collect();
db.invalidate_all();
let batch_results = execute_batch(&batch, &db);
assert_eq!(
batch_results, standalone_results,
"fused execution must preserve the exact result set and ordering for each query",
);
}
#[test]
fn proof2_topological_order_respected() {
let child = PlanNode::Chain {
steps: vec![scan_node(NodeKind::Function), filter_has_caller_node()],
};
let parent = PlanNode::Chain {
steps: vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
filter_has_callee_node(),
],
};
let plans = vec![
chain_plan(vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
filter_has_callee_node(),
filter_is_unused_node(),
]),
chain_plan(vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
filter_has_callee_node(),
filter_in_file_node("src/mod_00.rs"),
]),
chain_plan(vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
filter_is_unused_node(),
]),
chain_plan(vec![
scan_node(NodeKind::Function),
filter_has_caller_node(),
filter_in_file_node("src/mod_01.rs"),
]),
];
let batch = fuse_plans(plans);
let child_index = batch
.shared_nodes()
.iter()
.position(|shared| shared.canonical_plan() == &child)
.expect("shared child prefix");
let parent_index = batch
.shared_nodes()
.iter()
.position(|shared| shared.canonical_plan() == &parent)
.expect("shared parent prefix");
assert!(child_index < parent_index);
}
#[test]
fn proof2_shared_nodes_cache_persists_for_named_derived_queries() {
let named_prefix = PlanNode::Chain {
steps: vec![
scan_node(NodeKind::Function),
filter_callers_pattern_node("fn_*"),
],
};
let named_batch = fuse_plans(vec![
chain_plan(vec![
scan_node(NodeKind::Function),
filter_callers_pattern_node("fn_*"),
filter_has_caller_node(),
]),
chain_plan(vec![
scan_node(NodeKind::Function),
filter_callers_pattern_node("fn_*"),
filter_has_callee_node(),
]),
]);
assert!(shared_canonical_plans(&named_batch).contains(&named_prefix));
assert!(named_batch.subquery_batch().is_none());
let anonymous_batch = fuse_plans(vec![
chain_plan(vec![
scan_node(NodeKind::Function),
filter_callers_subquery_node(scan_node(NodeKind::Method)),
filter_has_caller_node(),
]),
chain_plan(vec![
scan_node(NodeKind::Function),
filter_callers_subquery_node(scan_node(NodeKind::Method)),
filter_has_callee_node(),
]),
]);
assert!(anonymous_batch.subquery_batch().is_some());
assert_eq!(
anonymous_batch
.subquery_batch()
.expect("anonymous relation subquery batch")
.total_plans(),
1,
);
}
#[allow(dead_code)]
fn _type_check_plan_node(_p: PlanNode) {}