aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-17 15:16:34 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-17 15:16:34 +0100
commit7245f956b217abba0c2b0bed507a7ea47d115b07 (patch)
tree545fb1d8858ab100e03e05e7c1a399ade89b6c60
parent5c83df829b57f685f1c2b5e2e9e1c99dfda8eb00 (diff)
downloadjellything-7245f956b217abba0c2b0bed507a7ea47d115b07.tar
jellything-7245f956b217abba0c2b0bed507a7ea47d115b07.tar.bz2
jellything-7245f956b217abba0c2b0bed507a7ea47d115b07.tar.zst
implement basic value sort
-rw-r--r--database/src/kv/index.rs36
1 files changed, 33 insertions, 3 deletions
diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs
index 23b8349..c8f9259 100644
--- a/database/src/kv/index.rs
+++ b/database/src/kv/index.rs
@@ -5,7 +5,7 @@
*/
use crate::{
- RowNum, Sort,
+ MultiBehaviour, RowNum, Sort, SortOrder,
kv::{
SubtreeNum,
helpers::{read_counter, write_counter},
@@ -48,7 +48,20 @@ pub fn update_index(
write_counter(txn, &k, c)?;
}
}
- SortKey::Value(path, multi_behaviour) => {}
+ SortKey::Value(path, multi_behaviour) => {
+ assert_eq!(*multi_behaviour, MultiBehaviour::First, "TODO");
+ if let Some(value) = path.get_matching_value(ob) {
+ for mut k in ks {
+ k.extend(value);
+ k.extend(row.to_be_bytes());
+ if remove {
+ txn.del(&k)?;
+ } else {
+ txn.set(&k, &[])?;
+ }
+ }
+ }
+ }
SortKey::Text(path) => {}
}
Ok(())
@@ -78,7 +91,24 @@ pub fn iter_index<'a>(
})
}),
),
- Sort::Value(value_sort) => todo!(),
+ 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)?,
+ prefix: prefix.into(),
+ }
+ .map(|k| {
+ k.map(|k| {
+ (
+ RowNum::from_be_bytes(k[k.len() - 8..].try_into().unwrap()),
+ k[4..].to_vec(),
+ )
+ })
+ }),
+ )
+ }
Sort::TextSearch(path, _) => todo!(),
})
}