icydb-core 0.144.13

IcyDB — A schema-first typed query engine and persistence runtime for Internet Computer canisters
Documentation
use crate::{
    db::{
        direction::Direction,
        index::{IndexStore, RawIndexEntry, RawIndexKey},
    },
    testing::test_memory,
    traits::Storable,
    value::StorageKey,
};
use std::{borrow::Cow, ops::Bound};

#[test]
fn visit_raw_entries_in_range_preserves_directional_store_order() {
    let mut store = IndexStore::init(test_memory(91));
    for value in [1_u8, 2, 3] {
        let raw_key = RawIndexKey::from_bytes(Cow::Owned(vec![value]));
        let raw_entry = RawIndexEntry::try_from_keys([StorageKey::Uint(u64::from(value))])
            .expect("encode index entry");
        store.insert(raw_key, raw_entry);
    }

    let lower = Bound::Included(RawIndexKey::from_bytes(Cow::Owned(vec![1])));
    let upper = Bound::Included(RawIndexKey::from_bytes(Cow::Owned(vec![3])));
    let mut asc = Vec::new();
    store
        .visit_raw_entries_in_range((&lower, &upper), Direction::Asc, |raw_key, _| {
            asc.push(raw_key.as_bytes()[0]);
            Ok(false)
        })
        .expect("asc scan should succeed");
    assert_eq!(asc, vec![1, 2, 3], "asc scan should follow raw key order");

    let mut desc = Vec::new();
    store
        .visit_raw_entries_in_range((&lower, &upper), Direction::Desc, |raw_key, _| {
            desc.push(raw_key.as_bytes()[0]);
            Ok(false)
        })
        .expect("desc scan should succeed");
    assert_eq!(
        desc,
        vec![3, 2, 1],
        "desc scan should reverse raw key order"
    );
}