move cards out of the new queue on filtered deck upgrade

This commit is contained in:
Damien Elmes 2021-02-26 19:16:18 +10:00
parent b8acf11f3e
commit c0b9285923
3 changed files with 35 additions and 39 deletions

View file

@ -18,6 +18,22 @@ use crate::{
};
impl Card {
pub(crate) fn restore_queue_from_type(&mut self) {
self.queue = match self.ctype {
CardType::Learn | CardType::Relearn => {
if self.due > 1_000_000_000 {
// unix timestamp
CardQueue::Learn
} else {
// day number
CardQueue::DayLearn
}
}
CardType::New => CardQueue::New,
CardType::Review => CardQueue::Review,
}
}
pub(crate) fn move_into_filtered_deck(&mut self, ctx: &DeckFilterContext, position: i32) {
// filtered and v1 learning cards are excluded, so odue should be guaranteed to be zero
if self.original_due != 0 {
@ -64,17 +80,6 @@ impl Card {
}
}
/// Returns original_due if set, else due.
/// original_due will be set in filtered decks, and in relearning in
/// the old scheduler.
pub(crate) fn original_or_current_due(&self) -> i32 {
if self.original_due > 0 {
self.original_due
} else {
self.due
}
}
pub(crate) fn original_or_current_deck_id(&self) -> DeckID {
if self.original_deck_id.0 > 0 {
self.original_deck_id
@ -116,19 +121,7 @@ impl Card {
}
if (self.queue as i8) >= 0 {
self.queue = match self.ctype {
CardType::Learn | CardType::Relearn => {
if self.due > 1_000_000_000 {
// unix timestamp
CardQueue::Learn
} else {
// day number
CardQueue::DayLearn
}
}
CardType::New => CardQueue::New,
CardType::Review => CardQueue::Review,
}
self.restore_queue_from_type();
}
}
}

View file

@ -3,7 +3,7 @@
use crate::{
backend_proto as pb,
card::{Card, CardID, CardQueue, CardType},
card::{Card, CardID, CardQueue},
collection::Collection,
config::SchedulerVersion,
err::Result,
@ -22,19 +22,7 @@ impl Card {
) {
false
} else {
self.queue = match self.ctype {
CardType::Learn | CardType::Relearn => {
if self.original_or_current_due() > 1_000_000_000 {
// previous interval was in seconds
CardQueue::Learn
} else {
// previous interval was in days
CardQueue::DayLearn
}
}
CardType::New => CardQueue::New,
CardType::Review => CardQueue::Review,
};
self.restore_queue_from_type();
true
}
}

View file

@ -39,7 +39,12 @@ impl Card {
self.remaining_steps = self.remaining_steps.min(step_count);
}
if !info.reschedule {
if info.reschedule {
// only new cards should be in the new queue
if self.queue == CardQueue::New && self.ctype != CardType::New {
self.restore_queue_from_type();
}
} else {
// preview cards start in the review queue in v2
if self.queue == CardQueue::New {
self.queue = CardQueue::Review;
@ -182,5 +187,15 @@ mod test {
}));
assert_eq!(c.ctype, CardType::New);
assert_eq!(c.queue, CardQueue::PreviewRepeat);
// (early) reviews should be moved back from the new queue
c.ctype = CardType::Review;
c.queue = CardQueue::New;
c.upgrade_to_v2(Some(V1FilteredDeckInfo {
reschedule: true,
original_step_count: None,
}));
assert_eq!(c.ctype, CardType::Review);
assert_eq!(c.queue, CardQueue::Review);
}
}