+-- copy 'name' to or from the default language (if there is a default language)
+CREATE OR REPLACE FUNCTION add_default_place_name(country_code VARCHAR(2),
+ INOUT name HSTORE)
+ AS $$
+DECLARE
+ default_language VARCHAR(10);
+BEGIN
+ IF name is not null AND array_upper(akeys(name),1) > 1 THEN
+ default_language := get_country_language_code(country_code);
+ IF default_language IS NOT NULL THEN
+ IF name ? 'name' AND NOT name ? ('name:'||default_language) THEN
+ name := name || hstore(('name:'||default_language), (name -> 'name'));
+ ELSEIF name ? ('name:'||default_language) AND NOT name ? 'name' THEN
+ name := name || hstore('name', (name -> ('name:'||default_language)));
+ END IF;
+ END IF;
+ END IF;
+END;
+$$
+LANGUAGE plpgsql IMMUTABLE;
+
+-- Find the parent road of a POI.
+--
+-- \returns Place ID of parent object or NULL if none
+--
+-- Copy data from linked items (POIs on ways, addr:street links, relations).
+--
+CREATE OR REPLACE FUNCTION find_parent_place_for_poi(poi_osm_type CHAR(1),
+ poi_osm_id BIGINT,
+ poi_partition SMALLINT,
+ near_centroid GEOMETRY,
+ addr_street TEXT,
+ addr_place TEXT,
+ fallback BOOL = true)
+ RETURNS BIGINT
+ AS $$
+DECLARE
+ parent_place_id BIGINT DEFAULT NULL;
+ location RECORD;
+ parent RECORD;
+BEGIN
+ --DEBUG: RAISE WARNING 'finding street for % %', poi_osm_type, poi_osm_id;
+
+ -- Is this object part of an associatedStreet relation?
+ FOR location IN
+ SELECT members FROM planet_osm_rels
+ WHERE parts @> ARRAY[poi_osm_id]
+ and members @> ARRAY[lower(poi_osm_type) || poi_osm_id]
+ and tags @> ARRAY['associatedStreet']
+ LOOP
+ FOR i IN 1..array_upper(location.members, 1) BY 2 LOOP
+ IF location.members[i+1] = 'street' THEN
+ --DEBUG: RAISE WARNING 'node in relation %',relation;
+ FOR parent IN
+ SELECT place_id from placex
+ WHERE osm_type = 'W' and osm_id = substring(location.members[i],2)::bigint
+ and name is not null
+ and rank_search between 26 and 27
+ LOOP
+ RETURN parent.place_id;
+ END LOOP;
+ END IF;
+ END LOOP;
+ END LOOP;
+
+ parent_place_id := find_parent_for_address(addr_street, addr_place,
+ poi_partition, near_centroid);
+ IF parent_place_id is not null THEN
+ RETURN parent_place_id;
+ END IF;
+
+ IF poi_osm_type = 'N' THEN
+ -- Is this node part of an interpolation?
+ FOR parent IN
+ SELECT q.parent_place_id
+ FROM location_property_osmline q, planet_osm_ways x
+ WHERE q.linegeo && near_centroid and x.id = q.osm_id
+ and poi_osm_id = any(x.nodes)
+ LIMIT 1
+ LOOP
+ --DEBUG: RAISE WARNING 'Get parent from interpolation: %', parent.parent_place_id;
+ RETURN parent.parent_place_id;
+ END LOOP;
+
+ -- Is this node part of any other way?
+ FOR location IN
+ SELECT p.place_id, p.osm_id, p.rank_search, p.address,
+ coalesce(p.centroid, ST_Centroid(p.geometry)) as centroid
+ FROM placex p, planet_osm_ways w
+ WHERE p.osm_type = 'W' and p.rank_search >= 26
+ and p.geometry && near_centroid
+ and w.id = p.osm_id and poi_osm_id = any(w.nodes)
+ LOOP
+ --DEBUG: RAISE WARNING 'Node is part of way % ', location.osm_id;
+
+ -- Way IS a road then we are on it - that must be our road
+ IF location.rank_search < 28 THEN
+ --DEBUG: RAISE WARNING 'node in way that is a street %',location;
+ return location.place_id;
+ END IF;
+
+ SELECT find_parent_place_for_poi('W', location.osm_id, poi_partition,
+ location.centroid,
+ location.address->'street',
+ location.address->'place',
+ false)
+ INTO parent_place_id;
+ IF parent_place_id is not null THEN
+ RETURN parent_place_id;
+ END IF;
+ END LOOP;
+ END IF;
+
+ -- Still nothing, just use the nearest road
+ IF fallback THEN
+ SELECT place_id FROM getNearestRoadFeature(poi_partition, near_centroid) INTO parent_place_id;
+ --DEBUG: RAISE WARNING 'Checked for nearest way (%)', parent_place_id;
+ END IF;
+
+ RETURN parent_place_id;
+END;
+$$
+LANGUAGE plpgsql STABLE;