/* 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 */ use crate::{ backends::WriteTransaction, filter::binning::Binning, sort::Index, table::{RowNum, TableNum}, }; use anyhow::Result; use jellyobject::Object; pub struct UnsortedIndex { id: TableNum, binning: Binning, } impl UnsortedIndex { pub fn new(id: TableNum, binning: Binning) -> Self { Self { id, binning } } fn keys(&self, id: RowNum, ob: Object) -> Vec> { let mut keys = vec![self.id.to_be_bytes().to_vec()]; self.binning.apply(ob, &mut keys); for k in &mut keys { k.extend(id.to_ne_bytes()); } keys } } impl Index for UnsortedIndex { fn add(&self, db: &mut dyn WriteTransaction, id: RowNum, ob: Object) -> Result<()> { for key in self.keys(id, ob) { db.set(&key, &[])?; } Ok(()) } fn remove(&self, db: &mut dyn WriteTransaction, id: RowNum, ob: Object) -> Result<()> { for key in self.keys(id, ob) { db.del(&key)?; } Ok(()) } fn compare(&self, before: Object, after: Object) -> bool { self.keys(0, before) == self.keys(0, after) } }