+ -- 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
+ THEN
+ parent_address_level := get_parent_address_level(NEW.centroid, NEW.admin_level);
+ IF parent_address_level >= NEW.rank_address THEN
+ IF parent_address_level >= 24 THEN
+ NEW.rank_address := 25;
+ ELSE
+ NEW.rank_address := parent_address_level + 2;
+ END IF;
+ END IF;
+ -- If a place node is contained in a admin boundary with the same address level
+ -- and has not been linked, then make the node a subpart by increasing the
+ -- address rank (city level and above).
+ ELSEIF NEW.class = 'place' and NEW.osm_type = 'N'
+ and NEW.rank_address between 16 and 23
+ THEN
+ FOR location IN
+ SELECT rank_address FROM placex
+ WHERE osm_type = 'R' and class = 'boundary' and type = 'administrative'
+ and rank_address = NEW.rank_address
+ and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid)
+ LIMIT 1
+ LOOP
+ NEW.rank_address = NEW.rank_address + 2;
+ END LOOP;
+ ELSE
+ parent_address_level := 3;
+ END IF;