aboutsummaryrefslogtreecommitdiff
path: root/database
diff options
context:
space:
mode:
Diffstat (limited to 'database')
-rw-r--r--database/src/kv/index.rs28
1 files changed, 21 insertions, 7 deletions
diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs
index dd2471b..5505079 100644
--- a/database/src/kv/index.rs
+++ b/database/src/kv/index.rs
@@ -127,17 +127,21 @@ pub fn iter_index<'a>(
}
Sort::Value(value_sort) => {
assert!(value_sort.offset.is_none(), "TODO");
- let mut start = prefix.clone();
+ let (mut start, rev) = match value_sort.order {
+ SortOrder::Ascending => (prefix.clone(), false),
+ SortOrder::Descending => (inc_key(prefix.clone()), true),
+ };
if let Some(resume) = resume {
- start.extend(resume);
- start = inc_key(start);
+ start = prefix.iter().copied().chain(resume).collect();
+ if rev {
+ start = dec_key(start);
+ } else {
+ start = inc_key(start);
+ }
}
Box::new(
PrefixIterator {
- inner: match value_sort.order {
- SortOrder::Ascending => txn.iter(&start, false)?,
- SortOrder::Descending => txn.iter(&inc_key(prefix.clone()), true)?,
- },
+ inner: txn.iter(&start, rev)?,
prefix: prefix.clone().into(),
}
.map(move |k| {
@@ -164,6 +168,16 @@ fn inc_key(mut k: Vec<u8>) -> Vec<u8> {
}
k
}
+fn dec_key(mut k: Vec<u8>) -> Vec<u8> {
+ for v in k.iter_mut().rev() {
+ let (nv, carry) = v.overflowing_sub(1);
+ *v = nv;
+ if !carry {
+ break;
+ }
+ }
+ k
+}
fn randomize(mut x: u64) -> u64 {
for _ in 0..15 {