diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-22 03:22:24 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-22 03:22:24 +0100 |
| commit | eb46c37ebf2453f334bac086dbf9e91837dd082b (patch) | |
| tree | a91cd7b7b0516486648dda88da8df5ab6d38713f /database/src/kv/index.rs | |
| parent | e6b999628da34713fb0686e094b2b7aceb26b989 (diff) | |
| download | jellything-eb46c37ebf2453f334bac086dbf9e91837dd082b.tar jellything-eb46c37ebf2453f334bac086dbf9e91837dd082b.tar.bz2 jellything-eb46c37ebf2453f334bac086dbf9e91837dd082b.tar.zst | |
db random sort
Diffstat (limited to 'database/src/kv/index.rs')
| -rw-r--r-- | database/src/kv/index.rs | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs index 7a3a5b1..60d291c 100644 --- a/database/src/kv/index.rs +++ b/database/src/kv/index.rs @@ -15,6 +15,7 @@ use crate::{ }; use anyhow::Result; use jellyobject::Object; +use std::iter::empty; pub fn update_index( txn: &mut dyn jellykv::Transaction, @@ -37,6 +38,16 @@ pub fn update_index( } } } + SortKey::Random => { + for mut k in ks { + k.extend(randomize(row).to_be_bytes()); + if remove { + txn.del(&k)?; + } else { + txn.set(&k, &row.to_be_bytes())?; + } + } + } SortKey::Count => { for k in ks { let mut c = read_counter(txn, &k, 0)?; @@ -62,7 +73,7 @@ pub fn update_index( } } } - SortKey::Text(path) => {} + SortKey::Text(_) => todo!(), } Ok(()) } @@ -91,6 +102,20 @@ pub fn iter_index<'a>( }) }), ), + Sort::Random(seed) => { + let mut k = prefix.clone(); + k.extend(randomize(*seed).to_be_bytes()); + let Some(it) = txn.iter(&k, false)?.next() else { + return Ok(Box::new(empty())); + }; + let res = it?; + if !res.starts_with(&prefix) { + return Ok(Box::new(empty())); + } + let r = txn.get(&res)?.unwrap(); + let row = RowNum::from_be_bytes(r.try_into().unwrap()); + Box::new([Ok((row, vec![]))].into_iter()) + } Sort::Value(value_sort) => { assert!(value_sort.offset.is_none(), "TODO"); Box::new( @@ -111,7 +136,7 @@ pub fn iter_index<'a>( }), ) } - Sort::TextSearch(path, _) => todo!(), + Sort::TextSearch(_, _) => todo!(), }) } @@ -125,3 +150,12 @@ fn prefix_end(mut prefix: Vec<u8>) -> Vec<u8> { } prefix } + +fn randomize(mut x: u64) -> u64 { + for _ in 0..15 { + x ^= x << 13; + x ^= x >> 7; + x ^= x << 17; + } + x +} |