Skip to content

Commit 421d619

Browse files
authored
Merge pull request #65 from BenMusch/benMuschol-perDeckStats
[decks] Add endpoint for stats and card counts by deck
2 parents 190f892 + 7ede47c commit 421d619

File tree

11 files changed

+1386
-416
lines changed

11 files changed

+1386
-416
lines changed

api/rpc/wordvault/api.pb.go

Lines changed: 814 additions & 373 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/rpc/wordvault/wordvaultconnect/api.connect.go

Lines changed: 64 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

db/queries/cards.sql

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,19 @@ SELECT lexicon_name, count(*) as card_count FROM wordvault_cards
6363
WHERE user_id = $1
6464
GROUP BY lexicon_name;
6565

66+
-- name: GetNumCardsInVaultByDeck :many
67+
SELECT
68+
COALESCE(deck_id, 0) as deck_id,
69+
COUNT(*) as card_count
70+
FROM
71+
wordvault_cards
72+
WHERE
73+
user_id = $1 AND lexicon_name = $2
74+
GROUP BY
75+
deck_id
76+
ORDER BY
77+
deck_id NULLS FIRST;
78+
6679
-- name: UpdateCard :exec
6780
UPDATE wordvault_cards
6881
SET fsrs_card = $1, next_scheduled = $2, review_log = review_log || @review_log_item::jsonb
@@ -164,17 +177,25 @@ WITH scheduled_cards AS (
164177
FROM
165178
wordvault_cards
166179
WHERE user_id = $1 AND lexicon_name = $2
180+
),
181+
per_date AS (
182+
SELECT
183+
deck_id,
184+
CASE
185+
WHEN scheduled_date = '-infinity'::date THEN 'overdue'
186+
WHEN scheduled_date = 'infinity'::date THEN 'infinity'
187+
ELSE to_char(scheduled_date, 'YYYY-MM-DD')
188+
END AS key,
189+
COUNT(*) AS question_count
190+
FROM scheduled_cards
191+
GROUP BY deck_id, scheduled_date
167192
)
168193
SELECT
169194
deck_id,
170-
scheduled_date,
171-
COUNT(*) AS question_count
172-
FROM
173-
scheduled_cards
174-
GROUP BY
175-
deck_id, scheduled_date
176-
ORDER BY
177-
scheduled_date;
195+
jsonb_object_agg(key, question_count) AS breakdown
196+
FROM per_date
197+
GROUP BY deck_id
198+
ORDER BY deck_id;
178199

179200
-- name: GetOverdueCount :one
180201
SELECT

db/queries/stats.sql

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,28 @@ WHERE
7575
GROUP BY
7676
u.username
7777
ORDER BY
78-
cards_studied_today DESC;
78+
cards_studied_today DESC;
79+
80+
-- name: GetDailyProgressByDeck :many
81+
SELECT
82+
deck_id,
83+
COALESCE(SUM(CASE WHEN jsonb_array_length(review_log) = 1 THEN 1 ELSE 0 END), 0)::int AS new_cards,
84+
COALESCE(SUM(CASE WHEN jsonb_array_length(review_log) > 1 THEN 1 ELSE 0 END), 0)::int AS reviewed_cards,
85+
COALESCE(COUNT(*) FILTER (WHERE jsonb_array_length(review_log) = 1 AND (review_log->0->>'Rating')::int = 1), 0)::int AS new_rating_1,
86+
COALESCE(COUNT(*) FILTER (WHERE jsonb_array_length(review_log) = 1 AND (review_log->0->>'Rating')::int = 2), 0)::int AS new_rating_2,
87+
COALESCE(COUNT(*) FILTER (WHERE jsonb_array_length(review_log) = 1 AND (review_log->0->>'Rating')::int = 3), 0)::int AS new_rating_3,
88+
COALESCE(COUNT(*) FILTER (WHERE jsonb_array_length(review_log) = 1 AND (review_log->0->>'Rating')::int = 4), 0)::int AS new_rating_4,
89+
COALESCE(COUNT(*) FILTER (WHERE jsonb_array_length(review_log) > 1 AND (review_log->-1->>'Rating')::int = 1), 0)::int AS reviewed_rating_1,
90+
COALESCE(COUNT(*) FILTER (WHERE jsonb_array_length(review_log) > 1 AND (review_log->-1->>'Rating')::int = 2), 0)::int AS reviewed_rating_2,
91+
COALESCE(COUNT(*) FILTER (WHERE jsonb_array_length(review_log) > 1 AND (review_log->-1->>'Rating')::int = 3), 0)::int AS reviewed_rating_3,
92+
COALESCE(COUNT(*) FILTER (WHERE jsonb_array_length(review_log) > 1 AND (review_log->-1->>'Rating')::int = 4), 0)::int AS reviewed_rating_4
93+
FROM
94+
wordvault_cards
95+
WHERE
96+
user_id = @user_id
97+
AND ((fsrs_card->>'LastReview')::timestamp AT TIME ZONE 'UTC' AT TIME ZONE sqlc.arg(timezone)::text)::date =
98+
(sqlc.arg(now)::timestamptz AT TIME ZONE sqlc.arg(timezone)::text)::date
99+
GROUP BY
100+
deck_id
101+
ORDER BY
102+
deck_id NULLS FIRST;

internal/stores/models/cards.sql.go

Lines changed: 64 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/stores/models/db.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/stores/models/models.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/stores/models/stats.sql.go

Lines changed: 78 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)