Fix/skip suspended cards in graphs context retrievability (#3518)

* skip suspended cards in GraphsContext retrievability

* avoid i32 overflow

* avoid u32 overflow
This commit is contained in:
Jarrett Ye 2024-10-26 17:09:20 +08:00 committed by GitHub
parent 7500beaba3
commit 939cc5a268
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 9 additions and 5 deletions

View file

@ -115,8 +115,8 @@ impl Card {
} else if self.is_due_in_days() { } else if self.is_due_in_days() {
Some( Some(
TimestampSecs::now().adding_secs( TimestampSecs::now().adding_secs(
((self.original_or_current_due() - timing.days_elapsed as i32) (self.original_or_current_due() as i64 - timing.days_elapsed as i64)
.saturating_mul(86400)) as i64, .saturating_mul(86400),
), ),
) )
} else { } else {
@ -131,9 +131,9 @@ impl Card {
Some((timing.next_day_at.0 as u32).saturating_sub(self.due.max(0) as u32) / 86_400) Some((timing.next_day_at.0 as u32).saturating_sub(self.due.max(0) as u32) / 86_400)
} else { } else {
self.due_time(timing).map(|due| { self.due_time(timing).map(|due| {
due.adding_secs(-86_400 * self.interval as i64) (due.adding_secs(-86_400 * self.interval as i64)
.elapsed_secs() as u32 .elapsed_secs()
/ 86_400 / 86_400) as u32
}) })
} }
} }

View file

@ -4,6 +4,7 @@
use anki_proto::stats::graphs_response::Retrievability; use anki_proto::stats::graphs_response::Retrievability;
use fsrs::FSRS; use fsrs::FSRS;
use crate::card::CardQueue;
use crate::scheduler::timing::SchedTimingToday; use crate::scheduler::timing::SchedTimingToday;
use crate::stats::graphs::eases::percent_to_bin; use crate::stats::graphs::eases::percent_to_bin;
use crate::stats::graphs::GraphsContext; use crate::stats::graphs::GraphsContext;
@ -23,6 +24,9 @@ impl GraphsContext {
let mut note_retrievability: std::collections::HashMap<i64, (f32, u32)> = let mut note_retrievability: std::collections::HashMap<i64, (f32, u32)> =
std::collections::HashMap::new(); std::collections::HashMap::new();
for card in &self.cards { for card in &self.cards {
if card.queue == CardQueue::Suspended {
continue;
}
let entry = note_retrievability let entry = note_retrievability
.entry(card.note_id.0) .entry(card.note_id.0)
.or_insert((0.0, 0)); .or_insert((0.0, 0));