handle preview repeat in deck list

This commit is contained in:
Damien Elmes 2020-07-30 08:20:51 +10:00
parent 186ff1f185
commit a1866e72fd
3 changed files with 65 additions and 74 deletions

View file

@ -19,12 +19,7 @@ impl Collection {
learn_cutoff: u32, learn_cutoff: u32,
limit_to: Option<&str>, limit_to: Option<&str>,
) -> Result<HashMap<DeckID, DueCounts>> { ) -> Result<HashMap<DeckID, DueCounts>> {
if let Some(limit) = limit_to {
self.storage self.storage
.due_counts_limited(self.sched_ver(), days_elapsed, learn_cutoff, limit) .due_counts(self.sched_ver(), days_elapsed, learn_cutoff, limit_to)
} else {
self.storage
.due_counts(self.sched_ver(), days_elapsed, learn_cutoff)
}
} }
} }

View file

@ -1,33 +1,36 @@
select select did,
did, sum(queue = :new_queue),
-- new
sum(queue = ?1),
-- reviews
sum( sum(
queue = ?2 queue = :review_queue
and due <= ?3 and due <= :day_cutoff
), ),
-- learning -- learning
sum( sum(
( (
case case
-- v2 scheduler :sched_ver
?4
when 2 then ( when 2 then (
queue = ?5 -- v2 scheduler
and due < ?6 (
queue = :learn_queue
and due < :learn_cutoff
) )
or ( or (
queue = ?7 queue = :daylearn_queue
and due <= ?3 and due <= :day_cutoff
)
or (
queue = :preview_queue
and due <= :learn_cutoff
)
) )
else ( else (
-- v1 scheduler -- v1 scheduler
case case
when queue = ?5 when queue = :learn_queue
and due < ?6 then left / 1000 and due < :learn_cutoff then left / 1000
when queue = ?7 when queue = :daylearn_queue
and due <= ?3 then 1 and due <= :day_cutoff then 1
else 0 else 0
end end
) )
@ -35,5 +38,4 @@ select
) )
) )
from cards from cards
where where queue >= 0
queue >= 0

View file

@ -13,7 +13,7 @@ use crate::{
timestamp::TimestampMillis, timestamp::TimestampMillis,
}; };
use prost::Message; use prost::Message;
use rusqlite::{params, Row, NO_PARAMS}; use rusqlite::{named_params, params, Row, NO_PARAMS};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use unicase::UniCase; use unicase::UniCase;
@ -173,54 +173,48 @@ impl SqliteStorage {
sched: SchedulerVersion, sched: SchedulerVersion,
day_cutoff: u32, day_cutoff: u32,
learn_cutoff: u32, learn_cutoff: u32,
top_deck: Option<&str>,
) -> Result<HashMap<DeckID, DueCounts>> { ) -> Result<HashMap<DeckID, DueCounts>> {
self.db let sched_ver = sched as u8;
.prepare_cached(concat!(include_str!("due_counts.sql"), " group by did"))? let mut params = named_params! {
.query_and_then( ":new_queue": CardQueue::New as u8,
params![ ":review_queue": CardQueue::Review as u8,
CardQueue::New as u8, ":day_cutoff": day_cutoff,
CardQueue::Review as u8, ":sched_ver": sched_ver,
day_cutoff, ":learn_queue": CardQueue::Learn as u8,
sched as u8, ":learn_cutoff": learn_cutoff,
CardQueue::Learn as u8, ":daylearn_queue": CardQueue::DayLearn as u8,
learn_cutoff, ":preview_queue": CardQueue::PreviewRepeat as u8,
CardQueue::DayLearn as u8, }
], .to_vec();
row_to_due_counts,
)? let sql;
.collect() let prefix_start;
let prefix_end;
let top;
if let Some(top_inner) = top_deck {
// limited to deck node
top = top_inner;
prefix_start = format!("{}\x1f", top);
prefix_end = format!("{}\x20", top);
params.extend(named_params! {
":top_deck": top,
":prefix_start": prefix_start,
":prefix_end": prefix_end,
});
sql = concat!(
include_str!("due_counts.sql"),
" and did in (select id from decks where name = :top_deck ",
"or (name >= :prefix_start and name < :prefix_end)) group by did "
);
} else {
// entire tree
sql = concat!(include_str!("due_counts.sql"), " group by did");
} }
pub(crate) fn due_counts_limited(
&self,
sched: SchedulerVersion,
day_cutoff: u32,
learn_cutoff: u32,
top: &str,
) -> Result<HashMap<DeckID, DueCounts>> {
let prefix_start = format!("{}\x1f", top);
let prefix_end = format!("{}\x20", top);
self.db self.db
.prepare_cached(concat!( .prepare_cached(sql)?
include_str!("due_counts.sql"), .query_and_then_named(&params, row_to_due_counts)?
" and did in (select id from decks where name = ? ",
"or (name >= ? and name < ?)) group by did "
))?
.query_and_then(
params![
CardQueue::New as u8,
CardQueue::Review as u8,
day_cutoff,
sched as u8,
CardQueue::Learn as u8,
learn_cutoff,
CardQueue::DayLearn as u8,
top,
prefix_start,
prefix_end,
],
row_to_due_counts,
)?
.collect() .collect()
} }