aboutsummaryrefslogtreecommitdiff
path: root/database/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-08 01:18:59 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-08 01:18:59 +0100
commit2ea9c54d755d808a8030602d667979e270381933 (patch)
tree00deebad391259ff607042fbdb69e5743421684a /database/src
parente3d5e9d29a558173d5e6c499695480bed83008be (diff)
downloadjellything-2ea9c54d755d808a8030602d667979e270381933.tar
jellything-2ea9c54d755d808a8030602d667979e270381933.tar.bz2
jellything-2ea9c54d755d808a8030602d667979e270381933.tar.zst
list index; generalize counters; count and none index
Diffstat (limited to 'database/src')
-rw-r--r--database/src/kv/counters.rs34
-rw-r--r--database/src/kv/helpers.rs10
-rw-r--r--database/src/kv/index.rs27
-rw-r--r--database/src/kv/mod.rs30
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());