perf: denormalize content-warning filter to manga_content_warnings
The content-warning include/exclude filter (and its count) ran a correlated page_content_warnings->pages->chapters join per candidate manga — O(mangas * pages) on every filtered list. Add a manga_content_warnings(manga_id, warning) table holding each manga's deduped warning union, maintained by triggers that recompute an affected manga's set (delete+reinsert of the tiny five-label set, robust across page/chapter/manga cascade deletes), backfilled in the migration. The filter is now a single indexed lookup. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -144,17 +144,13 @@ const FILTER_WHERE: &str = r#"
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM unnest($6::text[]) AS req(w)
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM page_content_warnings pw
|
||||
JOIN pages p ON p.id = pw.page_id
|
||||
JOIN chapters c ON c.id = p.chapter_id
|
||||
WHERE c.manga_id = mangas.id AND pw.warning = req.w
|
||||
SELECT 1 FROM manga_content_warnings mcw
|
||||
WHERE mcw.manga_id = mangas.id AND mcw.warning = req.w
|
||||
)
|
||||
)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM page_content_warnings pw
|
||||
JOIN pages p ON p.id = pw.page_id
|
||||
JOIN chapters c ON c.id = p.chapter_id
|
||||
WHERE c.manga_id = mangas.id AND pw.warning = ANY($7::text[])
|
||||
SELECT 1 FROM manga_content_warnings mcw
|
||||
WHERE mcw.manga_id = mangas.id AND mcw.warning = ANY($7::text[])
|
||||
)
|
||||
"#;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user