diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-08 01:18:59 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-08 01:18:59 +0100 |
| commit | 2ea9c54d755d808a8030602d667979e270381933 (patch) | |
| tree | 00deebad391259ff607042fbdb69e5743421684a /database | |
| parent | e3d5e9d29a558173d5e6c499695480bed83008be (diff) | |
| download | jellything-2ea9c54d755d808a8030602d667979e270381933.tar jellything-2ea9c54d755d808a8030602d667979e270381933.tar.bz2 jellything-2ea9c54d755d808a8030602d667979e270381933.tar.zst | |
list index; generalize counters; count and none index
Diffstat (limited to 'database')
| -rw-r--r-- | database/src/kv/counters.rs | 34 | ||||
| -rw-r--r-- | database/src/kv/helpers.rs | 10 | ||||
| -rw-r--r-- | database/src/kv/index.rs | 27 | ||||
| -rw-r--r-- | database/src/kv/mod.rs | 30 |
4 files changed, 48 insertions, 53 deletions
diff --git a/database/src/kv/counters.rs b/database/src/kv/counters.rs deleted file mode 100644 index c5fd5f9..0000000 --- a/database/src/kv/counters.rs +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of jellything (https://codeberg.org/metamuffin/jellything) - which is licensed under the GNU Affero General Public License (version 3); see /COPYING. - Copyright (C) 2026 metamuffin <metamuffin.org> -*/ -use crate::{ - Query, - kv::{SubtreeNum, binning::Binning, helpers::read_counter}, -}; -use anyhow::Result; -use jellyobject::Object; -use std::collections::HashMap; - -pub(crate) struct Counters(pub HashMap<Binning, SubtreeNum>); -impl Counters { - pub fn update( - &self, - txn: &mut dyn jellykv::Transaction, - ob: Object<'_>, - remove: bool, - ) -> Result<()> { - Ok(()) - } - pub fn count(&self, txn: &dyn jellykv::Transaction, query: &Query) -> Result<Option<u64>> { - let mut total = 0; - for binning in query.filter.get_bins() { - let Some(b) = self.0.get(&binning) else { - return Ok(None); - }; - total += read_counter(txn, *b, 0)?; - } - Ok(Some(total)) - } -} diff --git a/database/src/kv/helpers.rs b/database/src/kv/helpers.rs index 0764fe6..dde067f 100644 --- a/database/src/kv/helpers.rs +++ b/database/src/kv/helpers.rs @@ -4,15 +4,15 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ -use crate::{RowNum, kv::SubtreeNum}; +use crate::RowNum; use anyhow::Result; -pub fn write_counter(txn: &mut dyn jellykv::Transaction, t: SubtreeNum, value: u64) -> Result<()> { - txn.set(&t.to_be_bytes(), &value.to_be_bytes()) +pub fn write_counter(txn: &mut dyn jellykv::Transaction, t: &[u8], value: u64) -> Result<()> { + txn.set(t, &value.to_be_bytes()) } -pub fn read_counter(txn: &dyn jellykv::Transaction, t: SubtreeNum, default: u64) -> Result<u64> { +pub fn read_counter(txn: &dyn jellykv::Transaction, t: &[u8], default: u64) -> Result<u64> { Ok(txn - .get(&t.to_be_bytes())? + .get(t)? .map(|k| k.as_slice().try_into().map(RowNum::from_be_bytes).ok()) .flatten() .unwrap_or(default)) diff --git a/database/src/kv/index.rs b/database/src/kv/index.rs index 09242c4..27aabd6 100644 --- a/database/src/kv/index.rs +++ b/database/src/kv/index.rs @@ -24,11 +24,30 @@ pub fn update_index( ob: Object<'_>, remove: bool, ) -> Result<()> { - let mut k = vec![vec![]]; - ik.0.apply(ob, &mut k); + let mut ks = vec![is.to_be_bytes().to_vec()]; + ik.0.apply(ob, &mut ks); match ik.1 { - SortKey::None => {} - SortKey::Count => {} + SortKey::None => { + for mut k in ks { + k.extend(row.to_be_bytes()); + if remove { + txn.del(&k)?; + } else { + txn.set(&k, &[])?; + } + } + } + SortKey::Count => { + for k in ks { + let mut c = read_counter(txn, &k, 0)?; + if remove { + c -= 1; + } else { + c += 1; + } + write_counter(txn, &k, c)?; + } + } SortKey::Value(path, multi_behaviour) => {} SortKey::Text(path) => {} } diff --git a/database/src/kv/mod.rs b/database/src/kv/mod.rs index ad1dcff..1a058a7 100644 --- a/database/src/kv/mod.rs +++ b/database/src/kv/mod.rs @@ -5,7 +5,6 @@ */ pub mod binning; -pub mod counters; pub mod helpers; pub mod index; pub mod index_key; @@ -18,6 +17,7 @@ use crate::{ Database, Query, RowIter, RowNum, Transaction, kv::{ helpers::{read_counter, write_counter}, + index::update_index, index_key::IndexKey, prefix_iterator::PrefixIterator, }, @@ -42,10 +42,10 @@ impl<T: jellykv::Store> Database for T { impl Transaction for &mut dyn jellykv::Transaction { fn insert(&mut self, entry: ObjectBuffer) -> Result<RowNum> { - let mut id_counter = read_counter(*self, T_ROW_COUNTER, 0)?; + let mut id_counter = read_counter(*self, &T_ROW_COUNTER.to_be_bytes(), 0)?; let row = id_counter; id_counter += 1; - write_counter(*self, T_ROW_COUNTER, id_counter)?; + write_counter(*self, &T_ROW_COUNTER.to_be_bytes(), id_counter)?; jellykv::Transaction::set( *self, @@ -55,13 +55,8 @@ impl Transaction for &mut dyn jellykv::Transaction { let ob = entry.as_object(); - let indices = PrefixIterator { - inner: jellykv::Transaction::iter(*self, &T_INDICES.to_be_bytes(), false)?, - prefix: Cow::Borrowed(&T_INDICES.to_be_bytes()), - }; - for i in indices { - let ik = IndexKey::from_bytes(&i?); - eprintln!("{ik:?}"); + for (is, ik) in list_indices(*self)? { + update_index(*self, is, ik, row, ob, false)?; } Ok(row) @@ -125,6 +120,21 @@ impl Transaction for &mut dyn jellykv::Transaction { } } +fn list_indices(txn: &dyn jellykv::Transaction) -> Result<Vec<(SubtreeNum, IndexKey)>> { + let indices = PrefixIterator { + inner: jellykv::Transaction::iter(txn, &T_INDICES.to_be_bytes(), false)?, + prefix: Cow::Borrowed(&T_INDICES.to_be_bytes()), + }; + let mut out = Vec::new(); + for i in indices { + let i = i?; + let ik = IndexKey::from_bytes(&i); + let is = read_counter(txn, &i, 0)? as SubtreeNum; + out.push((is, ik)); + } + Ok(out) +} + fn row_key(row: RowNum) -> Vec<u8> { let mut key = Vec::new(); key.extend(T_ROWS.to_be_bytes()); |