#![allow(clippy::map_entry)]
#![allow(clippy::set_contains_or_insert)]
#![allow(clippy::explicit_iter_loop)]
use std::collections::{HashMap, HashSet, VecDeque};
use manifoldb::{Database, EntityId, Value};
fn reference_bfs(
adjacency: &HashMap<EntityId, Vec<EntityId>>,
start: EntityId,
) -> Vec<(EntityId, usize)> {
let mut visited = HashMap::new();
let mut queue = VecDeque::new();
visited.insert(start, 0);
queue.push_back((start, 0));
while let Some((node, depth)) = queue.pop_front() {
if let Some(neighbors) = adjacency.get(&node) {
for &neighbor in neighbors {
if !visited.contains_key(&neighbor) {
visited.insert(neighbor, depth + 1);
queue.push_back((neighbor, depth + 1));
}
}
}
}
let mut result: Vec<_> = visited.into_iter().collect();
result.sort_by_key(|(id, _)| id.as_u64());
result
}
fn reference_dfs_reachable(
adjacency: &HashMap<EntityId, Vec<EntityId>>,
start: EntityId,
) -> HashSet<EntityId> {
let mut visited = HashSet::new();
let mut stack = vec![start];
while let Some(node) = stack.pop() {
if visited.insert(node) {
if let Some(neighbors) = adjacency.get(&node) {
for &neighbor in neighbors {
if !visited.contains(&neighbor) {
stack.push(neighbor);
}
}
}
}
}
visited
}
fn reference_path_exists(
adjacency: &HashMap<EntityId, Vec<EntityId>>,
start: EntityId,
end: EntityId,
) -> bool {
if start == end {
return true;
}
let mut visited = HashSet::new();
let mut stack = vec![start];
while let Some(node) = stack.pop() {
if node == end {
return true;
}
if visited.insert(node) {
if let Some(neighbors) = adjacency.get(&node) {
stack.extend(neighbors.iter().copied());
}
}
}
false
}
fn reference_shortest_path(
adjacency: &HashMap<EntityId, Vec<EntityId>>,
start: EntityId,
end: EntityId,
) -> Option<Vec<EntityId>> {
if start == end {
return Some(vec![start]);
}
let mut visited = HashSet::new();
let mut parent: HashMap<EntityId, EntityId> = HashMap::new();
let mut queue = VecDeque::new();
visited.insert(start);
queue.push_back(start);
while let Some(node) = queue.pop_front() {
if let Some(neighbors) = adjacency.get(&node) {
for &neighbor in neighbors {
if !visited.contains(&neighbor) {
visited.insert(neighbor);
parent.insert(neighbor, node);
queue.push_back(neighbor);
if neighbor == end {
let mut path = vec![end];
let mut current = end;
while let Some(&p) = parent.get(¤t) {
path.push(p);
current = p;
if current == start {
break;
}
}
path.reverse();
return Some(path);
}
}
}
}
}
None
}
fn reference_euclidean_distance(a: &[f32], b: &[f32]) -> f32 {
a.iter().zip(b.iter()).map(|(x, y)| (x - y).powi(2)).sum::<f32>().sqrt()
}
fn reference_cosine_distance(a: &[f32], b: &[f32]) -> f32 {
let dot: f32 = a.iter().zip(b.iter()).map(|(x, y)| x * y).sum();
let norm_a: f32 = a.iter().map(|x| x * x).sum::<f32>().sqrt();
let norm_b: f32 = b.iter().map(|x| x * x).sum::<f32>().sqrt();
if norm_a == 0.0 || norm_b == 0.0 {
return 1.0; }
1.0 - (dot / (norm_a * norm_b))
}
fn reference_knn_euclidean(
vectors: &[(EntityId, Vec<f32>)],
query: &[f32],
k: usize,
) -> Vec<(EntityId, f32)> {
let mut distances: Vec<_> =
vectors.iter().map(|(id, v)| (*id, reference_euclidean_distance(v, query))).collect();
distances.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
distances.truncate(k);
distances
}
#[test]
fn test_bfs_correctness() {
let db = Database::in_memory().expect("failed to create db");
let mut tx = db.begin().expect("failed");
let mut ids = Vec::new();
for i in 1..=5 {
let entity = tx.create_entity().expect("failed").with_property("id", i);
ids.push(entity.id);
tx.put_entity(&entity).expect("failed");
}
let edges = [(0, 1), (0, 2), (1, 3), (1, 4), (2, 4)];
for (src, dst) in edges {
let edge = tx.create_edge(ids[src], ids[dst], "CONNECTS").expect("failed");
tx.put_edge(&edge).expect("failed");
}
tx.commit().expect("failed");
let mut adjacency: HashMap<EntityId, Vec<EntityId>> = HashMap::new();
for (src, dst) in edges {
adjacency.entry(ids[src]).or_default().push(ids[dst]);
}
let tx = db.begin_read().expect("failed");
let mut db_visited = HashMap::new();
let mut queue = VecDeque::new();
db_visited.insert(ids[0], 0);
queue.push_back((ids[0], 0));
while let Some((node, depth)) = queue.pop_front() {
let edges = tx.get_outgoing_edges(node).expect("failed");
for edge in edges {
if !db_visited.contains_key(&edge.target) {
db_visited.insert(edge.target, depth + 1);
queue.push_back((edge.target, depth + 1));
}
}
}
let ref_result = reference_bfs(&adjacency, ids[0]);
for (id, expected_depth) in ref_result {
let actual_depth = db_visited.get(&id);
assert_eq!(actual_depth, Some(&expected_depth), "BFS depth mismatch for entity {id:?}");
}
}
#[test]
fn test_reachability_correctness() {
let db = Database::in_memory().expect("failed to create db");
let mut tx = db.begin().expect("failed");
let mut ids = Vec::new();
for i in 1..=5 {
let entity = tx.create_entity().expect("failed").with_property("id", i);
ids.push(entity.id);
tx.put_entity(&entity).expect("failed");
}
let edges = [(0, 1), (1, 2), (3, 4)];
for (src, dst) in edges {
let edge = tx.create_edge(ids[src], ids[dst], "CONNECTS").expect("failed");
tx.put_edge(&edge).expect("failed");
}
tx.commit().expect("failed");
let mut adjacency: HashMap<EntityId, Vec<EntityId>> = HashMap::new();
for (src, dst) in edges {
adjacency.entry(ids[src]).or_default().push(ids[dst]);
}
let ref_reachable = reference_dfs_reachable(&adjacency, ids[0]);
let tx = db.begin_read().expect("failed");
let mut db_reachable = HashSet::new();
let mut stack = vec![ids[0]];
while let Some(node) = stack.pop() {
if db_reachable.insert(node) {
let edges = tx.get_outgoing_edges(node).expect("failed");
for edge in edges {
stack.push(edge.target);
}
}
}
assert_eq!(db_reachable, ref_reachable, "reachable sets should match");
assert!(!db_reachable.contains(&ids[3]));
assert!(!db_reachable.contains(&ids[4]));
}
#[test]
fn test_path_existence_correctness() {
let db = Database::in_memory().expect("failed to create db");
let mut tx = db.begin().expect("failed");
let mut ids = Vec::new();
for i in 1..=5 {
let entity = tx.create_entity().expect("failed").with_property("id", i);
ids.push(entity.id);
tx.put_entity(&entity).expect("failed");
}
let edges = [(0, 1), (1, 2), (2, 3), (1, 4)];
for (src, dst) in edges {
let edge = tx.create_edge(ids[src], ids[dst], "CONNECTS").expect("failed");
tx.put_edge(&edge).expect("failed");
}
tx.commit().expect("failed");
let mut adjacency: HashMap<EntityId, Vec<EntityId>> = HashMap::new();
for (src, dst) in edges {
adjacency.entry(ids[src]).or_default().push(ids[dst]);
}
let db_path_exists = |start: EntityId, end: EntityId| -> bool {
let tx = db.begin_read().expect("failed");
let mut visited = HashSet::new();
let mut stack = vec![start];
while let Some(node) = stack.pop() {
if node == end {
return true;
}
if visited.insert(node) {
let edges = tx.get_outgoing_edges(node).expect("failed");
for edge in edges {
stack.push(edge.target);
}
}
}
false
};
let test_cases = [
(ids[0], ids[3], true), (ids[0], ids[4], true), (ids[3], ids[0], false), (ids[4], ids[3], false), (ids[0], ids[0], true), ];
for (start, end, expected) in test_cases {
let ref_result = reference_path_exists(&adjacency, start, end);
let db_result = db_path_exists(start, end);
assert_eq!(ref_result, expected, "reference path check for {start:?} -> {end:?}");
assert_eq!(db_result, expected, "database path check for {start:?} -> {end:?}");
assert_eq!(ref_result, db_result, "results should match");
}
}
#[test]
fn test_shortest_path_correctness() {
let db = Database::in_memory().expect("failed to create db");
let mut tx = db.begin().expect("failed");
let mut ids = Vec::new();
for i in 1..=5 {
let entity = tx.create_entity().expect("failed").with_property("id", i);
ids.push(entity.id);
tx.put_entity(&entity).expect("failed");
}
let edges = [(0, 1), (1, 2), (2, 4), (0, 3), (3, 4)];
for (src, dst) in edges {
let edge = tx.create_edge(ids[src], ids[dst], "CONNECTS").expect("failed");
tx.put_edge(&edge).expect("failed");
}
tx.commit().expect("failed");
let mut adjacency: HashMap<EntityId, Vec<EntityId>> = HashMap::new();
for (src, dst) in edges {
adjacency.entry(ids[src]).or_default().push(ids[dst]);
}
let ref_path = reference_shortest_path(&adjacency, ids[0], ids[4]);
let db_path = {
let tx = db.begin_read().expect("failed");
let mut parent: HashMap<EntityId, EntityId> = HashMap::new();
let mut queue = VecDeque::new();
queue.push_back(ids[0]);
while let Some(node) = queue.pop_front() {
if node == ids[4] {
let mut path = vec![ids[4]];
let mut current = ids[4];
while let Some(&p) = parent.get(¤t) {
path.push(p);
current = p;
}
path.reverse();
break;
}
let edges = tx.get_outgoing_edges(node).expect("failed");
for edge in edges {
if !parent.contains_key(&edge.target) && edge.target != ids[0] {
parent.insert(edge.target, node);
queue.push_back(edge.target);
}
}
}
let mut path = vec![ids[4]];
let mut current = ids[4];
while let Some(&p) = parent.get(¤t) {
path.push(p);
current = p;
}
path.reverse();
Some(path)
};
assert!(ref_path.is_some());
assert!(db_path.is_some());
assert_eq!(
ref_path.as_ref().unwrap().len(),
db_path.as_ref().unwrap().len(),
"path lengths should match"
);
}
#[test]
fn test_euclidean_distance_correctness() {
let test_cases = [
(vec![0.0, 0.0], vec![3.0, 4.0], 5.0),
(vec![1.0, 2.0, 3.0], vec![1.0, 2.0, 3.0], 0.0),
(vec![0.0], vec![1.0], 1.0),
(
vec![1.0, 2.0, 3.0, 4.0],
vec![5.0, 6.0, 7.0, 8.0],
8.0, ),
];
for (a, b, expected) in test_cases {
let result = reference_euclidean_distance(&a, &b);
assert!(
(result - expected).abs() < 0.0001,
"Euclidean({a:?}, {b:?}) = {result}, expected {expected}"
);
}
}
#[test]
fn test_cosine_distance_correctness() {
let test_cases = [
(vec![1.0, 0.0], vec![2.0, 0.0], 0.0),
(vec![1.0, 0.0], vec![-1.0, 0.0], 2.0),
(vec![1.0, 0.0], vec![0.0, 1.0], 1.0),
(vec![1.0, 0.0], vec![1.0, 1.0], 1.0 - (1.0 / 2.0_f32.sqrt())),
];
for (a, b, expected) in test_cases {
let result = reference_cosine_distance(&a, &b);
assert!(
(result - expected).abs() < 0.001,
"Cosine({a:?}, {b:?}) = {result}, expected {expected}"
);
}
}
#[test]
fn test_knn_correctness() {
let db = Database::in_memory().expect("failed to create db");
let vectors = vec![
(1, vec![1.0f32, 0.0, 0.0]), (2, vec![0.0, 2.0, 0.0]), (3, vec![0.0, 0.0, 3.0]), (4, vec![2.0, 2.0, 0.0]), (5, vec![0.5, 0.5, 0.5]), ];
let mut tx = db.begin().expect("failed");
let mut ids = Vec::new();
for (i, v) in &vectors {
let entity = tx
.create_entity()
.expect("failed")
.with_property("id", *i as i64)
.with_property("embedding", v.clone());
ids.push(entity.id);
tx.put_entity(&entity).expect("failed");
}
tx.commit().expect("failed");
let query = vec![0.0f32, 0.0, 0.0];
let ref_vectors: Vec<_> = ids.iter().zip(vectors.iter().map(|(_, v)| v.clone())).collect();
let ref_knn = reference_knn_euclidean(
&ref_vectors.iter().map(|(id, v)| (**id, v.clone())).collect::<Vec<_>>(),
&query,
3,
);
let tx = db.begin_read().expect("failed");
let mut db_distances: Vec<(EntityId, f32)> = Vec::new();
for &id in &ids {
let entity = tx.get_entity(id).expect("failed").expect("should exist");
if let Some(Value::Vector(v)) = entity.get_property("embedding") {
let dist = reference_euclidean_distance(v, &query);
db_distances.push((id, dist));
}
}
db_distances.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
db_distances.truncate(3);
assert_eq!(ref_knn.len(), 3);
assert_eq!(db_distances.len(), 3);
for ((ref_id, ref_dist), (db_id, db_dist)) in ref_knn.iter().zip(db_distances.iter()) {
assert_eq!(ref_id, db_id, "k-NN order should match");
assert!((ref_dist - db_dist).abs() < 0.0001, "distances should match");
}
assert_eq!(db_distances[0].0, ids[4]); }
#[test]
fn test_property_update_semantics() {
let db = Database::in_memory().expect("failed to create db");
let entity_id: EntityId;
{
let mut tx = db.begin().expect("failed");
let entity = tx
.create_entity()
.expect("failed")
.with_property("a", 1i64)
.with_property("b", 2i64)
.with_property("c", 3i64);
entity_id = entity.id;
tx.put_entity(&entity).expect("failed");
tx.commit().expect("failed");
}
{
let mut tx = db.begin().expect("failed");
let mut entity = tx.get_entity(entity_id).expect("failed").expect("should exist");
entity.set_property("a", 10i64);
entity.set_property("d", 4i64);
tx.put_entity(&entity).expect("failed");
tx.commit().expect("failed");
}
let tx = db.begin_read().expect("failed");
let entity = tx.get_entity(entity_id).expect("failed").expect("should exist");
assert_eq!(entity.get_property("a"), Some(&Value::Int(10)));
assert_eq!(entity.get_property("c"), Some(&Value::Int(3))); assert_eq!(entity.get_property("d"), Some(&Value::Int(4)));
assert_eq!(entity.get_property("b"), Some(&Value::Int(2)));
}
#[test]
fn test_label_semantics() {
let db = Database::in_memory().expect("failed to create db");
let entity_id: EntityId;
{
let mut tx = db.begin().expect("failed");
let entity = tx.create_entity().expect("failed").with_label("A").with_label("B");
entity_id = entity.id;
tx.put_entity(&entity).expect("failed");
tx.commit().expect("failed");
}
let tx = db.begin_read().expect("failed");
let entity = tx.get_entity(entity_id).expect("failed").expect("should exist");
assert!(entity.has_label("A"));
assert!(entity.has_label("B"));
assert!(!entity.has_label("C"));
}
#[test]
fn test_edge_property_correctness() {
let db = Database::in_memory().expect("failed to create db");
let (src_id, dst_id): (EntityId, EntityId);
{
let mut tx = db.begin().expect("failed");
let src = tx.create_entity().expect("failed").with_label("Source");
let dst = tx.create_entity().expect("failed").with_label("Destination");
src_id = src.id;
dst_id = dst.id;
tx.put_entity(&src).expect("failed");
tx.put_entity(&dst).expect("failed");
let edge = tx
.create_edge(src_id, dst_id, "WEIGHTED")
.expect("failed")
.with_property("weight", 42.5f64)
.with_property("label", "important");
tx.put_edge(&edge).expect("failed");
tx.commit().expect("failed");
}
let tx = db.begin_read().expect("failed");
let edges = tx.get_outgoing_edges(src_id).expect("failed");
assert_eq!(edges.len(), 1);
assert_eq!(edges[0].source, src_id);
assert_eq!(edges[0].target, dst_id);
assert_eq!(edges[0].edge_type.as_str(), "WEIGHTED");
if let Some(Value::Float(w)) = edges[0].get_property("weight") {
assert!((w - 42.5).abs() < 0.001);
} else {
panic!("expected weight property");
}
assert_eq!(edges[0].get_property("label"), Some(&Value::String("important".to_string())));
}
#[test]
fn test_edge_bidirectional_consistency() {
let db = Database::in_memory().expect("failed to create db");
let mut tx = db.begin().expect("failed");
let mut ids = Vec::new();
for i in 0..5 {
let entity = tx.create_entity().expect("failed").with_property("id", i);
ids.push(entity.id);
tx.put_entity(&entity).expect("failed");
}
let edge_specs = [(0, 1), (0, 2), (1, 2), (2, 3), (3, 4)];
for (src, dst) in edge_specs {
let edge = tx.create_edge(ids[src], ids[dst], "CONNECTS").expect("failed");
tx.put_edge(&edge).expect("failed");
}
tx.commit().expect("failed");
let tx = db.begin_read().expect("failed");
for (src_idx, dst_idx) in edge_specs {
let src_id = ids[src_idx];
let dst_id = ids[dst_idx];
let outgoing = tx.get_outgoing_edges(src_id).expect("failed");
let has_outgoing = outgoing.iter().any(|e| e.target == dst_id);
assert!(has_outgoing, "should have outgoing edge {src_idx} -> {dst_idx}");
let incoming = tx.get_incoming_edges(dst_id).expect("failed");
let has_incoming = incoming.iter().any(|e| e.source == src_id);
assert!(has_incoming, "should have incoming edge {src_idx} -> {dst_idx}");
}
}
#[test]
fn test_value_type_roundtrip() {
let db = Database::in_memory().expect("failed to create db");
let test_values = [
("null", Value::Null),
("bool_true", Value::Bool(true)),
("bool_false", Value::Bool(false)),
("int_pos", Value::Int(42)),
("int_neg", Value::Int(-42)),
("int_max", Value::Int(i64::MAX)),
("int_min", Value::Int(i64::MIN)),
("float", Value::Float(3.14159)),
("float_neg", Value::Float(-273.15)),
("string", Value::String("hello world".to_string())),
("string_empty", Value::String(String::new())),
("string_unicode", Value::String("こんにちは".to_string())),
("vector", Value::Vector(vec![1.0, 2.0, 3.0, 4.0, 5.0])),
("vector_empty", Value::Vector(Vec::new())),
];
let entity_id: EntityId;
{
let mut tx = db.begin().expect("failed");
let mut entity = tx.create_entity().expect("failed");
for (key, value) in &test_values {
entity.set_property(*key, value.clone());
}
entity_id = entity.id;
tx.put_entity(&entity).expect("failed");
tx.commit().expect("failed");
}
let tx = db.begin_read().expect("failed");
let entity = tx.get_entity(entity_id).expect("failed").expect("should exist");
for (key, expected) in &test_values {
let actual = entity.get_property(key);
assert_eq!(
actual,
Some(expected),
"value mismatch for key '{key}': expected {expected:?}, got {actual:?}"
);
}
}
#[test]
fn test_snapshot_consistency() {
let db = Database::in_memory().expect("failed to create db");
let mut entity_ids = Vec::new();
{
let mut tx = db.begin().expect("failed");
for _ in 0..10 {
let entity = tx.create_entity().expect("failed").with_property("version", 1i64);
entity_ids.push(entity.id);
tx.put_entity(&entity).expect("failed");
}
tx.commit().expect("failed");
}
let read_tx = db.begin_read().expect("failed");
let initial_state: Vec<_> = entity_ids
.iter()
.map(|&id| {
let entity = read_tx.get_entity(id).expect("failed").expect("should exist");
entity.get_property("version").cloned()
})
.collect();
{
let mut tx = db.begin().expect("failed");
for &id in &entity_ids {
let mut entity = tx.get_entity(id).expect("failed").expect("should exist");
entity.set_property("version", 2i64);
tx.put_entity(&entity).expect("failed");
}
tx.commit().expect("failed");
}
let final_state: Vec<_> = entity_ids
.iter()
.map(|&id| {
let entity = read_tx.get_entity(id).expect("failed").expect("should exist");
entity.get_property("version").cloned()
})
.collect();
assert_eq!(initial_state, final_state, "snapshot should be consistent");
for state in &final_state {
assert_eq!(state, &Some(Value::Int(1)));
}
let new_tx = db.begin_read().expect("failed");
for &id in &entity_ids {
let entity = new_tx.get_entity(id).expect("failed").expect("should exist");
assert_eq!(entity.get_property("version"), Some(&Value::Int(2)));
}
}