← back to Stayclaim

db/migrations/012_pd_film_image_match_productions.sql

34 lines

-- One-shot fuzzy match: link pd_film_image rows to film_production via title similarity.
-- Threshold 0.45 trigram similarity = "very likely the same title", err on conservative side.
-- Re-runnable: only updates rows whose production_id is currently NULL.

CREATE EXTENSION IF NOT EXISTS pg_trgm;

WITH candidates AS (
  SELECT
    img.id   AS img_id,
    fp.id    AS production_id,
    similarity(lower(img.title), lower(fp.title)) AS sim,
    row_number() OVER (
      PARTITION BY img.id
      ORDER BY similarity(lower(img.title), lower(fp.title)) DESC, fp.year DESC NULLS LAST
    ) AS rnk
  FROM pd_film_image img
  CROSS JOIN film_production fp
  WHERE img.production_id IS NULL
    AND length(img.title) > 4
    AND length(fp.title)  > 3
    AND lower(img.title) % lower(fp.title)   -- pg_trgm fast pre-filter (uses GIN if indexed)
    AND similarity(lower(img.title), lower(fp.title)) >= 0.45
)
UPDATE pd_film_image img
SET production_id = c.production_id
FROM candidates c
WHERE c.img_id = img.id AND c.rnk = 1;

SELECT
  'matched' AS status,
  count(*) AS n
FROM pd_film_image
WHERE production_id IS NOT NULL;