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) <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-07-13 00:33:17 +02:00
parent 7d6a6147a0
commit 55796e7d15
No known key found for this signature in database
GPG key ID: A32FF691A0F752D9

View file

@ -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);