diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-17 16:25:10 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-17 16:25:10 +0100 |
| commit | 56f249065e97f854c09e5c7fdc8e345e69fcbf27 (patch) | |
| tree | 66664ee51e278af7ecb54cea83a33809fc5ab049 /database | |
| parent | 384789a6bb24bee810684a39bb60b2e1389ec154 (diff) | |
| download | jellything-56f249065e97f854c09e5c7fdc8e345e69fcbf27.tar jellything-56f249065e97f854c09e5c7fdc8e345e69fcbf27.tar.bz2 jellything-56f249065e97f854c09e5c7fdc8e345e69fcbf27.tar.zst | |
descending value sort
Diffstat (limited to 'database')
| -rw-r--r-- | database/src/kv/index.rs | 17 | ||||
| -rw-r--r-- | database/src/kv/mod.rs | 2 |
2 files changed, 17 insertions, 2 deletions
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<u8>) -> Vec<u8> { + 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(); |