diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-17 15:16:34 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-17 15:16:34 +0100 |
| commit | 7245f956b217abba0c2b0bed507a7ea47d115b07 (patch) | |
| tree | 545fb1d8858ab100e03e05e7c1a399ade89b6c60 /database | |
| parent | 5c83df829b57f685f1c2b5e2e9e1c99dfda8eb00 (diff) | |
| download | jellything-7245f956b217abba0c2b0bed507a7ea47d115b07.tar jellything-7245f956b217abba0c2b0bed507a7ea47d115b07.tar.bz2 jellything-7245f956b217abba0c2b0bed507a7ea47d115b07.tar.zst | |
implement basic value sort
Diffstat (limited to 'database')
| -rw-r--r-- | database/src/kv/index.rs | 36 |
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!(), }) } |