deck_tree() could be made to unbury the current day's cards

When provided with a future timestamp to estimate the next day's cards,
it lead to the current day's buried cards being unburied.

Fixes
https://forums.ankiweb.net/t/inconsistent-card-counts-when-syncing/15496
This commit is contained in:
Damien Elmes 2021-12-02 21:07:21 +10:00
parent 9daa0c9acb
commit d7f5555642

View File

@ -285,13 +285,17 @@ impl From<DeckTreeNode> for LegacyDueCounts {
impl Collection { impl Collection {
/// Get the deck tree. /// Get the deck tree.
/// If now is provided, due counts for the provided timestamp will be populated. /// - If `timestamp` is provided, due counts for the provided timestamp will
/// If top_deck_id is provided, only the node starting at the provided deck ID will /// be populated.
/// have the counts populated. Currently the entire tree is returned in this case, but /// - Buried cards from previous days will be unburied if necessary. Because
/// this may change in the future. /// this does not happen for future stamps, future due numbers may not be
/// accurate.
/// - If top_deck_id is provided, only the node starting at the provided
/// deck ID will have the counts populated. Currently the entire tree is
/// returned in this case, but this may change in the future.
pub fn deck_tree( pub fn deck_tree(
&mut self, &mut self,
now: Option<TimestampSecs>, timestamp: Option<TimestampSecs>,
top_deck_id: Option<DeckId>, top_deck_id: Option<DeckId>,
) -> Result<DeckTreeNode> { ) -> Result<DeckTreeNode> {
let names = self.storage.get_all_deck_names()?; let names = self.storage.get_all_deck_names()?;
@ -299,18 +303,22 @@ impl Collection {
let decks_map = self.storage.get_decks_map()?; let decks_map = self.storage.get_decks_map()?;
add_collapsed_and_filtered(&mut tree, &decks_map, now.is_none()); add_collapsed_and_filtered(&mut tree, &decks_map, timestamp.is_none());
if self.default_deck_is_empty()? { if self.default_deck_is_empty()? {
hide_default_deck(&mut tree); hide_default_deck(&mut tree);
} }
if let Some(now) = now { if let Some(timestamp) = timestamp {
// cards buried on previous days need to be unburied for the current
// day's counts to be accurate
let timing_today = self.timing_today()?;
self.unbury_if_day_rolled_over(timing_today)?;
let limit = top_deck_id let limit = top_deck_id
.and_then(|did| decks_map.get(&did).map(|deck| deck.name.as_native_str())); .and_then(|did| decks_map.get(&did).map(|deck| deck.name.as_native_str()));
let timing = self.timing_for_timestamp(now)?; let timing_at_stamp = self.timing_for_timestamp(timestamp)?;
self.unbury_if_day_rolled_over(timing)?; let days_elapsed = timing_at_stamp.days_elapsed;
let days_elapsed = timing.days_elapsed; let learn_cutoff = (timestamp.0 as u32) + self.learn_ahead_secs();
let learn_cutoff = (now.0 as u32) + self.learn_ahead_secs();
let sched_ver = self.scheduler_version(); let sched_ver = self.scheduler_version();
let v3 = self.get_config_bool(BoolKey::Sched2021); let v3 = self.get_config_bool(BoolKey::Sched2021);
let counts = self.due_counts(days_elapsed, learn_cutoff, limit)?; let counts = self.due_counts(days_elapsed, learn_cutoff, limit)?;