use std::time::Instant;
use triviumdb::Database;
#[test]
fn test_reverse_edge_avalanche_deletion() {
let db_path = "test_reverse_edge_avalanche.tdb";
let _ = std::fs::remove_file(db_path);
let _ = std::fs::remove_file(format!("{}.vec", db_path));
let _ = std::fs::remove_file(format!("{}.wal", db_path));
let _ = std::fs::remove_file(format!("{}.lock", db_path));
let mut db = Database::<f32>::open(db_path, 8).unwrap();
db.disable_auto_compaction();
let center_id = db
.insert(&[0.0; 8], serde_json::json!({"role": "center"}))
.unwrap();
let num_fans = 10_000;
let mut fan_ids = Vec::new();
for i in 0..num_fans {
let fan_id = db
.insert(&[1.0; 8], serde_json::json!({"role": "fan", "id": i}))
.unwrap();
db.link(fan_id, center_id, "follows", 1.0).unwrap();
fan_ids.push(fan_id);
}
assert_eq!(db.node_count(), num_fans as usize + 1);
for fan_id in &fan_ids {
let fan_node = db.get(*fan_id).unwrap();
assert_eq!(fan_node.edges.len(), 1);
assert_eq!(fan_node.edges[0].target_id, center_id);
}
let start = Instant::now();
db.delete(center_id).unwrap();
let elapsed = start.elapsed();
println!(
"Deleted center node with {} incoming edges in {:?}",
num_fans, elapsed
);
assert!(
elapsed.as_millis() < 500,
"Deletion took too long, might be hitting O(E) avalanche!"
);
assert!(db.get(center_id).is_none());
assert_eq!(db.node_count(), num_fans as usize);
for fan_id in &fan_ids {
let fan_node = db.get(*fan_id).unwrap();
assert!(
fan_node.edges.is_empty(),
"Fan should not have any remaining edges to the deleted center"
);
}
let node_a = db.insert(&[0.0; 8], serde_json::json!("A")).unwrap();
let node_b = db.insert(&[0.0; 8], serde_json::json!("B")).unwrap();
db.link(node_a, node_b, "test", 1.0).unwrap();
db.unlink(node_a, node_b).unwrap();
db.delete(node_b).unwrap();
let a_node = db.get(node_a).unwrap();
assert!(a_node.edges.is_empty());
drop(db);
let _ = std::fs::remove_file(db_path);
let _ = std::fs::remove_file(format!("{}.vec", db_path));
let _ = std::fs::remove_file(format!("{}.wal", db_path));
let _ = std::fs::remove_file(format!("{}.lock", db_path));
}