É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>
25 lines
1.1 KiB
PL/PgSQL
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();
|