From 55796e7d15a212251ad62c3f2fabe53691b5cc07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ullrich=20Sch=C3=A4fer?= Date: Mon, 13 Jul 2026 00:33:17 +0200 Subject: [PATCH] poi-index: dedupe classify INSERT (element matching a category via 2 selectors) The import hit a PK violation on (osm_type, osm_id, category): an OSM element that matches one category through two selectors on different keys (e.g. shelter = amenity=shelter OR tourism=wilderness_hut, both present) produced two rows for that category. Add DISTINCT ON (osm_type, osm_id, category) so classification is one row per (element, category), matching matchingCategoryIds semantics. Co-Authored-By: Claude Opus 4.8 (1M context) --- infrastructure/scripts/poi-import.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/infrastructure/scripts/poi-import.sh b/infrastructure/scripts/poi-import.sh index bfcce87..11b4431 100755 --- a/infrastructure/scripts/poi-import.sh +++ b/infrastructure/scripts/poi-import.sh @@ -117,8 +117,14 @@ log "building classified staging table" cat <<'SQL' DROP TABLE IF EXISTS planner.pois_staging; CREATE TABLE planner.pois_staging (LIKE planner.pois INCLUDING DEFAULTS); +-- DISTINCT ON collapses an element that matches a category through more than +-- one selector (e.g. shelter = amenity=shelter OR tourism=wilderness_hut; an +-- element tagged with both would otherwise produce two identical rows and +-- violate the (osm_type, osm_id, category) PK). This mirrors +-- matchingCategoryIds: one row per (element, category). INSERT INTO planner.pois_staging (osm_type, osm_id, category, name, geom, tags, imported_at) -SELECT r.doc->>'osm_type', +SELECT DISTINCT ON (r.doc->>'osm_type', r.doc->>'osm_id', s.category) + r.doc->>'osm_type', r.doc->>'osm_id', s.category, r.doc->>'name', @@ -126,7 +132,8 @@ SELECT r.doc->>'osm_type', COALESCE(r.doc->'tags', '{}'::jsonb), now() FROM planner.pois_raw_import r -JOIN poi_selector s ON r.doc->'tags'->>s.key = s.value; +JOIN poi_selector s ON r.doc->'tags'->>s.key = s.value +ORDER BY r.doc->>'osm_type', r.doc->>'osm_id', s.category; ALTER TABLE planner.pois_staging ADD CONSTRAINT pois_staging_pkey PRIMARY KEY (osm_type, osm_id, category); CREATE INDEX pois_staging_geom_idx ON planner.pois_staging USING gist (geom);