IF location.members[i+1] = 'street' THEN
FOR parent IN
SELECT place_id from placex
- WHERE osm_type = upper(substring(location.members[i], 1, 1))
+ WHERE osm_type = upper(substring(location.members[i], 1, 1))::char(1)
and osm_id = substring(location.members[i], 2)::bigint
and name is not null
and rank_search between 26 and 27
OR position(bnd_name in lower(name->'name')) > 0)
AND placex.class = 'place' AND placex.type = bnd.extratags->'place'
AND placex.osm_type = 'N'
- AND placex.linked_place_id is null
+ AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)
AND placex.rank_search < 26 -- needed to select the right index
AND placex.type != 'postcode'
AND ST_Covers(bnd.geometry, placex.geometry)
WHERE placex.class = 'place' AND placex.osm_type = 'N'
AND placex.extratags ? 'wikidata' -- needed to select right index
AND placex.extratags->'wikidata' = bnd.extratags->'wikidata'
- AND placex.linked_place_id is null
+ AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)
AND placex.rank_search < 26
AND _st_covers(bnd.geometry, placex.geometry)
ORDER BY lower(name->'name') = bnd_name desc
OR (bnd.rank_address = 0 and placex.rank_search = bnd.rank_search))
AND placex.osm_type = 'N'
AND placex.class = 'place'
- AND placex.linked_place_id is null
+ AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)
AND placex.rank_search < 26 -- needed to select the right index
AND placex.type != 'postcode'
AND ST_Covers(bnd.geometry, placex.geometry)
DELETE FROM place_addressline WHERE place_id = NEW.place_id;
result := deleteRoad(NEW.partition, NEW.place_id);
result := deleteLocationArea(NEW.partition, NEW.place_id, NEW.rank_search);
- UPDATE placex set linked_place_id = null, indexed_status = 2
- where linked_place_id = NEW.place_id;
- -- update not necessary for osmline, cause linked_place_id does not exist
NEW.extratags := NEW.extratags - 'linked_place'::TEXT;
linked_place := NEW.linked_place_id;
NEW.linked_place_id := OLD.linked_place_id;
- IF NEW.linked_place_id is not null THEN
- NEW.token_info := null;
- {% if debug %}RAISE WARNING 'place already linked to %', OLD.linked_place_id;{% endif %}
- RETURN NEW;
- END IF;
+ -- Remove linkage, if we have computed a different new linkee.
+ UPDATE placex SET linked_place_id = null, indexed_status = 2
+ WHERE linked_place_id = NEW.place_id
+ and (linked_place is null or linked_place_id != linked_place);
+ -- update not necessary for osmline, cause linked_place_id does not exist
-- Postcodes are just here to compute the centroids. They are not searchable
-- unless they are a boundary=postal_code.
NEW.class, NEW.type, NEW.admin_level,
(NEW.extratags->'capital') = 'yes',
NEW.address->'postcode');
+
+ -- Short-cut out for linked places. Note that this must happen after the
+ -- address rank has been recomputed. The linking might nullify a shift in
+ -- address rank.
+ IF NEW.linked_place_id is not null THEN
+ NEW.token_info := null;
+ {% if debug %}RAISE WARNING 'place already linked to %', OLD.linked_place_id;{% endif %}
+ RETURN NEW;
+ END IF;
+
-- We must always increase the address level relative to the admin boundary.
IF NEW.class = 'boundary' and NEW.type = 'administrative'
and NEW.osm_type = 'R' and NEW.rank_address > 0
-- Full indexing
{% if debug %}RAISE WARNING 'Using full index mode for % %', NEW.osm_type, NEW.osm_id;{% endif %}
IF linked_place is not null THEN
- SELECT * INTO location FROM placex WHERE place_id = linked_place;
+ -- Recompute the ranks here as the ones from the linked place might
+ -- have been shifted to accomodate surrounding boundaries.
+ SELECT place_id, osm_id, class, type, extratags,
+ centroid, geometry,
+ (compute_place_rank(country_code, osm_type, class, type, admin_level,
+ (extratags->'capital') = 'yes', null)).*
+ INTO location
+ FROM placex WHERE place_id = linked_place;
{% if debug %}RAISE WARNING 'Linked %', location;{% endif %}
NEW.centroid := geom;
END IF;
- {% if debug %}RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.rank_address;{% endif %}
- IF location.rank_address > parent_address_level
- and location.rank_address < 26
+ {% if debug %}RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.address_rank;{% endif %}
+ IF location.address_rank > parent_address_level
+ and location.address_rank < 26
THEN
- NEW.rank_address := location.rank_address;
+ NEW.rank_address := location.address_rank;
END IF;
-- merge in extra tags
|| coalesce(NEW.extratags, ''::hstore);
-- mark the linked place (excludes from search results)
- UPDATE placex set linked_place_id = NEW.place_id
+ -- Force reindexing to remove any traces from the search indexes and
+ -- reset the address rank if necessary.
+ UPDATE placex set linked_place_id = NEW.place_id, indexed_status = 2
WHERE place_id = location.place_id;
-- ensure that those places are not found anymore
{% if 'search_name' in db.tables %}