#![cfg(all(feature = "lpg", feature = "gql", feature = "vector-index"))]
use grafeo_common::types::Value;
use grafeo_engine::GrafeoDB;
fn setup_euclidean_fixture() -> GrafeoDB {
let db = GrafeoDB::new_in_memory();
for (label, d) in [
("d03", 0.3f32),
("d05a", 0.5),
("d05b", 0.5),
("d07", 0.7),
("d09", 0.9),
] {
let n = db.create_node(&["Item"]);
db.set_node_property(n, "label", Value::String(label.into()));
db.set_node_property(n, "vec", Value::Vector(vec![d, 0.0, 0.0].into()));
}
db.create_vector_index("Item", "vec", Some(3), Some("euclidean"), None, None, None)
.expect("create vector index");
db
}
#[test]
fn euclidean_distance_strict_lt_excludes_boundary() {
let db = setup_euclidean_fixture();
let s = db.session();
let result = s
.execute(
"MATCH (n:Item) WHERE euclidean_distance(n.vec, [0.0, 0.0, 0.0]) < 0.5 RETURN n.label",
)
.expect("query should succeed");
assert_eq!(
result.row_count(),
1,
"strict < 0.5 must exclude both boundary rows; got {:?}",
result.rows()
);
}
#[test]
fn euclidean_distance_inclusive_le_includes_boundary() {
let db = setup_euclidean_fixture();
let s = db.session();
let result = s
.execute(
"MATCH (n:Item) WHERE euclidean_distance(n.vec, [0.0, 0.0, 0.0]) <= 0.5 RETURN n.label",
)
.expect("query should succeed");
assert_eq!(
result.row_count(),
3,
"inclusive <= 0.5 must include both boundary rows; got {:?}",
result.rows()
);
}
fn setup_manhattan_fixture() -> GrafeoDB {
let db = GrafeoDB::new_in_memory();
for (label, d) in [
("d03", 0.3f32),
("d05a", 0.5),
("d05b", 0.5),
("d07", 0.7),
("d09", 0.9),
] {
let n = db.create_node(&["Item"]);
db.set_node_property(n, "label", Value::String(label.into()));
db.set_node_property(n, "vec", Value::Vector(vec![d, 0.0, 0.0].into()));
}
db.create_vector_index("Item", "vec", Some(3), Some("manhattan"), None, None, None)
.expect("create vector index");
db
}
#[test]
fn manhattan_distance_strict_lt_excludes_boundary() {
let db = setup_manhattan_fixture();
let s = db.session();
let result = s
.execute(
"MATCH (n:Item) WHERE manhattan_distance(n.vec, [0.0, 0.0, 0.0]) < 0.5 RETURN n.label",
)
.expect("query should succeed");
assert_eq!(
result.row_count(),
1,
"strict < 0.5 must exclude both boundary rows; got {:?}",
result.rows()
);
}
#[test]
fn manhattan_distance_inclusive_le_includes_boundary() {
let db = setup_manhattan_fixture();
let s = db.session();
let result = s
.execute(
"MATCH (n:Item) WHERE manhattan_distance(n.vec, [0.0, 0.0, 0.0]) <= 0.5 RETURN n.label",
)
.expect("query should succeed");
assert_eq!(
result.row_count(),
3,
"inclusive <= 0.5 must include both boundary rows; got {:?}",
result.rows()
);
}