From 89aa1abc13f2ed80ebba21f2ce2d389664237f84 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Thu, 27 Aug 2026 14:05:05 +0300 Subject: [PATCH] Query partial code --- src/data/repositories.rs | 41 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/data/repositories.rs b/src/data/repositories.rs index d517e3a..3c723ba 100644 --- a/src/data/repositories.rs +++ b/src/data/repositories.rs @@ -5,6 +5,8 @@ use parking_lot::{Mutex, RwLock}; use rusqlite::Connection; use std::marker::PhantomData; use std::ops::Deref; +use std::rc::Weak; +use std::slice::Iter; use std::sync::Arc; pub trait Repository @@ -20,6 +22,32 @@ where fn delete(&mut self, handle: EntityHandle) -> MaybeError; fn init(&mut self) -> MaybeError; fn reload(&mut self) -> MaybeError; + fn query(&mut self, rule: fn(&T) -> bool) -> Query where Self: Sized; +} + +struct QueryManger +where + R: Repository, + D: DbLayer, +{ + queries: Mutex>>>, +} + +pub struct Query +where + R: Repository, D: DbLayer +{ + cache: Vec>, + rule: fn(&T) -> bool, + repo: Arc, + _marker: PhantomData, +} + +impl, D: DbLayer> Query +{ + fn iter<'a>(&mut self, data_repository_inner: &'a R) -> Iter<'_, &'a T> { + self.cache.iter_mut().filter_map(|e| data_repository_inner.get_ref(e)) + } } pub trait BatchedRepository @@ -47,19 +75,20 @@ where } #[derive(Clone)] -pub struct DataRepository { +pub struct DataRepository> { inner: Arc>>, } -pub struct DataRepositoryInner { +pub struct DataRepositoryInner> { cache: Vec, temporal: Vec, next_temporal: u32, connection: Arc>, data_layer: D, + query_manger: QueryManger } -impl Deref for DataRepository { +impl> Deref for DataRepository { type Target = Arc>>; fn deref(&self) -> &Self::Target { @@ -196,9 +225,13 @@ impl> Repository for DataRepositoryIn self.init()?; Ok(()) } + + fn query(&mut self, rule: fn(&T) -> bool) -> Query { + todo!() + } } impl + DbLayer> BatchedRepository -for DataRepositoryInner + for DataRepositoryInner { fn save_many(&mut self, handles: &mut [EntityHandle]) -> MaybeError { let mut temp = Vec::with_capacity(handles.len() / 2);