add explicit bbox contains check

Now that the containment check uses ST_Relate, we need to add
a separate bbox contains check to ensure that Postgis does the
efficient check first. Note that we still cannot get rid of the
overlap(&&) check because then Postgis will use the wrong indexes.
This commit is contained in:
Sarah Hoffmann
2020-10-19 10:39:01 +02:00
parent 3604d0d913
commit bf4d75458c

View File

@@ -618,18 +618,21 @@ BEGIN
NEW.rank_address := parent_address_level + 2; NEW.rank_address := parent_address_level + 2;
END IF; END IF;
END IF; END IF;
-- Second check that the boundary is not completely contained in a IF NEW.rank_address > 9 THEN
-- place area with a higher address rank -- Second check that the boundary is not completely contained in a
FOR location IN -- place area with a higher address rank
SELECT rank_address FROM placex FOR location IN
WHERE class = 'place' and rank_address < 24 SELECT rank_address FROM placex
and rank_address > NEW.rank_address WHERE class = 'place' and rank_address < 24
and geometry && NEW.geometry and rank_address > NEW.rank_address
and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal and geometry && NEW.geometry
ORDER BY rank_address desc LIMIT 1 and geometry ~ NEW.geometry -- needed because ST_Relate does not do bbox cover test
LOOP and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal
NEW.rank_address := location.rank_address + 2; ORDER BY rank_address desc LIMIT 1
END LOOP; LOOP
NEW.rank_address := location.rank_address + 2;
END LOOP;
END IF;
ELSEIF NEW.class = 'place' and NEW.osm_type = 'N' ELSEIF NEW.class = 'place' and NEW.osm_type = 'N'
and NEW.rank_address between 16 and 23 and NEW.rank_address between 16 and 23
THEN THEN