Support retrievability calculation for (re)learning cards

This commit is contained in:
Damien Elmes 2023-09-25 14:58:39 +10:00
parent da0e42ea03
commit bb0acd9d92
2 changed files with 22 additions and 17 deletions

View file

@ -121,12 +121,16 @@ impl Card {
} }
pub(crate) fn days_since_last_review(&self, timing: &SchedTimingToday) -> Option<u32> { pub(crate) fn days_since_last_review(&self, timing: &SchedTimingToday) -> Option<u32> {
self.due_time(timing).map(|due| { if !self.is_due_in_days() {
due.adding_secs(-86_400 * self.interval as i64) Some(0)
.elapsed_secs() } else {
.max(0) as u32 self.due_time(timing).map(|due| {
/ 86_400 due.adding_secs(-86_400 * self.interval as i64)
}) .elapsed_secs()
.max(0) as u32
/ 86_400
})
}
} }
} }

View file

@ -285,18 +285,19 @@ fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> {
let Ok(due) = ctx.get_raw(1).as_i64() else { let Ok(due) = ctx.get_raw(1).as_i64() else {
return Ok(None); return Ok(None);
}; };
if due > 365_000 { let days_elapsed = if due > 365_000 {
// learning card // (re)learning card, assume 0 days have elapsed
return Ok(None); 0
} } else {
let Ok(ivl) = ctx.get_raw(2).as_i64() else { let Ok(ivl) = ctx.get_raw(2).as_i64() else {
return Ok(None); return Ok(None);
};
let Ok(days_elapsed) = ctx.get_raw(3).as_i64() else {
return Ok(None);
};
let review_day = (due.max(0) as u32).saturating_sub(ivl as u32);
(days_elapsed.max(0) as u32).saturating_sub(review_day)
}; };
let Ok(days_elapsed) = ctx.get_raw(3).as_i64() else {
return Ok(None);
};
let review_day = (due.max(0) as u32).saturating_sub(ivl as u32);
let days_elapsed = (days_elapsed.max(0) as u32).saturating_sub(review_day);
Ok(card_data.memory_state().map(|state| { Ok(card_data.memory_state().map(|state| {
FSRS::new(None) FSRS::new(None)
.unwrap() .unwrap()