aboutsummaryrefslogtreecommitdiffstats
path: root/log_db
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2025-05-02 23:38:23 +0300
committerJan Tuomi <jan@jantuomi.fi>2025-05-02 23:38:23 +0300
commite17048eddfe2df86abd2d498da2a33b9c3dd8a72 (patch)
tree4e6799cdfb0e05c9df499bcf8ec4d33d8d5ec3fd /log_db
parentef72b74ec34e95a38890d542cda298dd6565d5ad (diff)
Add sort_asc param, impl demo chat app
Diffstat (limited to 'log_db')
-rw-r--r--log_db/src/common.rs2
-rw-r--r--log_db/src/engine.rs23
-rw-r--r--log_db/tests/integration.rs3
3 files changed, 25 insertions, 3 deletions
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<T> RangeBounds<T> for OwnedBounds<T> {
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<Row> =
+ 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()