aboutsummaryrefslogtreecommitdiff
path: root/database/src/kv/index.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-22 03:22:24 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-22 03:22:24 +0100
commiteb46c37ebf2453f334bac086dbf9e91837dd082b (patch)
treea91cd7b7b0516486648dda88da8df5ab6d38713f /database/src/kv/index.rs
parente6b999628da34713fb0686e094b2b7aceb26b989 (diff)
downloadjellything-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.rs38
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
+}