From e17048eddfe2df86abd2d498da2a33b9c3dd8a72 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Fri, 2 May 2025 23:38:23 +0300 Subject: Add sort_asc param, impl demo chat app --- log_db/src/common.rs | 2 ++ log_db/src/engine.rs | 23 ++++++++++++++++++++--- log_db/tests/integration.rs | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) (limited to 'log_db') diff --git a/log_db/src/common.rs b/log_db/src/common.rs index ca9f451..0f6a058 100644 --- a/log_db/src/common.rs +++ b/log_db/src/common.rs @@ -564,9 +564,11 @@ impl RangeBounds for OwnedBounds { pub struct QueryParams { pub offset: usize, pub limit: usize, + pub sort_asc: bool, } pub static DEFAULT_QUERY_PARAMS: QueryParams = QueryParams { offset: 0, limit: usize::MAX, + sort_asc: true, }; diff --git a/log_db/src/engine.rs b/log_db/src/engine.rs index 0701191..6fb9edf 100644 --- a/log_db/src/engine.rs +++ b/log_db/src/engine.rs @@ -306,13 +306,19 @@ impl Engine { tagged.extend(mapped); } + if !params.sort_asc { + tagged.reverse(); + } let bound_low = params.offset; let bound_high = (params.offset + params.limit).min(tagged.len()); let sliced = &tagged[bound_low..bound_high]; - let tagged_records = self.read_tagged_log_keys(sliced.into_iter())?; + let mut tagged_records = self.read_tagged_log_keys(sliced.into_iter())?; debug!("Read {} records", tagged_records.len()); + if !params.sort_asc { + tagged_records.reverse(); + } Ok(tagged_records) } @@ -420,15 +426,26 @@ impl Engine { self.secondary_memtables[index].range(indexable_bounds) }; - let log_key_batches: Vec<(usize, &LogKey)> = + let mut log_key_batches: Vec<(usize, &LogKey)> = log_keys.into_iter().map(|log_key| (0, log_key)).collect(); + if !params.sort_asc { + log_key_batches.reverse(); + } + let bound_low = params.offset; let bound_high = (params.offset + params.limit).min(log_key_batches.len()); let sliced = &log_key_batches[bound_low..bound_high]; let tagged_records = self.read_tagged_log_keys(sliced.into_iter()); - Ok(tagged_records?.into_iter().map(|(_, rec)| rec).collect()) + let mut result_records: Vec = + tagged_records?.into_iter().map(|(_, rec)| rec).collect(); + + if !params.sort_asc { + result_records.reverse(); + } + + Ok(result_records) } /// Ensures that the `self.metadata_file` and `self.data_file` handles are still pointing to the correct files. diff --git a/log_db/tests/integration.rs b/log_db/tests/integration.rs index e7c6d73..2012faf 100644 --- a/log_db/tests/integration.rs +++ b/log_db/tests/integration.rs @@ -909,6 +909,7 @@ fn test_find_by_with_offset_and_limit() { &QueryParams { offset: 2, limit: 3, + sort_asc: true, }, ) .unwrap() @@ -953,6 +954,7 @@ fn test_batch_find_by_with_offset_and_limit() { &QueryParams { offset: 1, limit: 2, + sort_asc: true, }, ) .unwrap() @@ -995,6 +997,7 @@ fn test_range_by_with_offset_and_limit() { &QueryParams { offset: 1, limit: 3, + sort_asc: true, }, ) .unwrap() -- cgit v1.3