use graphdblite::Database;
#[test]
fn fts_index_reflects_node_lifecycle() {
let mut db = Database::open_memory().unwrap();
db.begin_write().unwrap();
db.execute("CREATE (n:Doc {body: 'alpha bravo charlie'})")
.unwrap();
db.create_fulltext_index("Doc", "body").unwrap();
db.commit().unwrap();
let rows = db
.execute("MATCH (n:Doc) WHERE n.body CONTAINS 'bravo' RETURN n.body AS b")
.unwrap();
assert_eq!(rows.len(), 1);
db.begin_write().unwrap();
db.execute("CREATE (n:Doc {body: 'delta echo foxtrot'})")
.unwrap();
db.commit().unwrap();
let rows = db
.execute("MATCH (n:Doc) WHERE n.body CONTAINS 'echo' RETURN n.body AS b")
.unwrap();
assert_eq!(rows.len(), 1);
db.begin_write().unwrap();
db.drop_fulltext_index("Doc", "body").unwrap();
db.commit().unwrap();
let rows = db
.execute("MATCH (n:Doc) WHERE n.body CONTAINS 'bravo' RETURN n.body AS b")
.unwrap();
assert_eq!(rows.len(), 1);
}
#[test]
fn fts_single_prop_table_names_do_not_collide_across_underscores() {
let mut db = Database::open_memory().unwrap();
db.begin_write().unwrap();
db.execute("CREATE (:A_b {c: 'needle text here'})").unwrap();
db.execute("CREATE (:A {b_c: 'needle text here'})").unwrap();
db.create_fulltext_index("A_b", "c").unwrap();
db.create_fulltext_index("A", "b_c").unwrap();
db.commit().unwrap();
let rows = db
.execute("MATCH (n:A_b) WHERE n.c CONTAINS 'needle' RETURN n.c AS c")
.unwrap();
assert_eq!(rows.len(), 1, "FTS lookup leaked across colliding labels");
}