metalfrom.eu/apps/api/migrations/013_geocode_dirty_trigger.sql
Nicolas Fryder 1ae5aa4b57 feat(geocoder): seuil de confiance strict, dedup, purge ancien pipeline
Étape 0 de la refonte pipeline crawl/géocodage.

Auto-requeue du géocodage
- migration 013: trigger trg_bands_geocode_dirty (AFTER UPDATE OF location_text
  ON bands) supprime les band_locations d'un band dès que sa localisation
  change réellement (IS DISTINCT FROM) — plus de points fantômes après un
  déménagement détecté par le crawler incrémental.
- enqueue.py: en plus du déclenchement manuel, un scan automatique tourne
  toutes les ENQUEUE_AUTO_INTERVAL_MIN minutes (défaut 60) et rattrape les
  bands rendus "dirty" par le trigger (idempotent, ON CONFLICT DO NOTHING —
  pas de canal de notification supplémentaire nécessaire). Chaque exécution
  (manuelle ou auto) crée une ligne crawl_run + logs rattachés, en miroir de
  crawler/src/db.py, pour apparaître dans l'activité admin à venir.

Crawl complet en calcul glissant
- remplace CRAWLER_SCHED_FULL_DAY (jour fixe du mois) par
  CRAWLER_FULL_CRAWL_INTERVAL_DAYS (défaut 60) basé sur le checkpoint
  last_full_crawl_at — robuste au calendrier et aux redémarrages (vérifié
  aussi au démarrage, pas seulement le tick quotidien 03:00 UTC).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 21:07:16 +02:00

25 lines
1.1 KiB
PL/PgSQL

-- 013_geocode_dirty_trigger.sql
-- Auto-requeue du géocodage quand location_text change en DB.
--
-- Avant ce trigger, un changement de localisation (déménagement détecté par le
-- crawler incrémental) laissait les anciennes band_locations en place — rien ne
-- les invalidait. On supprime les band_locations du band concerné dès que son
-- location_text change réellement ; le daemon enqueue (déclenchement manuel +
-- scan périodique de rattrapage, voir enqueue.py) reparse le texte et recrée
-- les steps. Resync complet (pas de diff fin) : simple et sûr, le cache
-- (geocode_cache + le fast-path dedup par (lieu,pays) dans band_locations)
-- absorbe le coût pour les lieux déjà vus ailleurs.
CREATE OR REPLACE FUNCTION bands_geocode_dirty() RETURNS trigger AS $$
BEGIN
IF TG_OP = 'UPDATE' AND OLD.location_text IS DISTINCT FROM NEW.location_text THEN
DELETE FROM band_locations WHERE ma_id = NEW.ma_id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_bands_geocode_dirty ON bands;
CREATE TRIGGER trg_bands_geocode_dirty
AFTER UPDATE OF location_text ON bands
FOR EACH ROW EXECUTE FUNCTION bands_geocode_dirty();