From 98a157dbc0464ee0ef097a4d45a58bd633b52d00 Mon Sep 17 00:00:00 2001 From: Michael Vlach Date: Mon, 11 Dec 2023 11:23:09 +0100 Subject: [PATCH] [db] Fix remove node not removing all edge key-values #848 (#849) * Update remove_nodes_test.rs * Update db.rs --- agdb/src/db.rs | 3 +- agdb/tests/remove_nodes_test.rs | 73 +++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/agdb/src/db.rs b/agdb/src/db.rs index 8e54196f0..dec125099 100644 --- a/agdb/src/db.rs +++ b/agdb/src/db.rs @@ -804,6 +804,7 @@ impl DbImpl { from: edge.1, to: edge.2, }); + self.remove_all_values(DbId(edge.0 .0))?; } self.graph.remove_node(&mut self.storage, graph_index)?; @@ -829,7 +830,7 @@ impl DbImpl { Ok(result) } - fn remove_all_values(&mut self, db_id: DbId) -> Result<(), QueryError> { + fn remove_all_values(&mut self, db_id: DbId) -> Result<(), DbError> { for key_value in self.values.values(&self.storage, &db_id)? { self.undo_stack.push(Command::InsertKeyValue { id: db_id, diff --git a/agdb/tests/remove_nodes_test.rs b/agdb/tests/remove_nodes_test.rs index c56b05125..d57548331 100644 --- a/agdb/tests/remove_nodes_test.rs +++ b/agdb/tests/remove_nodes_test.rs @@ -203,3 +203,76 @@ fn remove_nodes_search() { db.exec_error(QueryBuilder::select().ids(1).query(), "Id '1' not found"); db.exec_error(QueryBuilder::select().ids(2).query(), "Id '2' not found"); } + +#[test] +fn remove_nodes_removes_edges_with_all_values() { + let mut db = TestDb::new(); + db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3); + db.exec_mut( + QueryBuilder::insert() + .edges() + .from(2) + .to(3) + .values(vec![vec![("some_key", 100).into()]]) + .query(), + 1, + ); + db.exec_mut(QueryBuilder::remove().ids(2).query(), -1); + db.exec_mut( + QueryBuilder::insert() + .edges() + .from(vec![1, 1]) + .to(vec![3, 3]) + .query(), + 2, + ); + db.exec_elements( + QueryBuilder::select().ids(vec![-2, -4]).query(), + &[ + DbElement { + id: DbId(-2), + values: vec![], + }, + DbElement { + id: DbId(-4), + values: vec![], + }, + ], + ); +} + +#[test] +fn remove_nodes_removes_edges_with_all_values_rollback() { + let mut db = TestDb::new(); + db.exec_mut(QueryBuilder::insert().nodes().count(3).query(), 3); + db.exec_mut( + QueryBuilder::insert() + .edges() + .from(2) + .to(3) + .values(vec![vec![("some_key", 100).into()]]) + .query(), + 1, + ); + db.transaction_mut_error( + |t| -> Result<(), QueryError> { + t.exec_mut(&QueryBuilder::remove().ids(2).query())?; + t.exec_mut( + &QueryBuilder::insert() + .edges() + .from(vec![1, 1]) + .to(vec![3, 3]) + .query(), + )?; + Err(QueryError::from("error")) + }, + QueryError::from("error"), + ); + db.exec_elements( + QueryBuilder::select().ids(vec![-4]).query(), + &[DbElement { + id: DbId(-4), + values: vec![("some_key", 100).into()], + }], + ); +}