fix(stats): subtract lifetime totals incrementally on delete (#196)

This commit is contained in:
2026-08-14 22:13:59 -07:00
committed by GitHub
parent 6fb3d2eb13
commit d963def1a9
20 changed files with 1446 additions and 370 deletions
@@ -555,6 +555,16 @@ function ensureAnimeMergeTables(db: DatabaseSync): void {
`);
}
function ensureSubtitleLineEventIndex(db: DatabaseSync): void {
// The event_id FK is ON DELETE SET NULL; without this index every deleted
// imm_session_events row full-scans imm_subtitle_lines looking for children,
// which made session deletes take minutes on large databases.
db.exec(`
CREATE INDEX IF NOT EXISTS idx_subtitle_lines_event_id
ON imm_subtitle_lines(event_id) WHERE event_id IS NOT NULL
`);
}
export function getOrCreateAnimeRecord(db: DatabaseSync, input: AnimeRecordInput): number {
const seasonScope = normalizeSeasonScope(input.seasonScope);
const identityTitle = buildSeasonScopedAnimeTitle(input.parsedTitle, seasonScope);
@@ -888,6 +898,7 @@ export function ensureSchema(db: DatabaseSync): void {
ensureLifetimeSummaryTables(db);
ensureStatsExcludedWordsTable(db);
ensureAnimeMergeTables(db);
ensureSubtitleLineEventIndex(db);
return;
}
@@ -1525,6 +1536,7 @@ export function ensureSchema(db: DatabaseSync): void {
CREATE INDEX IF NOT EXISTS idx_subtitle_lines_anime_line
ON imm_subtitle_lines(anime_id, line_index)
`);
ensureSubtitleLineEventIndex(db);
if (currentVersion?.schema_version && currentVersion.schema_version < 19) {
backfillLexicalOccurrenceSeenMs(db);
}