diff --git a/rslib/src/scheduler/fsrs/memory_state.rs b/rslib/src/scheduler/fsrs/memory_state.rs index f7021beab..1868525a7 100644 --- a/rslib/src/scheduler/fsrs/memory_state.rs +++ b/rslib/src/scheduler/fsrs/memory_state.rs @@ -85,8 +85,8 @@ impl Collection { progress.update(true, |state| state.current_cards = idx as u32 + 1)?; let mut card = self.storage.get_card(card_id)?.or_not_found(card_id)?; let original = card.clone(); - if let Some(req) = &req { - card.set_memory_state(&fsrs, item, historical_retention.unwrap())?; + if let (Some(req), Some(item)) = (&req, item) { + card.set_memory_state(&fsrs, Some(item), historical_retention.unwrap())?; card.desired_retention = desired_retention; // if rescheduling if let Some(reviews) = &last_revlog_info { @@ -163,11 +163,20 @@ impl Collection { historical_retention, ignore_revlogs_before_ms_from_config(&config)?, )?; - card.set_memory_state(&fsrs, item, historical_retention)?; - Ok(ComputeMemoryStateResponse { - state: card.memory_state.map(Into::into), - desired_retention, - }) + if item.is_some() { + card.set_memory_state(&fsrs, item, historical_retention)?; + Ok(ComputeMemoryStateResponse { + state: card.memory_state.map(Into::into), + desired_retention, + }) + } else { + card.memory_state = None; + card.desired_retention = None; + Ok(ComputeMemoryStateResponse { + state: None, + desired_retention, + }) + } } } diff --git a/rslib/src/scheduler/fsrs/params.rs b/rslib/src/scheduler/fsrs/params.rs index a5b916746..84fbed48b 100644 --- a/rslib/src/scheduler/fsrs/params.rs +++ b/rslib/src/scheduler/fsrs/params.rs @@ -340,6 +340,9 @@ pub(crate) fn reviews_for_fsrs( if idx > 0 { entries.drain(..idx); } + } else { + // if no valid user grades were found, ignore the card. + return None; } // Filter out unwanted entries @@ -424,7 +427,7 @@ fn revlog_entry_to_proto(e: RevlogEntry) -> anki_proto::stats::RevlogEntry { pub(crate) mod tests { use super::*; - const NEXT_DAY_AT: TimestampSecs = TimestampSecs(86400 * 100); + const NEXT_DAY_AT: TimestampSecs = TimestampSecs(86400 * 1000); fn days_ago_ms(days_ago: i64) -> TimestampMillis { ((NEXT_DAY_AT.0 - days_ago * 86400) * 1000).into() @@ -709,4 +712,14 @@ pub(crate) mod tests { 2 ); } + + #[test] + fn ignore_before_after_last_revlog_entry() { + let revlogs = &[ + revlog(RevlogReviewKind::Learning, 10), + revlog(RevlogReviewKind::Review, 6), + ]; + // L R | + assert_eq!(convert_ignore_before(revlogs, false, days_ago_ms(4)), None); + } }