feat(catalog): Katalogsuche Backend – RPC, Normalisierung, alternative Titel (KAT-01, 3a Backend) #64

Merged
cschlaefke merged 8 commits from feature/3a-katalog-suche-backend into main 2026-11-04 10:04:03 +00:00
Owner

Refs #3

Teil 3a (Backend) der Katalogsuche nach docs/specs/3-katalog-suche.md.

Inhalt

  • Migration 20261103235947_catalog_search.sql: search_normalize, generierte Suchspalten + GIN-Trigramm-Indizes, Tabelle game_alt_titles (RLS, nur Lesen), RPC search_catalog_games (security invoker, nur anon/authenticated).
  • Startbestand-Werkzeug: alternative Titel (idempotenter Abgleich).
  • pgTAP 09_catalog_search.test.sql (222 Tests); Anpassungen 00/06/07/08. Gesamt 811 pgTAP-Tests + 41 Deno-Tests grün nach db reset.
  • Perf-Skript supabase/perf/catalog_search_perf.sql (nur lokal, Schutz gegen versehentlichen Lauf).
  • Nachtrag docs/specs/3-katalog-suche-umsetzung.md mit Messwerten (B5), Protokollprüfung (QUE-04), Abweichungen von der Spec.
  • Review (code-reviewer): APPROVE mit Auflagen, alle eingearbeitet.

Messung (lokal, 10 000 Spiele, als anon)

p95 gesamt ca. 79 bis 110 ms im ruhigen Lauf; auf belastetem Host höher (190 bis 325 ms in Einzelfällen vor der Optimierung). Budget ist nicht unter allen Bedingungen belegt; Hetzner/Staging nicht gemessen. Optimierungsstufen 1/2 bewusst nicht gebaut, erst bei verfehltem Budget auf Staging.

Für Chris / Folgearbeiten

  • Freigabepunkte Staging/Hetzner in docs/release-checkliste.md Abschnitt 2a (Erweiterungen, statement_timeout, Log-Einstellungen, GET auf die RPC sperren, Mengenbegrenzung je IP).
  • SAM-08: Import braucht execute auf search_normalize, usage auf extensions, Schreibrechte auf game_alt_titles.
  • 22003/22P02 werden in 3b auf „ungültige Eingabe“ abgebildet.
  • Merge vor #63 (3b).

🤖 Generated with Claude Code

Refs #3 Teil 3a (Backend) der Katalogsuche nach `docs/specs/3-katalog-suche.md`. ## Inhalt - Migration `20261103235947_catalog_search.sql`: `search_normalize`, generierte Suchspalten + GIN-Trigramm-Indizes, Tabelle `game_alt_titles` (RLS, nur Lesen), RPC `search_catalog_games` (security invoker, nur `anon`/`authenticated`). - Startbestand-Werkzeug: alternative Titel (idempotenter Abgleich). - pgTAP `09_catalog_search.test.sql` (222 Tests); Anpassungen 00/06/07/08. Gesamt 811 pgTAP-Tests + 41 Deno-Tests grün nach `db reset`. - Perf-Skript `supabase/perf/catalog_search_perf.sql` (nur lokal, Schutz gegen versehentlichen Lauf). - Nachtrag `docs/specs/3-katalog-suche-umsetzung.md` mit Messwerten (B5), Protokollprüfung (QUE-04), Abweichungen von der Spec. - Review (code-reviewer): APPROVE mit Auflagen, alle eingearbeitet. ## Messung (lokal, 10 000 Spiele, als `anon`) p95 gesamt ca. 79 bis 110 ms im ruhigen Lauf; auf belastetem Host höher (190 bis 325 ms in Einzelfällen vor der Optimierung). **Budget ist nicht unter allen Bedingungen belegt; Hetzner/Staging nicht gemessen.** Optimierungsstufen 1/2 bewusst nicht gebaut, erst bei verfehltem Budget auf Staging. ## Für Chris / Folgearbeiten - Freigabepunkte Staging/Hetzner in `docs/release-checkliste.md` Abschnitt 2a (Erweiterungen, `statement_timeout`, Log-Einstellungen, GET auf die RPC sperren, Mengenbegrenzung je IP). - SAM-08: Import braucht `execute` auf `search_normalize`, `usage` auf `extensions`, Schreibrechte auf `game_alt_titles`. - 22003/22P02 werden in 3b auf „ungültige Eingabe“ abgebildet. - Merge vor #63 (3b). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 8 commits 2026-11-04 09:39:29 +00:00
Adds pg_trgm/unaccent, search_normalize, generated title_search/name_search
columns, game_alt_titles (read-only for API roles), manual_fields key
alt_titles and the RPC search_catalog_games. pgTAP 09_catalog_search covers
rights, normalization, relevance, filters, paging and the runbook snippets.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Parses de:Title;en:Title (';' forbidden in titles, errors with line number),
generates an idempotent reconcile for game_alt_titles, adds an info row to
checks.sql and attaches alternative titles to Testspiel B. Regenerated files.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Rank 4 and the genre/mechanic filters ran a correlated subplan per game
(13 s at 10 000 games). Now: one set-based word coverage, filters as one hashed
IN set, 'like all' patterns, similarity only for hits. Adds pgTAP cases found
by mutation testing (paging by relevance, alt title choice, duplicate words,
mechanic duplicates) and a Deno case for mark characters.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
supabase/perf/catalog_search_perf.sql loads synthetic data in one rolled-back
transaction and measures search_catalog_games as anon with RLS (explain and
p50/p95/p99 per case). Lives outside supabase/tests so it never runs in CI.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
datenmodell-r1, supabase README and katalog-pflege (alt titles, merge step 2b,
normalization check after image upgrades, rate limit and log hints).

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Adds the unchanged runbook queries (rolconfig, pg_available_extensions,
pg_settings) and asserts the settings that keep search terms out of logs.
katalog-pflege 8.2 now states that the three log settings depend on each other.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fix(db): single filter set, filter tests with query, perf guards, evidence docs (KAT-01, 3a review)
All checks were successful
CI / flutter (pull_request) Successful in 1m19s
CI / web-build (pull_request) Successful in 57s
CI / supabase (pull_request) Successful in 11s
CI / supabase-tests (pull_request) Successful in 38s
CI / e2e (pull_request) Successful in 2m59s
9fa91eb684
Filters are evaluated once into an id set used by both search branches.
Adds tests for age/genre/mechanic filters with a search term, rank 2 vs 3
and null p_limit. approxNormalize uses NFKD. Perf script checks confirm_local
value and unix socket and re-analyzes after rollback. Adds
docs/specs/3-katalog-suche-umsetzung.md (measurements, log check incl. GET
finding), release checklist section 2a and the CSV-only note for alt titles.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke merged commit 19f2e676b0 into main 2026-11-04 10:04:03 +00:00
cschlaefke deleted branch feature/3a-katalog-suche-backend 2026-11-04 10:04:03 +00:00
Sign in to join this conversation.
No description provided.