]> git.openstreetmap.org Git - nominatim.git/commitdiff
fix search for postcode via structured query
authorSarah Hoffmann <lonvia@denofr.de>
Tue, 3 Oct 2017 10:10:27 +0000 (12:10 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Tue, 3 Oct 2017 10:10:27 +0000 (12:10 +0200)
Results from the artifical postcode table were dropped
when reevaluating rank of results.

lib/Geocode.php
test/bdd/api/search/postcode.feature

index 80a959c28709299b901f3f29daf73a985ed4910d..aef2d3841cc5f4eec9d4e060baf002700e463f1f 100644 (file)
@@ -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));
index 6033f7cca5978ca105960579d0bcfc3fbc852cb3..63c8646946cb2d1170879b17c6ff0a9268340650 100644 (file)
@@ -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     |