From a5d8b91535d7036c05450a01cf90af2e874566fc Mon Sep 17 00:00:00 2001 From: Handy-caT <37216852+Handy-caT@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:38:38 +0300 Subject: [PATCH 1/3] make delete generic --- .../src/worktable/generator/queries/delete.rs | 16 ++++++---- src/persistence/operation/batch.rs | 2 +- src/persistence/task.rs | 2 +- src/table/vacuum/vacuum.rs | 30 +++++++++---------- tests/persistence/sync/mod.rs | 2 +- .../persistence/sync/string_primary_index.rs | 2 +- .../sync/string_secondary_index.rs | 2 +- tests/worktable/unsized_.rs | 2 +- tests/worktable/vacuum.rs | 8 ++--- 9 files changed, 36 insertions(+), 30 deletions(-) diff --git a/codegen/src/worktable/generator/queries/delete.rs b/codegen/src/worktable/generator/queries/delete.rs index e526391..b0a1c93 100644 --- a/codegen/src/worktable/generator/queries/delete.rs +++ b/codegen/src/worktable/generator/queries/delete.rs @@ -40,7 +40,10 @@ impl Generator { let full_row_lock = self.gen_full_lock_for_update(); quote! { - pub async fn delete(&self, pk: #pk_ident) -> core::result::Result<(), WorkTableError> { + pub async fn delete(&self, pk: Pk) -> core::result::Result<(), WorkTableError> + where #pk_ident: From + { + let pk: #pk_ident = pk.into(); let lock = { #full_row_lock }; @@ -61,7 +64,10 @@ impl Generator { let delete_logic = self.gen_delete_logic(false); quote! { - pub async fn delete_without_lock(&self, pk: #pk_ident) -> core::result::Result<(), WorkTableError> { + pub async fn delete_without_lock(&self, pk: Pk) -> core::result::Result<(), WorkTableError> + where #pk_ident: From + { + let pk: #pk_ident = pk.into(); #delete_logic core::result::Result::Ok(()) } @@ -112,7 +118,7 @@ impl Generator { return Err(e); } }; - let row = self.select(pk.clone()).unwrap(); + let row = self.0.select(pk.clone()).unwrap(); #process } } else { @@ -123,7 +129,7 @@ impl Generator { .get(&pk) .map(|v| v.get().value.into()) .ok_or(WorkTableError::NotFound)?; - let row = self.select(pk.clone()).unwrap(); + let row = self.0.select(pk.clone()).unwrap(); #process } } @@ -172,7 +178,7 @@ impl Generator { self.iter_with_async(|row| { if row.#field == by { futures::future::Either::Left(async move { - self.delete(row.get_primary_key()).await + self.delete::<_>(row.get_primary_key()).await }) } else { futures::future::Either::Right(async { diff --git a/src/persistence/operation/batch.rs b/src/persistence/operation/batch.rs index 0ea195e..f144054 100644 --- a/src/persistence/operation/batch.rs +++ b/src/persistence/operation/batch.rs @@ -151,7 +151,7 @@ where .select_by_operation_id(op.operation_id()) .expect("exists as all should be inserted on prepare step") .id; - self.info_wt.delete_without_lock(pk.into()).await.unwrap(); + self.info_wt.delete_without_lock::<_>(pk).await.unwrap(); let prepared_evs = self .prepared_index_evs .as_mut() diff --git a/src/persistence/task.rs b/src/persistence/task.rs index 1b16a16..7d60232 100644 --- a/src/persistence/task.rs +++ b/src/persistence/task.rs @@ -253,7 +253,7 @@ where row.op_type = op.operation_type(); ops.push(op); info_wt.insert(row)?; - self.queue_inner_wt.delete_without_lock(id.into()).await? + self.queue_inner_wt.delete_without_lock::<_>(id).await? } // println!("New wt generated {:?}", start.elapsed()); // return ops sorted by `OperationId` diff --git a/src/table/vacuum/vacuum.rs b/src/table/vacuum/vacuum.rs index e8041d2..da12825 100644 --- a/src/table/vacuum/vacuum.rs +++ b/src/table/vacuum/vacuum.rs @@ -451,8 +451,8 @@ mod tests { let first_two_ids = ids.iter().take(2).map(|(i, _)| *i).collect::>(); - table.delete(first_two_ids[0].into()).await.unwrap(); - table.delete(first_two_ids[1].into()).await.unwrap(); + table.delete(first_two_ids[0].clone()).await.unwrap(); + table.delete(first_two_ids[1].clone()).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -482,8 +482,8 @@ mod tests { let ids_to_delete = ids.keys().skip(5).take(2).cloned().collect::>(); - table.delete(ids_to_delete[0].into()).await.unwrap(); - table.delete(ids_to_delete[1].into()).await.unwrap(); + table.delete(ids_to_delete[0].clone()).await.unwrap(); + table.delete(ids_to_delete[1].clone()).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -516,8 +516,8 @@ mod tests { let last_two_ids = ids.keys().skip(8).take(2).cloned().collect::>(); - table.delete(last_two_ids[1].into()).await.unwrap(); - table.delete(last_two_ids[0].into()).await.unwrap(); + table.delete(last_two_ids[1].clone()).await.unwrap(); + table.delete(last_two_ids[0].clone()).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -551,7 +551,7 @@ mod tests { let ids_to_delete = [1, 3, 5, 7].map(|idx| ids.keys().cloned().nth(idx).unwrap()); for id in &ids_to_delete { - table.delete((*id).into()).await.unwrap(); + table.delete(*id).await.unwrap(); } let vacuum = create_vacuum(&table); @@ -583,7 +583,7 @@ mod tests { let remaining_id = ids[0].0; for (id, _) in ids.iter().skip(1) { - table.delete((*id).into()).await.unwrap(); + table.delete(*id).await.unwrap(); } let vacuum = create_vacuum(&table); @@ -610,7 +610,7 @@ mod tests { ids.push((id, row)); } - table.delete(ids.last().unwrap().0.into()).await.unwrap(); + table.delete(ids.last().unwrap().0.clone()).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -651,7 +651,7 @@ mod tests { let ids_to_delete = ids.keys().take(3).cloned().collect::>(); for id in &ids_to_delete { - table.delete((*id).into()).await.unwrap(); + table.delete(*id).await.unwrap(); } let vacuum = create_vacuum(&table); @@ -682,7 +682,7 @@ mod tests { let ids_to_delete = original_ids.keys().take(3).cloned().collect::>(); for id in &ids_to_delete { - table.delete((*id).into()).await.unwrap(); + table.delete(*id).await.unwrap(); } let vacuum = create_vacuum(&table); @@ -735,7 +735,7 @@ mod tests { let ids_to_delete: Vec<_> = ids.iter().map(|(i, _)| *i).take(20).collect(); for id in &ids_to_delete { - table.delete((*id).into()).await.unwrap(); + table.delete(*id).await.unwrap(); } let vacuum = create_vacuum(&table); @@ -767,7 +767,7 @@ mod tests { let ids_to_delete: Vec<_> = ids.iter().step_by(20).map(|(id, _)| *id).collect(); for id in &ids_to_delete { - table.delete((*id).into()).await.unwrap(); + table.delete(*id).await.unwrap(); } let vacuum = create_vacuum(&table); @@ -800,7 +800,7 @@ mod tests { ids.push((id, row)); } - table.delete(ids.last().unwrap().0.into()).await.unwrap(); + table.delete(ids.last().unwrap().0.clone()).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -833,7 +833,7 @@ mod tests { // remove last too to trigger vacuum for last page too. ids_to_delete.push(ids.last().unwrap().0); for id in &ids_to_delete { - table.delete((*id).into()).await.unwrap(); + table.delete(*id).await.unwrap(); } let vacuum = create_vacuum(&table); diff --git a/tests/persistence/sync/mod.rs b/tests/persistence/sync/mod.rs index e932943..775b293 100644 --- a/tests/persistence/sync/mod.rs +++ b/tests/persistence/sync/mod.rs @@ -345,7 +345,7 @@ fn test_space_delete_sync() { id: table.get_next_pk().0, }; table.insert(row.clone()).unwrap(); - table.delete(row.id.into()).await.unwrap(); + table.delete(row.id).await.unwrap(); table.wait_for_ops().await; row.id }; diff --git a/tests/persistence/sync/string_primary_index.rs b/tests/persistence/sync/string_primary_index.rs index 4fe857c..4899254 100644 --- a/tests/persistence/sync/string_primary_index.rs +++ b/tests/persistence/sync/string_primary_index.rs @@ -327,7 +327,7 @@ fn test_space_delete_sync() { id: "Some string".to_string(), }; table.insert(another_row.clone()).unwrap(); - table.delete(another_row.id.clone().into()).await.unwrap(); + table.delete(another_row.id.clone()).await.unwrap(); table.wait_for_ops().await; another_row.id }; diff --git a/tests/persistence/sync/string_secondary_index.rs b/tests/persistence/sync/string_secondary_index.rs index 60d6816..90686b3 100644 --- a/tests/persistence/sync/string_secondary_index.rs +++ b/tests/persistence/sync/string_secondary_index.rs @@ -355,7 +355,7 @@ fn test_space_delete_sync() { id: table.get_next_pk().0, }; table.insert(row.clone()).unwrap(); - table.delete(row.id.into()).await.unwrap(); + table.delete(row.id).await.unwrap(); table.wait_for_ops().await; row.id }; diff --git a/tests/worktable/unsized_.rs b/tests/worktable/unsized_.rs index cf4c0b2..655aaa9 100644 --- a/tests/worktable/unsized_.rs +++ b/tests/worktable/unsized_.rs @@ -819,7 +819,7 @@ async fn delete_parallel() { let h2 = tokio::spawn(async move { for _ in 0..1_000 { let id_to_update = fastrand::u64(0..1000); - let _ = shared.delete(id_to_update.into()).await; + let _ = shared.delete(id_to_update).await; { let mut guard = shared_deleted_state.lock(); guard.insert(id_to_update); diff --git a/tests/worktable/vacuum.rs b/tests/worktable/vacuum.rs index 863ea49..49a8864 100644 --- a/tests/worktable/vacuum.rs +++ b/tests/worktable/vacuum.rs @@ -52,7 +52,7 @@ async fn vacuum_parallel_with_selects() { let task_ids = ids_to_delete.clone(); let delete_task = tokio::spawn(async move { for id in task_ids.iter() { - delete_table.delete((*id).into()).await.unwrap(); + delete_table.delete(*id).await.unwrap(); } }); @@ -102,7 +102,7 @@ async fn vacuum_parallel_with_inserts() { let task_ids = ids_to_delete.clone(); let delete_task = tokio::spawn(async move { for id in task_ids.iter() { - delete_table.delete((*id).into()).await.unwrap(); + delete_table.delete(*id).await.unwrap(); } }); @@ -172,7 +172,7 @@ async fn vacuum_parallel_with_upserts() { let task_row_state = Arc::clone(&row_state); let delete_task = tokio::spawn(async move { for id in task_ids.iter() { - delete_table.delete((*id).into()).await.unwrap(); + delete_table.delete(*id).await.unwrap(); { let mut g = task_row_state.lock(); g.remove(id); @@ -267,7 +267,7 @@ async fn vacuum_loop_test() { .map(|(_, l)| table.0.data.select(**l).unwrap()) .collect::>(); for row in ids_to_remove { - table.delete(row.id.into()).await.unwrap() + table.delete(row.id).await.unwrap() } } } From 0750e95bee77148a582a481d6e43f8bbe67393f1 Mon Sep 17 00:00:00 2001 From: Handy-caT <37216852+Handy-caT@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:41:43 +0300 Subject: [PATCH 2/3] fix clippy --- src/table/vacuum/vacuum.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/table/vacuum/vacuum.rs b/src/table/vacuum/vacuum.rs index da12825..1663885 100644 --- a/src/table/vacuum/vacuum.rs +++ b/src/table/vacuum/vacuum.rs @@ -451,8 +451,8 @@ mod tests { let first_two_ids = ids.iter().take(2).map(|(i, _)| *i).collect::>(); - table.delete(first_two_ids[0].clone()).await.unwrap(); - table.delete(first_two_ids[1].clone()).await.unwrap(); + table.delete(first_two_ids[0]).await.unwrap(); + table.delete(first_two_ids[1]).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -482,8 +482,8 @@ mod tests { let ids_to_delete = ids.keys().skip(5).take(2).cloned().collect::>(); - table.delete(ids_to_delete[0].clone()).await.unwrap(); - table.delete(ids_to_delete[1].clone()).await.unwrap(); + table.delete(ids_to_delete[0]).await.unwrap(); + table.delete(ids_to_delete[1]).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -516,8 +516,8 @@ mod tests { let last_two_ids = ids.keys().skip(8).take(2).cloned().collect::>(); - table.delete(last_two_ids[1].clone()).await.unwrap(); - table.delete(last_two_ids[0].clone()).await.unwrap(); + table.delete(last_two_ids[1]).await.unwrap(); + table.delete(last_two_ids[0]).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -610,7 +610,7 @@ mod tests { ids.push((id, row)); } - table.delete(ids.last().unwrap().0.clone()).await.unwrap(); + table.delete(ids.last().unwrap().0).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; @@ -800,7 +800,7 @@ mod tests { ids.push((id, row)); } - table.delete(ids.last().unwrap().0.clone()).await.unwrap(); + table.delete(ids.last().unwrap().0).await.unwrap(); let vacuum = create_vacuum(&table); vacuum.defragment().await; From 19e705f669d6260074e59d96508918f4dec5623a Mon Sep 17 00:00:00 2001 From: Handy-caT <37216852+Handy-caT@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:44:15 +0300 Subject: [PATCH 3/3] bump --- Cargo.toml | 4 ++-- codegen/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2fca76a..290d862 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["codegen", "examples", "performance_measurement", "performance_measur [package] name = "worktable" -version = "0.8.20" +version = "0.8.21" edition = "2024" authors = ["Handy-caT"] license = "MIT" @@ -16,7 +16,7 @@ perf_measurements = ["dep:performance_measurement", "dep:performance_measurement # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -worktable_codegen = { path = "codegen", version = "=0.8.20" } +worktable_codegen = { path = "codegen", version = "=0.8.21" } async-trait = "0.1.89" eyre = "0.6.12" diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index 0fc68f8..6153fff 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "worktable_codegen" -version = "0.8.20" +version = "0.8.21" edition = "2024" license = "MIT" description = "WorkTable codegeneration crate"