mirror of
https://github.com/ankitects/anki.git
synced 2026-01-12 13:33:55 -05:00
./check
This commit is contained in:
parent
8c32ee7f8e
commit
6c63ff960f
4 changed files with 3 additions and 121 deletions
|
|
@ -1450,7 +1450,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "fsrs",
|
"name": "fsrs",
|
||||||
"version": "4.1.1",
|
"version": "5.0.0",
|
||||||
"authors": "Open Spaced Repetition",
|
"authors": "Open Spaced Repetition",
|
||||||
"repository": "https://github.com/open-spaced-repetition/fsrs-rs",
|
"repository": "https://github.com/open-spaced-repetition/fsrs-rs",
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ impl crate::services::DeckConfigService for Collection {
|
||||||
) -> Result<anki_proto::deck_config::GetRetentionWorkloadResponse> {
|
) -> Result<anki_proto::deck_config::GetRetentionWorkloadResponse> {
|
||||||
let guard =
|
let guard =
|
||||||
self.search_cards_into_table(&input.search, crate::search::SortMode::NoOrder)?;
|
self.search_cards_into_table(&input.search, crate::search::SortMode::NoOrder)?;
|
||||||
|
|
||||||
let revlogs = guard
|
let revlogs = guard
|
||||||
.col
|
.col
|
||||||
.storage
|
.storage
|
||||||
|
|
@ -117,11 +117,7 @@ impl crate::services::DeckConfigService for Collection {
|
||||||
.map(|dr| {
|
.map(|dr| {
|
||||||
Ok((
|
Ok((
|
||||||
dr,
|
dr,
|
||||||
fsrs::expected_workload(
|
fsrs::expected_workload(&input.w, dr as f32 / 100., &config)?,
|
||||||
&input.w,
|
|
||||||
dr as f32 / 100.,
|
|
||||||
&config
|
|
||||||
)?,
|
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.collect::<Result<HashMap<_, _>>>()?;
|
.collect::<Result<HashMap<_, _>>>()?;
|
||||||
|
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
||||||
WITH searched_revlogs AS (
|
|
||||||
SELECT *,
|
|
||||||
RANK() OVER (
|
|
||||||
PARTITION BY cid
|
|
||||||
ORDER BY id ASC
|
|
||||||
) AS rank_num
|
|
||||||
FROM revlog
|
|
||||||
WHERE ease > 0
|
|
||||||
AND cid IN search_cids
|
|
||||||
ORDER BY id DESC -- Use the last 10_000 reviews
|
|
||||||
LIMIT 10000
|
|
||||||
), average_pass AS (
|
|
||||||
SELECT AVG(time)
|
|
||||||
FROM searched_revlogs
|
|
||||||
WHERE ease > 1
|
|
||||||
AND type = 1
|
|
||||||
),
|
|
||||||
lapse_count AS (
|
|
||||||
SELECT COUNT(time) AS lapse_count
|
|
||||||
FROM searched_revlogs
|
|
||||||
WHERE ease = 1
|
|
||||||
AND type = 1
|
|
||||||
),
|
|
||||||
fail_sum AS (
|
|
||||||
SELECT SUM(time) AS total_fail_time
|
|
||||||
FROM searched_revlogs
|
|
||||||
WHERE (
|
|
||||||
ease = 1
|
|
||||||
AND type = 1
|
|
||||||
)
|
|
||||||
OR type = 2
|
|
||||||
),
|
|
||||||
-- (sum(Relearning) + sum(Lapses)) / count(Lapses)
|
|
||||||
average_fail AS (
|
|
||||||
SELECT total_fail_time * 1.0 / NULLIF(lapse_count, 0) AS avg_fail_time
|
|
||||||
FROM fail_sum,
|
|
||||||
lapse_count
|
|
||||||
),
|
|
||||||
-- Can lead to cards with partial learn histories skewing the time
|
|
||||||
summed_learns AS (
|
|
||||||
SELECT cid,
|
|
||||||
SUM(time) AS total_time
|
|
||||||
FROM searched_revlogs
|
|
||||||
WHERE searched_revlogs.type = 0
|
|
||||||
GROUP BY cid
|
|
||||||
),
|
|
||||||
average_learn AS (
|
|
||||||
SELECT AVG(total_time) AS avg_learn_time
|
|
||||||
FROM summed_learns
|
|
||||||
),
|
|
||||||
initial_pass_rate AS (
|
|
||||||
SELECT AVG(
|
|
||||||
CASE
|
|
||||||
WHEN ease > 1 THEN 1.0
|
|
||||||
ELSE 0.0
|
|
||||||
END
|
|
||||||
) AS initial_pass_rate
|
|
||||||
FROM searched_revlogs
|
|
||||||
WHERE rank_num = 1
|
|
||||||
),
|
|
||||||
pass_cnt AS (
|
|
||||||
SELECT COUNT(*) AS cnt
|
|
||||||
FROM searched_revlogs
|
|
||||||
WHERE ease > 1
|
|
||||||
AND type = 1
|
|
||||||
),
|
|
||||||
fail_cnt AS (
|
|
||||||
SELECT COUNT(*) AS cnt
|
|
||||||
FROM searched_revlogs
|
|
||||||
WHERE ease = 1
|
|
||||||
AND type = 1
|
|
||||||
),
|
|
||||||
learn_cnt AS (
|
|
||||||
SELECT COUNT(*) AS cnt
|
|
||||||
FROM searched_revlogs
|
|
||||||
WHERE type = 0
|
|
||||||
)
|
|
||||||
SELECT *
|
|
||||||
FROM average_pass,
|
|
||||||
average_fail,
|
|
||||||
average_learn,
|
|
||||||
initial_pass_rate,
|
|
||||||
pass_cnt,
|
|
||||||
fail_cnt,
|
|
||||||
learn_cnt;
|
|
||||||
|
|
@ -42,17 +42,6 @@ use crate::timestamp::TimestampMillis;
|
||||||
use crate::timestamp::TimestampSecs;
|
use crate::timestamp::TimestampSecs;
|
||||||
use crate::types::Usn;
|
use crate::types::Usn;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
|
||||||
pub struct RetentionCosts {
|
|
||||||
pub average_pass_time_ms: f32,
|
|
||||||
pub average_fail_time_ms: f32,
|
|
||||||
pub average_learn_time_ms: f32,
|
|
||||||
pub initial_pass_rate: f32,
|
|
||||||
pub pass_count: u32,
|
|
||||||
pub fail_count: u32,
|
|
||||||
pub learn_count: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromSql for CardType {
|
impl FromSql for CardType {
|
||||||
fn column_result(value: ValueRef<'_>) -> result::Result<Self, FromSqlError> {
|
fn column_result(value: ValueRef<'_>) -> result::Result<Self, FromSqlError> {
|
||||||
if let ValueRef::Integer(i) = value {
|
if let ValueRef::Integer(i) = value {
|
||||||
|
|
@ -759,24 +748,6 @@ impl super::SqliteStorage {
|
||||||
.get(0)?)
|
.get(0)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn get_costs_for_retention(&self) -> Result<RetentionCosts> {
|
|
||||||
let mut statement = self
|
|
||||||
.db
|
|
||||||
.prepare(include_str!("get_costs_for_retention.sql"))?;
|
|
||||||
let mut query = statement.query(params![])?;
|
|
||||||
let row = query.next()?.unwrap();
|
|
||||||
|
|
||||||
Ok(RetentionCosts {
|
|
||||||
average_pass_time_ms: row.get(0).unwrap_or(7000.),
|
|
||||||
average_fail_time_ms: row.get(1).unwrap_or(23_000.),
|
|
||||||
average_learn_time_ms: row.get(2).unwrap_or(30_000.),
|
|
||||||
initial_pass_rate: row.get(3).unwrap_or(0.5),
|
|
||||||
pass_count: row.get(4).unwrap_or(0),
|
|
||||||
fail_count: row.get(5).unwrap_or(0),
|
|
||||||
learn_count: row.get(6).unwrap_or(0),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub(crate) fn get_all_cards(&self) -> Vec<Card> {
|
pub(crate) fn get_all_cards(&self) -> Vec<Card> {
|
||||||
self.db
|
self.db
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue