From 56f249065e97f854c09e5c7fdc8e345e69fcbf27 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 17 Feb 2026 16:25:10 +0100 Subject: descending value sort --- database/src/kv/index.rs | 17 +++++++++++++++-- database/src/kv/mod.rs | 2 ++ 2 files changed, 17 insertions(+), 2 deletions(-) (limited to 'database') diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs index c8f9259..7a3a5b1 100644 --- a/database/src/kv/index.rs +++ b/database/src/kv/index.rs @@ -93,10 +93,12 @@ pub fn iter_index<'a>( ), Sort::Value(value_sort) => { assert!(value_sort.offset.is_none(), "TODO"); - assert_eq!(value_sort.order, SortOrder::Ascending, "TODO"); Box::new( PrefixIterator { - inner: txn.iter(&prefix, false)?, + inner: match value_sort.order { + SortOrder::Ascending => txn.iter(&prefix, false)?, + SortOrder::Descending => txn.iter(&prefix_end(prefix.clone()), true)?, + }, prefix: prefix.into(), } .map(|k| { @@ -112,3 +114,14 @@ pub fn iter_index<'a>( Sort::TextSearch(path, _) => todo!(), }) } + +fn prefix_end(mut prefix: Vec) -> Vec { + for v in prefix.iter_mut().rev() { + let (nv, carry) = v.overflowing_add(1); + *v = nv; + if !carry { + break; + } + } + prefix +} diff --git a/database/src/kv/mod.rs b/database/src/kv/mod.rs index 87af3fa..90b6686 100644 --- a/database/src/kv/mod.rs +++ b/database/src/kv/mod.rs @@ -69,6 +69,7 @@ impl Transaction for &mut dyn jellykv::Transaction { Ok(row) } fn remove(&mut self, row: RowNum) -> Result<()> { + debug!("remove {row}"); let entry = self.get(row)?.ok_or(anyhow!("row did not exist"))?; let ob = entry.as_object(); for (is, ik) in list_indices(*self)? { @@ -77,6 +78,7 @@ impl Transaction for &mut dyn jellykv::Transaction { jellykv::Transaction::del(*self, &row_key(row)) } fn update(&mut self, row: RowNum, entry: ObjectBuffer) -> Result<()> { + debug!("update {row}"); let before = self.get(row)?.ok_or(anyhow!("row to update missing"))?; let before = before.as_object(); let after = entry.as_object(); -- cgit v1.3