Fix/inconsistent retrievability calculations between normal/filtered decks and display/sorting (#3582)

This commit is contained in:
Jarrett Ye 2024-11-17 23:24:04 +08:00 committed by GitHub
parent 1c3754f6c7
commit e992d6d462
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 11 additions and 8 deletions

View file

@ -111,7 +111,7 @@ impl Card {
/// Returns the card's due date as a timestamp if it has one.
fn due_time(&self, timing: &SchedTimingToday) -> Option<TimestampSecs> {
if self.queue == CardQueue::Learn {
Some(TimestampSecs(self.due as i64))
Some(TimestampSecs(self.original_or_current_due() as i64))
} else if self.is_due_in_days() {
Some(
TimestampSecs::now().adding_secs(
@ -128,7 +128,10 @@ impl Card {
/// date' or an add-on has changed the due date, this won't be accurate.
pub(crate) fn days_since_last_review(&self, timing: &SchedTimingToday) -> Option<u32> {
if !self.is_due_in_days() {
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.original_or_current_due() as u32)
/ 86_400,
)
} else {
self.due_time(timing).map(|due| {
(due.adding_secs(-86_400 * self.interval as i64)

View file

@ -53,7 +53,7 @@ fn build_retrievability_query(
) -> String {
if fsrs {
format!(
"extract_fsrs_relative_retrievability(c.data, due, {today}, ivl, {next_day_at}) {order}"
"extract_fsrs_relative_retrievability(c.data, case when c.odue !=0 then c.odue else c.due end, {today}, ivl, {next_day_at}) {order}"
)
} else {
format!(

View file

@ -784,7 +784,7 @@ impl fmt::Display for ReviewOrderSubclause {
let today = timing.days_elapsed;
let next_day_at = timing.next_day_at.0;
temp_string =
format!("extract_fsrs_relative_retrievability(data, due, {today}, ivl, {next_day_at}) {order}");
format!("extract_fsrs_relative_retrievability(data, case when odue !=0 then odue else due end, {today}, ivl, {next_day_at}) {order}");
&temp_string
}
ReviewOrderSubclause::Added => "nid asc, ord asc",

View file

@ -314,7 +314,7 @@ fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> {
let Ok(next_day_at) = ctx.get_raw(4).as_i64() else {
return Ok(None);
};
(next_day_at as u32).saturating_sub(due.max(0) as u32) / 86_400
(next_day_at).saturating_sub(due) as u32 / 86_400
} else {
let Ok(ivl) = ctx.get_raw(2).as_i64() else {
return Ok(None);
@ -322,8 +322,8 @@ fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> {
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 review_day = due.saturating_sub(ivl);
days_elapsed.saturating_sub(review_day) as u32
};
Ok(card_data.memory_state().map(|state| {
FSRS::new(None)
@ -361,7 +361,7 @@ fn add_extract_fsrs_relative_retrievability(db: &Connection) -> rusqlite::Result
let Ok(next_day_at) = ctx.get_raw(4).as_i64() else {
return Ok(None);
};
(next_day_at as u32).saturating_sub(due.max(0) as u32) / 86_400
next_day_at.saturating_sub(due) as u32 / 86_400
} else {
let Ok(days_elapsed) = ctx.get_raw(2).as_i64() else {
return Ok(None);