diff options
Diffstat (limited to 'database/src/kv/index.rs')
| -rw-r--r-- | database/src/kv/index.rs | 17 |
1 files changed, 15 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 +} |