Skip to content

Commit

Permalink
[db] Fix remove node not removing all edge key-values #848 (#849)
Browse files Browse the repository at this point in the history
* Update remove_nodes_test.rs

* Update db.rs
  • Loading branch information
michaelvlach authored Dec 11, 2023
1 parent 2b7cd75 commit 98a157d
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 1 deletion.
3 changes: 2 additions & 1 deletion agdb/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,7 @@ impl<Store: StorageData> DbImpl<Store> {
from: edge.1,
to: edge.2,
});
self.remove_all_values(DbId(edge.0 .0))?;
}

self.graph.remove_node(&mut self.storage, graph_index)?;
Expand All @@ -829,7 +830,7 @@ impl<Store: StorageData> DbImpl<Store> {
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,
Expand Down
73 changes: 73 additions & 0 deletions agdb/tests/remove_nodes_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()],
}],
);
}

0 comments on commit 98a157d

Please sign in to comment.