CREATE OR REPLACE FUNCTION placex_prepare_update(p placex,
OUT name HSTORE,
OUT address HSTORE,
- OUT country_feature VARCHAR)
+ OUT country_feature VARCHAR,
+ OUT linked_place_id BIGINT)
AS $$
+DECLARE
+ location RECORD;
BEGIN
-- For POI nodes, check if the address should be derived from a surrounding
-- building.
address := address - '_unlisted_place'::TEXT;
name := p.name;
+ -- Names of linked places need to be merged in, so search for a linkable
+ -- place already here.
+ SELECT * INTO location FROM find_linked_place(p);
+
+ IF location.place_id is not NULL THEN
+ linked_place_id := location.place_id;
+
+ IF NOT location.name IS NULL THEN
+ name := location.name || name;
+ END IF;
+ END IF;
+
country_feature := CASE WHEN p.admin_level = 2
and p.class = 'boundary' and p.type = 'administrative'
and p.osm_type = 'R'
nameaddress_vector INTEGER[];
addr_nameaddress_vector INTEGER[];
+ linked_place BIGINT;
+
linked_node_id BIGINT;
linked_importance FLOAT;
linked_wikipedia TEXT;
NEW.extratags := NEW.extratags - 'linked_place'::TEXT;
+ -- NEW.linked_place_id contains the precomputed linkee. Save this and restore
+ -- the previous link status.
+ 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 %', NEW.linked_place_id;{% endif %}
+ {% if debug %}RAISE WARNING 'place already linked to %', OLD.linked_place_id;{% endif %}
RETURN NEW;
END IF;
-- ---------------------------------------------------------------------------
-- Full indexing
{% if debug %}RAISE WARNING 'Using full index mode for % %', NEW.osm_type, NEW.osm_id;{% endif %}
- SELECT * INTO location FROM find_linked_place(NEW);
- IF location.place_id is not null THEN
+ IF linked_place is not null THEN
+ SELECT * INTO location FROM placex WHERE place_id = linked_place;
+
{% if debug %}RAISE WARNING 'Linked %', location;{% endif %}
-- Use the linked point as the centre point of the geometry,
NEW.rank_address := location.rank_address;
END IF;
- -- merge in the label name
- IF NOT location.name IS NULL THEN
- NEW.name := location.name || NEW.name;
- END IF;
-
-- merge in extra tags
NEW.extratags := hstore('linked_' || location.class, location.type)
|| coalesce(location.extratags, ''::hstore)
""" Returns SQL commands for indexing of the placex table.
"""
SELECT_SQL = pysql.SQL('SELECT place_id FROM placex ')
+ UPDATE_LINE = "(%s, %s::hstore, %s::hstore, %s::int, %s::jsonb)"
def __init__(self, rank, analyzer):
self.rank = rank
def _index_sql(num_places):
return pysql.SQL(
""" UPDATE placex
- SET indexed_status = 0, address = v.addr, token_info = v.ti
- FROM (VALUES {}) as v(id, addr, ti)
+ SET indexed_status = 0, address = v.addr, token_info = v.ti,
+ name = v.name, linked_place_id = v.linked_place_id
+ FROM (VALUES {}) as v(id, name, addr, linked_place_id, ti)
WHERE place_id = v.id
- """).format(_mk_valuelist("(%s, %s::hstore, %s::jsonb)", num_places))
+ """).format(_mk_valuelist(AbstractPlacexRunner.UPDATE_LINE, num_places))
@staticmethod
def index_places(self, worker, places):
values = []
for place in places:
- values.extend((place[x] for x in ('place_id', 'address')))
+ for field in ('place_id', 'name', 'address', 'linked_place_id'):
+ values.append(place[field])
values.append(psycopg2.extras.Json(self.analyzer.process_place(place)))
worker.perform(self._index_sql(len(places)), values)
--- /dev/null
+@DB
+Feature: Searching linked places
+ Tests that information from linked places can be searched correctly
+
+ Scenario: Additional names from linked places are searchable
+ Given the places
+ | osm | class | type | admin | name | geometry |
+ | R13 | boundary | administrative | 6 | Garbo | poly-area:0.1 |
+ Given the places
+ | osm | class | type | admin | name+name:it | geometry |
+ | N2 | place | hamlet | 15 | Vario | 0.006 0.00001 |
+ And the relations
+ | id | members | tags+type |
+ | 13 | N2:label | boundary |
+ When importing
+ Then placex contains
+ | object | linked_place_id |
+ | N2 | R13 |
+ When sending search query "Vario"
+ Then results contain
+ | osm |
+ | R13 |
with self.conn.cursor() as cur:
cur.execute('CREATE EXTENSION hstore')
cur.execute("""CREATE TABLE placex (place_id BIGINT,
+ name HSTORE,
class TEXT,
type TEXT,
+ linked_place_id BIGINT,
rank_address SMALLINT,
rank_search SMALLINT,
indexed_status SMALLINT,
cur.execute("""CREATE OR REPLACE FUNCTION placex_prepare_update(p placex,
OUT name HSTORE,
OUT address HSTORE,
- OUT country_feature VARCHAR)
+ OUT country_feature VARCHAR,
+ OUT linked_place_id BIGINT)
AS $$
BEGIN
address := p.address;
- name := p.address;
+ name := p.name;
END;
$$ LANGUAGE plpgsql STABLE;
""")