diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-06 14:02:14 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-06 14:02:14 +0100 |
| commit | e3d5e9d29a558173d5e6c499695480bed83008be (patch) | |
| tree | a64ced22a1a63bbac589e26e21c8f291b3d6d929 /database | |
| parent | c914529348b8aa74a142b12f2a3b7532350d3f04 (diff) | |
| download | jellything-e3d5e9d29a558173d5e6c499695480bed83008be.tar jellything-e3d5e9d29a558173d5e6c499695480bed83008be.tar.bz2 jellything-e3d5e9d29a558173d5e6c499695480bed83008be.tar.zst | |
idk
Diffstat (limited to 'database')
| -rw-r--r-- | database/src/kv/counters.rs | 29 | ||||
| -rw-r--r-- | database/src/kv/helpers.rs | 19 | ||||
| -rw-r--r-- | database/src/kv/index.rs | 36 | ||||
| -rw-r--r-- | database/src/kv/index_key.rs | 12 | ||||
| -rw-r--r-- | database/src/kv/mod.rs | 22 |
5 files changed, 84 insertions, 34 deletions
diff --git a/database/src/kv/counters.rs b/database/src/kv/counters.rs index bcbe6a0..c5fd5f9 100644 --- a/database/src/kv/counters.rs +++ b/database/src/kv/counters.rs @@ -4,8 +4,8 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ use crate::{ - Query, RowNum, - kv::{SubtreeNum, binning::Binning}, + Query, + kv::{SubtreeNum, binning::Binning, helpers::read_counter}, }; use anyhow::Result; use jellyobject::Object; @@ -19,20 +19,6 @@ impl Counters { ob: Object<'_>, remove: bool, ) -> Result<()> { - for (b, &table) in &self.0 { - let mut k = vec![vec![]]; - b.apply(ob, &mut k); - if k.is_empty() { - continue; - } - let mut counter = read_counter(txn, table, 0)?; - if remove { - counter += k.len() as u64; - } else { - counter -= k.len() as u64; - } - write_counter(txn, table, counter)?; - } Ok(()) } pub fn count(&self, txn: &dyn jellykv::Transaction, query: &Query) -> Result<Option<u64>> { @@ -46,14 +32,3 @@ impl Counters { Ok(Some(total)) } } - -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 read_counter(txn: &dyn jellykv::Transaction, t: SubtreeNum, default: u64) -> Result<u64> { - Ok(txn - .get(&t.to_be_bytes())? - .map(|k| k.as_slice().try_into().map(RowNum::from_be_bytes).ok()) - .flatten() - .unwrap_or(default)) -} diff --git a/database/src/kv/helpers.rs b/database/src/kv/helpers.rs new file mode 100644 index 0000000..0764fe6 --- /dev/null +++ b/database/src/kv/helpers.rs @@ -0,0 +1,19 @@ +/* + 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::{RowNum, kv::SubtreeNum}; +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 read_counter(txn: &dyn jellykv::Transaction, t: SubtreeNum, default: u64) -> Result<u64> { + Ok(txn + .get(&t.to_be_bytes())? + .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 new file mode 100644 index 0000000..09242c4 --- /dev/null +++ b/database/src/kv/index.rs @@ -0,0 +1,36 @@ +/* + 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 anyhow::Result; +use jellyobject::Object; + +use crate::{ + RowNum, + kv::{ + SubtreeNum, + helpers::{read_counter, write_counter}, + index_key::{IndexKey, SortKey}, + }, +}; + +pub fn update_index( + txn: &mut dyn jellykv::Transaction, + is: SubtreeNum, + ik: IndexKey, + row: RowNum, + ob: Object<'_>, + remove: bool, +) -> Result<()> { + let mut k = vec![vec![]]; + ik.0.apply(ob, &mut k); + match ik.1 { + SortKey::None => {} + SortKey::Count => {} + SortKey::Value(path, multi_behaviour) => {} + SortKey::Text(path) => {} + } + Ok(()) +} diff --git a/database/src/kv/index_key.rs b/database/src/kv/index_key.rs index 55aa5e8..a4b2f01 100644 --- a/database/src/kv/index_key.rs +++ b/database/src/kv/index_key.rs @@ -5,13 +5,17 @@ */ use crate::{ MultiBehaviour, Sort, - kv::binning::{Binning, BinningComponent}, + kv::{ + T_INDICES, + binning::{Binning, BinningComponent}, + }, }; use jellyobject::{Path, Tag}; -pub struct IndexKey(Binning, SortKey); +#[derive(Debug)] +pub struct IndexKey(pub Binning, pub SortKey); -#[derive(Hash, PartialEq, Eq)] +#[derive(Debug, Hash, PartialEq, Eq)] pub enum SortKey { None, Count, @@ -32,11 +36,13 @@ impl Sort { impl IndexKey { pub fn to_bytes(&self) -> Vec<u8> { let mut out = Vec::new(); + out.extend(T_INDICES.to_be_bytes()); self.0.write(&mut out); self.1.write(&mut out); out } pub fn from_bytes(mut b: &[u8]) -> Self { + b = &b[4..]; // remove subtree prefix let binning = Binning::read(&mut b); let sort = SortKey::read(&mut b); assert!(b.is_empty()); diff --git a/database/src/kv/mod.rs b/database/src/kv/mod.rs index 9408916..ad1dcff 100644 --- a/database/src/kv/mod.rs +++ b/database/src/kv/mod.rs @@ -6,13 +6,21 @@ pub mod binning; pub mod counters; +pub mod helpers; +pub mod index; pub mod index_key; pub mod prefix_iterator; pub mod sort; +use std::borrow::Cow; + use crate::{ Database, Query, RowIter, RowNum, Transaction, - kv::counters::{read_counter, write_counter}, + kv::{ + helpers::{read_counter, write_counter}, + index_key::IndexKey, + prefix_iterator::PrefixIterator, + }, }; use anyhow::{Result, anyhow}; use jellyobject::ObjectBuffer; @@ -46,9 +54,15 @@ impl Transaction for &mut dyn jellykv::Transaction { )?; let ob = entry.as_object(); - // for idx in self.indices.values() { - // idx.add(txn, row, ob)?; - // } + + 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:?}"); + } Ok(row) } |