From: Sarah Hoffmann Date: Tue, 3 Oct 2017 10:10:27 +0000 (+0200) Subject: fix search for postcode via structured query X-Git-Tag: v3.1.0~62 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/e3323e88881b5da706c47bcd45e69aedacf8350b?hp=eacaf3489e9fbc6e4db34ea87ef0a2012521de28 fix search for postcode via structured query Results from the artifical postcode table were dropped when reevaluating rank of results. --- diff --git a/lib/Geocode.php b/lib/Geocode.php index 80a959c2..aef2d384 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -1738,9 +1738,11 @@ class Geocode // Need to verify passes rank limits before dropping out of the loop (yuk!) // reduces the number of place ids, like a filter // rank_address is 30 for interpolated housenumbers + $sWherePlaceId = 'WHERE place_id in ('; + $sWherePlaceId .= join(',', array_keys($aResultPlaceIDs)).') '; + $sSQL = "SELECT place_id "; - $sSQL .= "FROM placex "; - $sSQL .= "WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).") "; + $sSQL .= "FROM placex ".$sWherePlaceId; $sSQL .= " AND ("; $sSQL .= " placex.rank_address between $this->iMinAddressRank and $this->iMaxAddressRank "; if (14 >= $this->iMinAddressRank && 14 <= $this->iMaxAddressRank) { @@ -1749,18 +1751,22 @@ class Geocode if ($this->aAddressRankList) { $sSQL .= " OR placex.rank_address in (".join(',', $this->aAddressRankList).")"; } - $sSQL .= " ) "; + $sSQL .= " ) UNION "; + $sSQL .= " SELECT place_id FROM location_postcode lp ".$sWherePlaceId; + $sSQL .= " AND (lp.rank_address between $this->iMinAddressRank and $this->iMaxAddressRank "; + if ($this->aAddressRankList) { + $sSQL .= " OR lp.rank_address in (".join(',', $this->aAddressRankList).")"; + } + $sSQL .= ") "; if (CONST_Use_US_Tiger_Data && $this->iMaxAddressRank == 30) { $sSQL .= "UNION "; $sSQL .= " SELECT place_id "; - $sSQL .= " FROM location_property_tiger "; - $sSQL .= " WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).") "; + $sSQL .= " FROM location_property_tiger ".$sWherePlaceId; } if ($this->iMaxAddressRank == 30) { $sSQL .= "UNION "; $sSQL .= " SELECT place_id "; - $sSQL .= " FROM location_property_osmline "; - $sSQL .= " WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).")"; + $sSQL .= " FROM location_property_osmline ".$sWherePlaceId; } if (CONST_Debug) var_dump($sSQL); $aFilteredPlaceIDs = chksql($this->oDB->getCol($sSQL)); diff --git a/test/bdd/api/search/postcode.feature b/test/bdd/api/search/postcode.feature index 6033f7cc..63c86469 100644 --- a/test/bdd/api/search/postcode.feature +++ b/test/bdd/api/search/postcode.feature @@ -25,3 +25,11 @@ Feature: Searches with postcodes Then result addresses contain | country_code | | li | + + Scenario: Postcode search with structured query + When sending json search query "" with address + | postalcode | country | + | 9490 | li | + Then result addresses contain + | country_code | postcode | + | li | 9490 |