diff --git a/Cargo.toml b/Cargo.toml index af06c2b..b5e7f3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["server", "smoltable"] [workspace.package] -version = "1.0.0" +version = "0.0.1" edition = "2021" license = "MIT OR Apache-2.0" rust-version = "1.74.0" diff --git a/server/src/api/delete_row.rs b/server/src/api/delete_row.rs index 7c9876a..24979cb 100644 --- a/server/src/api/delete_row.rs +++ b/server/src/api/delete_row.rs @@ -11,12 +11,12 @@ use actix_web::{ }; use serde::Deserialize; use serde_json::json; -use smoltable::TableWriter; +use smoltable::{ColumnFilter, TableWriter}; #[derive(Debug, Deserialize)] pub struct Input { row_key: String, - // column_filter: Option, + column_filter: Option, } // TODO: change input format to Vec, atomic multi-row deletes...? @@ -51,13 +51,17 @@ pub async fn handler( )); } + let req_body = req_body.into_inner(); + if let Some(table) = tables.get(&table_name) { let count = { let table = table.clone(); - tokio::task::spawn_blocking(move || table.delete_row(req_body.row_key.clone())) - .await - .expect("should join") + tokio::task::spawn_blocking(move || { + table.delete_row(req_body.row_key, req_body.column_filter) + }) + .await + .expect("should join") }?; let micros_total = before.elapsed().as_micros(); diff --git a/smoltable/src/table/mod.rs b/smoltable/src/table/mod.rs index 6bfd52a..1b54fde 100644 --- a/smoltable/src/table/mod.rs +++ b/smoltable/src/table/mod.rs @@ -7,7 +7,8 @@ use self::row_reader::SingleRowReader; use crate::{ query::{ row::{ - Input as QueryRowInput, Output as QueryRowOutput, RowOptions as QueryRowInputRowOptions, + ColumnOptions as QueryRowColumnOptions, Input as QueryRowInput, + Output as QueryRowOutput, RowOptions as QueryRowInputRowOptions, }, scan::{Input as QueryPrefixInput, Output as QueryPrefixOutput, ScanMode}, }, @@ -444,7 +445,11 @@ impl Smoltable { // TODO: delete row thrashes block cache // TODO: allow deleting specific columns -> DeleteRowInput, also batch + limit it? - pub fn delete_row(&self, row_key: String) -> crate::Result { + pub fn delete_row( + &self, + row_key: String, + column_filter: Option, + ) -> crate::Result { let mut count = 0; let mut reader = SingleRowReader::new( @@ -455,7 +460,10 @@ impl Smoltable { key: row_key, cell_limit: None, }, - column: None, + column: column_filter.map(|cf| QueryRowColumnOptions { + cell_limit: None, + filter: Some(cf), + }), }, )?; diff --git a/smoltable/tests/write_count_after_delete.rs b/smoltable/tests/write_count_after_delete.rs index 5f409af..0192708 100644 --- a/smoltable/tests/write_count_after_delete.rs +++ b/smoltable/tests/write_count_after_delete.rs @@ -55,19 +55,19 @@ pub fn write_count_after_delete() -> smoltable::Result<()> { assert_eq!(2, row_count); assert_eq!(4, cell_count); - table.delete_row("test".to_string())?; + table.delete_row("test".to_string(), None)?; let (row_count, cell_count) = table.count()?; assert_eq!(1, row_count); assert_eq!(2, cell_count); - table.delete_row("test".to_string())?; + table.delete_row("test".to_string(), None)?; let (row_count, cell_count) = table.count()?; assert_eq!(1, row_count); assert_eq!(2, cell_count); - table.delete_row("test2".to_string())?; + table.delete_row("test2".to_string(), None)?; let (row_count, cell_count) = table.count()?; assert_eq!(0, row_count);