Working repetitions
This commit is contained in:
1 parent
242b56fc21
commit
2e04450c76
7 files changed
+163
-260
No files matched your search
@@ -1,5 +1,6 @@
|
||||
use std::sync::Arc;
|
||||
use crate::data::entities::{CardState, DeckSettings};
|
||||
use crate::data::repositories::{DataRepository, DataRepositoryInner};
|
||||
use crate::data::repositories::{DataRepository, DataRepositoryInner, Query};
|
||||
use crate::data_provider::{SqliteDbLayer, TableAccessQuerySet};
|
||||
use crate::notification::NotificationData::{DbLoadError, DbSaveError};
|
||||
use crate::notification::{MaybeError, NotificationData};
|
||||
@@ -8,11 +9,13 @@ use fsrs::MemoryState;
|
||||
use log::info;
|
||||
use rusqlite::{Connection, Error, Params, Row, params};
|
||||
use std::time::Instant;
|
||||
use crate::data::Id;
|
||||
|
||||
pub type CardStateRepository =
|
||||
DataRepository<CardState, SqliteDbLayer<CardState, CardStatesQuerySet>>;
|
||||
DataRepository<CardState, CardStateDbLayer>;
|
||||
pub type CardStateRepositoryInner =
|
||||
DataRepositoryInner<CardState, SqliteDbLayer<CardState, CardStatesQuerySet>>;
|
||||
DataRepositoryInner<CardState, CardStateDbLayer>;
|
||||
pub type CardStateDbLayer = SqliteDbLayer<CardState, CardStatesQuerySet>;
|
||||
#[derive(Clone)]
|
||||
pub struct CardStatesQuerySet;
|
||||
impl TableAccessQuerySet<CardState> for CardStatesQuerySet {
|
||||
@@ -63,10 +66,10 @@ impl TableAccessQuerySet<CardState> for CardStatesQuerySet {
|
||||
(
|
||||
entity.score,
|
||||
entity.last_open.timestamp(),
|
||||
entity.id,
|
||||
entity.fsrs_opened,
|
||||
entity.fsrs_opened.to_epoch_days(),
|
||||
memory_to_i64(&entity.fsrs_memory),
|
||||
entity.fsrs_open_day,
|
||||
entity.fsrs_open_day.to_epoch_days(),
|
||||
entity.id,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -118,74 +121,8 @@ fn memory_to_i64(value: &Option<MemoryState>) -> i64 {
|
||||
value.stability.to_bits() as i64 | ((value.difficulty.to_bits() as i64) << 32)
|
||||
}
|
||||
|
||||
pub fn add_stat_list(stats: &mut [CardState], connection: &mut Connection) -> MaybeError {
|
||||
let time = Instant::now();
|
||||
let tx = connection
|
||||
.transaction()
|
||||
.expect("Failed to create transaction");
|
||||
let count = stats.len();
|
||||
|
||||
{
|
||||
let mut stmt = tx
|
||||
.prepare(
|
||||
"INSERT INTO states (word_id, set_id, score, last_opened, fsrs_opened, fsrs_memory, fsrs_open_day) VALUES (?1, ?2, ?3, ?4)",
|
||||
)
|
||||
.expect("Failed to prepare state query");
|
||||
|
||||
for stat in stats.iter() {
|
||||
stmt.execute(params![
|
||||
stat.word_id,
|
||||
stat.deck_id,
|
||||
stat.score,
|
||||
stat.last_open.timestamp(),
|
||||
stat.fsrs_opened.to_epoch_days(),
|
||||
memory_to_i64(&stat.fsrs_memory),
|
||||
stat.fsrs_open_day.to_epoch_days()
|
||||
])
|
||||
.map_err(|_| DbSaveError)?;
|
||||
}
|
||||
impl CardStateRepositoryInner {
|
||||
pub fn deck_states(&self, deck_id: Id) -> Query<CardState, CardStateRepositoryInner, CardStateDbLayer> {
|
||||
self.query(Arc::new(move |state| {state.deck_id == deck_id}))
|
||||
}
|
||||
|
||||
let last_index: u32 = tx.last_insert_rowid() as u32;
|
||||
tx.commit().expect("Failed to commit");
|
||||
|
||||
let start_index = last_index - (count as u32) + 1;
|
||||
|
||||
for (index, id) in (start_index..=last_index).enumerate() {
|
||||
stats[index].id = id.into();
|
||||
}
|
||||
|
||||
info!("Added {} cards for {:?}", stats.len(), time.elapsed());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn update_stat_score(stat: &CardState, connection: &Connection) -> MaybeError {
|
||||
let time = Instant::now();
|
||||
|
||||
connection
|
||||
.execute(
|
||||
"UPDATE states SET score = ?1, last_opened = ?2 WHERE id = ?3",
|
||||
(&stat.score, &stat.last_open.timestamp(), &stat.id),
|
||||
)
|
||||
.map_err(|_| DbSaveError)?;
|
||||
info!("Updated stat: {}", time.elapsed().as_millis());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn delete_stats(stat: &[CardState], connection: &Connection) -> MaybeError {
|
||||
if stat.is_empty() {
|
||||
return Ok(());
|
||||
}
|
||||
let ids = stat
|
||||
.iter()
|
||||
.map(|s| s.id.into())
|
||||
.collect::<Vec<String>>()
|
||||
.join(", ");
|
||||
connection
|
||||
.execute(
|
||||
format!("DELETE FROM states WHERE id in ({ids})").as_str(),
|
||||
(),
|
||||
)
|
||||
.map_err(|_| DbSaveError)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user