mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
reorganize handling of place type changes
Always replace existing entries in place, never delete them because a direct delete will cause conflicts.
This commit is contained in:
@@ -47,8 +47,6 @@ BEGIN
|
|||||||
|
|
||||||
{% if debug %}RAISE WARNING 'Existing: %',existing.osm_id;{% endif %}
|
{% if debug %}RAISE WARNING 'Existing: %',existing.osm_id;{% endif %}
|
||||||
|
|
||||||
-- Handle a place changing type by removing the old data.
|
|
||||||
-- (This trigger is executed BEFORE INSERT of the NEW tuple.)
|
|
||||||
IF existing.osm_type IS NULL THEN
|
IF existing.osm_type IS NULL THEN
|
||||||
DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class;
|
DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class;
|
||||||
END IF;
|
END IF;
|
||||||
@@ -192,15 +190,11 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
IF existing.osm_type IS NOT NULL THEN
|
IF existingplacex.osm_type is not NULL THEN
|
||||||
-- Pathological case caused by the triggerless copy into place during initial import
|
-- Mark any existing place for delete in the placex table
|
||||||
-- force delete even for large areas, it will be reinserted later
|
UPDATE placex SET indexed_status = 100
|
||||||
UPDATE place SET geometry = ST_SetSRID(ST_Point(0,0), 4326)
|
WHERE placex.osm_type = NEW.osm_type and placex.osm_id = NEW.osm_id
|
||||||
WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
|
and placex.class = 'boundary' and placex.type = 'administrative';
|
||||||
and class = NEW.class and type = NEW.type;
|
|
||||||
DELETE FROM place
|
|
||||||
WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
|
|
||||||
and class = NEW.class and type = NEW.type;
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- Process it as a new insertion
|
-- Process it as a new insertion
|
||||||
@@ -211,6 +205,27 @@ BEGIN
|
|||||||
|
|
||||||
{% if debug %}RAISE WARNING 'insert done % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,NEW.name;{% endif %}
|
{% if debug %}RAISE WARNING 'insert done % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,NEW.name;{% endif %}
|
||||||
|
|
||||||
|
IF existing.osm_type is not NULL THEN
|
||||||
|
-- If there is already an entry in place, just update that, if necessary.
|
||||||
|
IF coalesce(existing.name, ''::hstore) != coalesce(NEW.name, ''::hstore)
|
||||||
|
or coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
|
||||||
|
or coalesce(existing.extratags, ''::hstore) != coalesce(NEW.extratags, ''::hstore)
|
||||||
|
or coalesce(existing.admin_level, 15) != coalesce(NEW.admin_level, 15)
|
||||||
|
or existing.geometry::text != NEW.geometry::text
|
||||||
|
THEN
|
||||||
|
UPDATE place
|
||||||
|
SET name = NEW.name,
|
||||||
|
address = NEW.address,
|
||||||
|
extratags = NEW.extratags,
|
||||||
|
admin_level = NEW.admin_level,
|
||||||
|
geometry = NEW.geometry
|
||||||
|
WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
|
||||||
|
and class = NEW.class and type = NEW.type;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
RETURN NULL;
|
||||||
|
END IF;
|
||||||
|
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
|||||||
@@ -364,3 +364,50 @@ Feature: Tag evaluation
|
|||||||
| object | indexed_status |
|
| object | indexed_status |
|
||||||
| W1:tourism | 2 |
|
| W1:tourism | 2 |
|
||||||
| W1:highway | 1 |
|
| W1:highway | 1 |
|
||||||
|
|
||||||
|
|
||||||
|
Scenario: Replay on administrative boundary
|
||||||
|
When loading osm data
|
||||||
|
"""
|
||||||
|
n10 x34.0 y-4.23
|
||||||
|
n11 x34.1 y-4.23
|
||||||
|
n12 x34.2 y-4.13
|
||||||
|
w10 Tboundary=administrative,waterway=river,name=Border,admin_level=2 Nn12,n11,n10
|
||||||
|
"""
|
||||||
|
Then place contains exactly
|
||||||
|
| object |
|
||||||
|
| W10:waterway |
|
||||||
|
| W10:boundary |
|
||||||
|
|
||||||
|
When updating osm data
|
||||||
|
"""
|
||||||
|
w10 Tboundary=administrative,waterway=river,name=Border,admin_level=2 Nn12,n11,n10
|
||||||
|
"""
|
||||||
|
Then place contains exactly
|
||||||
|
| object |
|
||||||
|
| W10:waterway |
|
||||||
|
| W10:boundary |
|
||||||
|
And placex contains exactly
|
||||||
|
| object |
|
||||||
|
| W10:waterway |
|
||||||
|
|
||||||
|
|
||||||
|
Scenario: Change admin_level on administrative boundary
|
||||||
|
When loading osm data
|
||||||
|
"""
|
||||||
|
n10 x34.0 y-4.23
|
||||||
|
n11 x34.1 y-4.23
|
||||||
|
n12 x34.2 y-4.13
|
||||||
|
w10 Tboundary=administrative,name=Border,admin_level=2 Nn12,n11,n10
|
||||||
|
"""
|
||||||
|
Then place contains exactly
|
||||||
|
| object | admin_level |
|
||||||
|
| W10:boundary | 2 |
|
||||||
|
|
||||||
|
When updating osm data
|
||||||
|
"""
|
||||||
|
w10 Tboundary=administrative,name=Border,admin_level=4 Nn12,n11,n10
|
||||||
|
"""
|
||||||
|
Then place contains exactly
|
||||||
|
| object | admin_level |
|
||||||
|
| W10:boundary | 4 |
|
||||||
|
|||||||
Reference in New Issue
Block a user