From 4c71508e732089586dc67243c9135bf0d37800b7 Mon Sep 17 00:00:00 2001 From: Richie Cahill Date: Thu, 2 Jul 2026 23:42:08 -0400 Subject: [PATCH] feat(ebook): enhance phrase judgment logging with failure tracking --- python/ebook_search/api/routes/admin.py | 5 ++++- python/ebook_search/protected_phrases/lib.py | 14 ++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/python/ebook_search/api/routes/admin.py b/python/ebook_search/api/routes/admin.py index a441572..b43e6fe 100644 --- a/python/ebook_search/api/routes/admin.py +++ b/python/ebook_search/api/routes/admin.py @@ -121,9 +121,11 @@ def judge_ngrams(request: Request, config: AppConfig, session: DbSession) -> HTM return templates.TemplateResponse(request, "partials/error.html", {"message": str(error)}, status_code=500) logger.info( - "ebook_admin_judge_ngrams_complete books_seen=%s books_judged=%s candidates_judged=%s protected=%s mentions=%s", + "ebook_admin_judge_ngrams_complete books_seen=%s books_judged=%s books_failed=%s candidates_judged=%s " + "protected=%s mentions=%s", result.books_seen, result.books_judged, + result.books_failed, result.candidates_judged, result.protected_phrases, result.phrase_mentions, @@ -136,6 +138,7 @@ def judge_ngrams(request: Request, config: AppConfig, session: DbSession) -> HTM f"Judged {result.candidates_judged} candidates across {result.books_judged} of " f"{result.books_seen} books; {result.protected_phrases} protected phrases, " f"{result.phrase_mentions} mentions" + + (f"; {result.books_failed} books failed" if result.books_failed else "") ) }, ) diff --git a/python/ebook_search/protected_phrases/lib.py b/python/ebook_search/protected_phrases/lib.py index 08d40bf..a7289e5 100644 --- a/python/ebook_search/protected_phrases/lib.py +++ b/python/ebook_search/protected_phrases/lib.py @@ -207,6 +207,7 @@ class PhraseJudgmentBackfillResult: books_seen: int books_judged: int + books_failed: int candidates_judged: int protected_phrases: int phrase_mentions: int @@ -1208,6 +1209,7 @@ def judge_candidate_phrases_for_books( sources = list(session.scalars(select(EbookSource).order_by(EbookSource.id))) books_seen = len(sources) books_judged = 0 + books_failed = 0 candidates_judged = 0 protected_count = 0 mention_count = 0 @@ -1282,13 +1284,15 @@ def judge_candidate_phrases_for_books( session.commit() except Exception: session.rollback() + books_failed += 1 logger.exception( - "ebook_candidate_phrase_judgment_book_failed source_id=%s book_number=%s books_seen=%s", + "ebook_candidate_phrase_judgment_book_failed source_id=%s book_number=%s books_seen=%s books_failed=%s", source.id, book_number, books_seen, + books_failed, ) - raise + continue books_judged += 1 candidates_judged += judged protected_count += len(protected) @@ -1307,10 +1311,11 @@ def judge_candidate_phrases_for_books( ) logger.info( - "ebook_candidate_phrase_judgment_complete books_seen=%s books_judged=%s candidates_judged=%s " - "protected=%s mentions=%s", + "ebook_candidate_phrase_judgment_complete books_seen=%s books_judged=%s books_failed=%s " + "candidates_judged=%s protected=%s mentions=%s", books_seen, books_judged, + books_failed, candidates_judged, protected_count, mention_count, @@ -1318,6 +1323,7 @@ def judge_candidate_phrases_for_books( return PhraseJudgmentBackfillResult( books_seen=books_seen, books_judged=books_judged, + books_failed=books_failed, candidates_judged=candidates_judged, protected_phrases=protected_count, phrase_mentions=mention_count,