Code cleanup
This commit is contained in:
1 parent
1ad991667b
commit
f66bf69ef5
32 files changed
+234
-899
No files matched your search
+7
-13
@@ -1,5 +1,6 @@
|
||||
use crate::core::srs::{FADE_PER_DAY, MAX_SCORE, WordOpenMode};
|
||||
use crate::data::{INVALID_ID, Id};
|
||||
use crate::data_provider::history::HistoryRepositoryInner;
|
||||
use chrono::{DateTime, Local, NaiveDate, Utc};
|
||||
use fsrs::MemoryState;
|
||||
use litemap::LiteMap;
|
||||
@@ -10,7 +11,6 @@ use std::hash::{Hash, Hasher};
|
||||
use std::marker::PhantomData;
|
||||
use std::sync::Arc;
|
||||
use std::time::Instant;
|
||||
use crate::data_provider::history::{HistoryRepository, HistoryRepositoryInner};
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct WordData {
|
||||
@@ -70,7 +70,7 @@ pub struct HistoryNote {
|
||||
pub answer: WordOpenMode,
|
||||
pub before: u8,
|
||||
pub after: u8,
|
||||
pub fsrs: bool
|
||||
pub fsrs: bool,
|
||||
}
|
||||
|
||||
impl EntityData for HistoryNote {
|
||||
@@ -86,17 +86,16 @@ impl EntityData for HistoryNote {
|
||||
impl HistoryRepositoryInner {
|
||||
pub fn activity_of_deck(&self, id: Id) -> Vec<(NaiveDate, u32)> {
|
||||
let mut query = self.query(Arc::new(move |note| note.deck_id == id));
|
||||
let values = query.iter(&self).collect::<Vec<_>>();
|
||||
let values = query.iter(self).collect::<Vec<_>>();
|
||||
let mut counts = vec![];
|
||||
if !values.is_empty() {
|
||||
let mut date = values[0].timestamp.with_timezone(&Local).date_naive();
|
||||
let mut count = 0;
|
||||
for note in values {
|
||||
let current_date = note.timestamp.with_timezone(&Local).date_naive();
|
||||
if date == current_date{
|
||||
if date == current_date {
|
||||
count += 1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
counts.push((date, count));
|
||||
date = current_date;
|
||||
count = 0;
|
||||
@@ -209,14 +208,9 @@ pub struct EntityHandle<E> {
|
||||
}
|
||||
|
||||
impl<T> Clone for EntityHandle<T> {
|
||||
fn clone(&self) -> Self {
|
||||
EntityHandle {
|
||||
id: self.id,
|
||||
index: self.index,
|
||||
_phantom: Default::default(),
|
||||
}
|
||||
}
|
||||
fn clone(&self) -> Self { *self }
|
||||
}
|
||||
|
||||
impl<T> Copy for EntityHandle<T> {}
|
||||
impl<T> EntityHandle<T> {
|
||||
pub fn new(id: Id, index: usize, real: bool) -> Self {
|
||||
|
||||
+74
-44
@@ -1,8 +1,9 @@
|
||||
use crate::data::Id;
|
||||
use crate::data::entities::{CardState, EntityData, EntityHandle};
|
||||
use crate::data::entities::{EntityData, EntityHandle};
|
||||
use crate::data_provider::sqlite::SqliteConnection;
|
||||
use crate::helpers::into_result;
|
||||
use crate::notification::{MaybeError, NotificationData};
|
||||
use log::debug;
|
||||
use parking_lot::{Mutex, RwLock};
|
||||
use rayon::iter::IndexedParallelIterator;
|
||||
use rayon::iter::IntoParallelRefIterator;
|
||||
@@ -12,7 +13,6 @@ use std::marker::PhantomData;
|
||||
use std::ops::{Deref, Index, IndexMut};
|
||||
use std::sync::Arc;
|
||||
use std::time::Instant;
|
||||
use log::debug;
|
||||
|
||||
pub trait Repository<T, D>
|
||||
where
|
||||
@@ -31,13 +31,19 @@ where
|
||||
fn create_now(&mut self, new: T) -> Result<EntityHandle<T>, NotificationData>;
|
||||
fn save(&mut self, entity: &mut EntityHandle<T>) -> MaybeError;
|
||||
fn delete(&mut self, handle: EntityHandle<T>) -> MaybeError;
|
||||
fn find<F>(&self, predicate: F) -> Option<EntityHandle<T>> where F : Fn(&T) -> bool;
|
||||
fn find<F>(&self, predicate: F) -> Option<EntityHandle<T>>
|
||||
where
|
||||
F: Fn(&T) -> bool;
|
||||
fn init(&mut self) -> MaybeError;
|
||||
fn start(&mut self) -> MaybeError;
|
||||
fn reload(&mut self) -> MaybeError;
|
||||
fn shifts(&self) -> usize;
|
||||
fn iter<'a>(&'a self) -> impl Iterator<Item = &'a T> where T: 'a;
|
||||
fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T> where T: 'a;
|
||||
fn iter<'a>(&'a self) -> impl Iterator<Item = &'a T>
|
||||
where
|
||||
T: 'a;
|
||||
fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T>
|
||||
where
|
||||
T: 'a;
|
||||
}
|
||||
|
||||
struct QueryManger<T, R, D>
|
||||
@@ -88,9 +94,7 @@ where
|
||||
.filter(|(_, q)| {
|
||||
let query = q.lock();
|
||||
let rule = &query.rule;
|
||||
return rule(data);
|
||||
|
||||
false
|
||||
rule(data)
|
||||
})
|
||||
.map(|(i, _)| i)
|
||||
.collect()
|
||||
@@ -118,7 +122,10 @@ where
|
||||
}
|
||||
|
||||
impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> Query<T, R, D> {
|
||||
pub fn iter<'a>(&mut self, data_repository_inner: &'a DataRepositoryInner<T, D>) -> impl Iterator<Item = &'a T>
|
||||
pub fn iter<'a>(
|
||||
&mut self,
|
||||
data_repository_inner: &'a DataRepositoryInner<T, D>,
|
||||
) -> impl Iterator<Item = &'a T>
|
||||
where
|
||||
T: 'a,
|
||||
{
|
||||
@@ -130,7 +137,10 @@ impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> Qu
|
||||
.filter_map(move |e| data_repository_inner.get_ref(e))
|
||||
}
|
||||
|
||||
pub fn iter_with_handles<'a>(&mut self, data_repository_inner: &'a DataRepositoryInner<T, D>) -> impl Iterator<Item = (&'a T, EntityHandle<T>)>
|
||||
pub fn iter_with_handles<'a>(
|
||||
&mut self,
|
||||
data_repository_inner: &'a DataRepositoryInner<T, D>,
|
||||
) -> impl Iterator<Item = (&'a T, EntityHandle<T>)>
|
||||
where
|
||||
T: 'a,
|
||||
{
|
||||
@@ -139,9 +149,9 @@ impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> Qu
|
||||
}
|
||||
self.cache
|
||||
.iter_mut()
|
||||
.filter_map(move |e| Some((data_repository_inner.get_ref(e)?, e.clone())))
|
||||
.filter_map(move |e| Some((data_repository_inner.get_ref(e)?, *e)))
|
||||
}
|
||||
|
||||
|
||||
pub fn for_each_mut<F>(&mut self, repo: &mut DataRepositoryInner<T, D>, mut f: F)
|
||||
where
|
||||
F: FnMut(&mut T),
|
||||
@@ -190,19 +200,26 @@ impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> Qu
|
||||
.collect::<Vec<_>>(),
|
||||
);
|
||||
|
||||
debug!("Query for {} elements (filtered {}) takes {:?}", data_repository.len(), self.cache.len(), time.elapsed());
|
||||
debug!(
|
||||
"Query for {} elements (filtered {}) takes {:?}",
|
||||
data_repository.len(),
|
||||
self.cache.len(),
|
||||
time.elapsed()
|
||||
);
|
||||
}
|
||||
|
||||
pub fn handles(&self) -> impl Iterator<Item = EntityHandle<T>> {
|
||||
self.cache.iter().cloned()
|
||||
}
|
||||
|
||||
|
||||
pub fn len(&self) -> usize {
|
||||
self.cache.len()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> Index<usize> for Query<T, R, D> {
|
||||
impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> Index<usize>
|
||||
for Query<T, R, D>
|
||||
{
|
||||
type Output = EntityHandle<T>;
|
||||
|
||||
fn index(&self, index: usize) -> &Self::Output {
|
||||
@@ -210,7 +227,9 @@ impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> In
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> IndexMut<usize> for Query<T, R, D> {
|
||||
impl<T: EntityData + Clone + Send + Sync, R: Repository<T, D>, D: DbLayer<T>> IndexMut<usize>
|
||||
for Query<T, R, D>
|
||||
{
|
||||
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
|
||||
&mut self.cache[index]
|
||||
}
|
||||
@@ -221,7 +240,10 @@ where
|
||||
D: BatchedDbLayer<T>,
|
||||
T: EntityData,
|
||||
{
|
||||
fn create_now_many(&mut self, entities: &mut [T]) -> Result<Vec<EntityHandle<T>>, NotificationData>;
|
||||
fn create_now_many(
|
||||
&mut self,
|
||||
entities: &mut [T],
|
||||
) -> Result<Vec<EntityHandle<T>>, NotificationData>;
|
||||
fn save_many(&mut self, handles: &mut [EntityHandle<T>]) -> MaybeError;
|
||||
fn delete_many(&mut self, handles: &mut [EntityHandle<T>]) -> MaybeError;
|
||||
}
|
||||
@@ -257,10 +279,10 @@ pub struct DataRepositoryInner<T: Clone + EntityData, D: DbLayer<T>> {
|
||||
shifts: usize,
|
||||
}
|
||||
|
||||
impl<T: Clone + EntityData, D: DbLayer<T> + Default> DataRepository<T, D> {
|
||||
impl<T: Clone + EntityData, D: DbLayer<T> + Default> DataRepository<T, D> {
|
||||
pub fn new(connection: Arc<Mutex<SqliteConnection>>) -> DataRepository<T, D> {
|
||||
Self{
|
||||
inner: Arc::new(RwLock::new(DataRepositoryInner{
|
||||
Self {
|
||||
inner: Arc::new(RwLock::new(DataRepositoryInner {
|
||||
cache: vec![],
|
||||
temporal: vec![],
|
||||
next_temporal: 0,
|
||||
@@ -274,7 +296,6 @@ impl<T: Clone + EntityData, D: DbLayer<T> + Default> DataRepository<T, D> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<T: Clone + EntityData, D: DbLayer<T>> Deref for DataRepository<T, D> {
|
||||
type Target = Arc<RwLock<DataRepositoryInner<T, D>>>;
|
||||
|
||||
@@ -283,7 +304,9 @@ impl<T: Clone + EntityData, D: DbLayer<T>> Deref for DataRepository<T, D> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: EntityData + Clone + std::marker::Send + std::marker::Sync, D: DbLayer<T>> DataRepositoryInner<T, D> {
|
||||
impl<T: EntityData + Clone + std::marker::Send + std::marker::Sync, D: DbLayer<T>>
|
||||
DataRepositoryInner<T, D>
|
||||
{
|
||||
pub fn query_par(
|
||||
&self,
|
||||
rule: Arc<dyn Fn(&T) -> bool + Send + Sync>,
|
||||
@@ -306,7 +329,7 @@ impl<T: EntityData + Clone + std::marker::Send + std::marker::Sync, D: DbLayer<T
|
||||
|
||||
pub fn query(
|
||||
&self,
|
||||
rule: Arc<dyn Fn(& T) -> bool + Send + Sync>,
|
||||
rule: Arc<dyn Fn(&T) -> bool + Send + Sync>,
|
||||
) -> Query<T, DataRepositoryInner<T, D>, D>
|
||||
where
|
||||
T: Send + Sync,
|
||||
@@ -323,9 +346,9 @@ impl<T: EntityData + Clone + std::marker::Send + std::marker::Sync, D: DbLayer<T
|
||||
|
||||
query
|
||||
}
|
||||
|
||||
|
||||
pub fn empty_query(&self) -> Query<T, DataRepositoryInner<T, D>, D> {
|
||||
Query{
|
||||
Query {
|
||||
cache: vec![],
|
||||
rule: Arc::new(|_| false),
|
||||
parallel: false,
|
||||
@@ -335,7 +358,7 @@ impl<T: EntityData + Clone + std::marker::Send + std::marker::Sync, D: DbLayer<T
|
||||
}
|
||||
|
||||
pub fn empty_query_par(&self) -> Query<T, DataRepositoryInner<T, D>, D> {
|
||||
Query{
|
||||
Query {
|
||||
cache: vec![],
|
||||
rule: Arc::new(|_| false),
|
||||
parallel: true,
|
||||
@@ -433,7 +456,7 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
||||
}
|
||||
|
||||
fn save(&mut self, entity: &mut EntityHandle<T>) -> MaybeError {
|
||||
let original_state = entity.clone();
|
||||
let original_state = *entity;
|
||||
if entity.real() {
|
||||
let data = self.get_ref(entity).unwrap();
|
||||
self.data_layer
|
||||
@@ -441,12 +464,11 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
||||
} else {
|
||||
let index = fast_position_of(self.temporal.as_slice(), entity).unwrap();
|
||||
let data = &mut self.temporal[index];
|
||||
self.data_layer
|
||||
.add_entity(data, &self.connection.lock())?;
|
||||
self.data_layer.add_entity(data, &self.connection.lock())?;
|
||||
entity.set_real(true);
|
||||
entity.id = data.id();
|
||||
entity.set_index(self.cache.len());
|
||||
self.query_manger.handle_save(original_state, entity, &data);
|
||||
self.query_manger.handle_save(original_state, entity, data);
|
||||
|
||||
let data = self.temporal.remove(index);
|
||||
self.cache.push(data);
|
||||
@@ -477,16 +499,16 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
||||
|
||||
fn find<F>(&self, predicate: F) -> Option<EntityHandle<T>>
|
||||
where
|
||||
F: Fn(&T) -> bool
|
||||
F: Fn(&T) -> bool,
|
||||
{
|
||||
if let Some(index) = self.cache.iter().position(|entity| predicate(entity)){
|
||||
if let Some(index) = self.cache.iter().position(&predicate) {
|
||||
let value = &self.cache[index];
|
||||
return Some(EntityHandle::new(value.id(), index, true))
|
||||
return Some(EntityHandle::new(value.id(), index, true));
|
||||
}
|
||||
|
||||
if let Some(index) = self.temporal.iter().position(|entity| predicate(entity)){
|
||||
if let Some(index) = self.temporal.iter().position(predicate) {
|
||||
let value = &self.temporal[index];
|
||||
return Some(EntityHandle::new(value.id(), index, false))
|
||||
return Some(EntityHandle::new(value.id(), index, false));
|
||||
}
|
||||
None
|
||||
}
|
||||
@@ -518,16 +540,16 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
||||
self.shifts
|
||||
}
|
||||
|
||||
fn iter<'a>(&'a self) -> impl Iterator<Item=&'a T>
|
||||
fn iter<'a>(&'a self) -> impl Iterator<Item = &'a T>
|
||||
where
|
||||
T: 'a
|
||||
T: 'a,
|
||||
{
|
||||
self.cache.iter().chain(self.temporal.iter())
|
||||
}
|
||||
|
||||
fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item=&'a mut T>
|
||||
fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T>
|
||||
where
|
||||
T: 'a
|
||||
T: 'a,
|
||||
{
|
||||
self.cache.iter_mut().chain(self.temporal.iter_mut())
|
||||
}
|
||||
@@ -535,10 +557,18 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
||||
impl<T: EntityData + Clone, D: BatchedDbLayer<T> + DbLayer<T>> BatchedRepository<T, D>
|
||||
for DataRepositoryInner<T, D>
|
||||
{
|
||||
fn create_now_many(&mut self, entities: &mut [T]) -> Result<Vec<EntityHandle<T>>, NotificationData> {
|
||||
self.data_layer.add_many_entities(entities, &mut self.connection.lock())?;
|
||||
fn create_now_many(
|
||||
&mut self,
|
||||
entities: &mut [T],
|
||||
) -> Result<Vec<EntityHandle<T>>, NotificationData> {
|
||||
self.data_layer
|
||||
.add_many_entities(entities, &mut self.connection.lock())?;
|
||||
let len = self.cache.len();
|
||||
let handles = entities.iter().enumerate().map(|(index, entity)| {EntityHandle::new(entity.id(), index + len, true)}).collect();
|
||||
let handles = entities
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(index, entity)| EntityHandle::new(entity.id(), index + len, true))
|
||||
.collect();
|
||||
self.cache.extend(entities.to_vec());
|
||||
Ok(handles)
|
||||
}
|
||||
@@ -577,7 +607,7 @@ impl<T: EntityData + Clone, D: BatchedDbLayer<T> + DbLayer<T>> BatchedRepository
|
||||
let start = self.cache.len();
|
||||
|
||||
for (i, (handle, data)) in temp.into_iter().zip(&mut temp_values).enumerate() {
|
||||
let old = handle.clone();
|
||||
let old = *handle;
|
||||
handle.id = data.id();
|
||||
handle.set_index(start + i);
|
||||
handle.set_real(true);
|
||||
@@ -641,7 +671,7 @@ where
|
||||
{
|
||||
let mut temp = Vec::with_capacity(handles.len() / 2);
|
||||
let mut cached = Vec::with_capacity(handles.len() / 2);
|
||||
handles.sort_by(|a, b| a.id.cmp(&b.id));
|
||||
handles.sort_by_key(|a| a.id);
|
||||
handles.iter().for_each(|handle| {
|
||||
if handle.real() {
|
||||
cached.push(getter(handle))
|
||||
|
||||
Reference in new issue
Block a user