aboutsummaryrefslogtreecommitdiff
path: root/database/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-17 16:25:10 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-17 16:25:10 +0100
commit56f249065e97f854c09e5c7fdc8e345e69fcbf27 (patch)
tree66664ee51e278af7ecb54cea83a33809fc5ab049 /database/src
parent384789a6bb24bee810684a39bb60b2e1389ec154 (diff)
downloadjellything-56f249065e97f854c09e5c7fdc8e345e69fcbf27.tar
jellything-56f249065e97f854c09e5c7fdc8e345e69fcbf27.tar.bz2
jellything-56f249065e97f854c09e5c7fdc8e345e69fcbf27.tar.zst
descending value sort
Diffstat (limited to 'database/src')
-rw-r--r--database/src/kv/index.rs17
-rw-r--r--database/src/kv/mod.rs2
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();