use sparrowdb::fnv1a_col_id;
use sparrowdb::open;
use sparrowdb::{NodeId, Value};
use std::collections::HashMap;
fn make_db() -> (tempfile::TempDir, sparrowdb::GraphDb) {
let dir = tempfile::tempdir().expect("tempdir");
let db = open(dir.path()).expect("open");
(dir, db)
}
#[test]
fn so_label_varpath_repro() {
let (_dir, db) = make_db();
let name_col = fnv1a_col_id("name");
let label_id = {
let mut tx = db.begin_write().expect("begin_write");
let label_id = tx.create_label("__SO_Class").expect("create label") as u32;
tx.create_node(label_id, &[(name_col, Value::Bytes(b"Person".to_vec()))])
.expect("create Person");
tx.create_node(label_id, &[(name_col, Value::Bytes(b"Employee".to_vec()))])
.expect("create Employee");
let person_node = NodeId((label_id as u64) << 32);
let employee_node = NodeId((label_id as u64) << 32 | 1);
tx.create_edge(
employee_node,
person_node,
"__SO_SUBCLASS_OF",
HashMap::new(),
)
.expect("create edge");
tx.commit().expect("commit");
label_id
};
let _ = label_id;
let result_1hop = db
.execute(
"MATCH (c:__SO_Class {name:'Employee'})-[:__SO_SUBCLASS_OF]->(a:__SO_Class {name:'Person'}) \
RETURN c.name",
)
.expect("1-hop query");
println!("1-hop: {:?}", result_1hop.rows);
let result_var = db
.execute(
"MATCH (c:__SO_Class {name:'Employee'})-[:__SO_SUBCLASS_OF*1..20]->(a:__SO_Class {name:'Person'}) \
RETURN c.name",
)
.expect("var-path query");
println!("var-path: {:?}", result_var.rows);
assert_eq!(
result_1hop.rows.len(),
1,
"1-hop must return 1 row; got: {:?}",
result_1hop.rows
);
assert_eq!(
result_var.rows.len(),
1,
"var-path must return 1 row; got: {:?}",
result_var.rows
);
}