X-Git-Url: https://git.openstreetmap.org/nominatim.git/blobdiff_plain/2275fe59ab959f1dc4e4c33fc8a3fc72afb4c602..98432395c31f0ae46962907e2c19c4eebc12c8bb:/lib-php/SearchDescription.php diff --git a/lib-php/SearchDescription.php b/lib-php/SearchDescription.php index fcb87d43..d6fa704f 100644 --- a/lib-php/SearchDescription.php +++ b/lib-php/SearchDescription.php @@ -1,4 +1,12 @@ aName)) { $this->bNameNeedsAddress = $bNeedsAddress; } else { - $this->bNameNeedsAddress |= $bNeedsAddress; + $this->bNameNeedsAddress &= $bNeedsAddress; } if ($bSearchable) { $this->aName[$iId] = $iId; @@ -584,15 +592,14 @@ class SearchDescription // will be narrowed down by an address. Remember that with ordering // every single result has to be checked. if ($this->sHouseNumber && ($this->bRareName || !empty($this->aAddress) || $this->sPostcode)) { - $sHouseNumberRegex = '\\\\m'.$this->sHouseNumber.'\\\\M'; + $sHouseNumberRegex = $oDB->getDBQuoted('\\\\m'.$this->sHouseNumber.'\\\\M'); // Housenumbers on streets and places. $sChildHnr = 'SELECT * FROM placex WHERE parent_place_id = search_name.place_id'; - $sChildHnr .= " AND housenumber ~* E'".$sHouseNumberRegex."'"; + $sChildHnr .= ' AND housenumber ~* E'.$sHouseNumberRegex; // Interpolations on streets and places. if (preg_match('/^[0-9]+$/', $this->sHouseNumber)) { - $sIpolHnr = 'SELECT * FROM location_property_osmline '; - $sIpolHnr .= 'WHERE parent_place_id = search_name.place_id '; + $sIpolHnr = 'WHERE parent_place_id = search_name.place_id '; $sIpolHnr .= ' AND startnumber is not NULL'; $sIpolHnr .= ' AND '.$this->sHouseNumber.'>=startnumber '; $sIpolHnr .= ' AND '.$this->sHouseNumber.'<=endnumber '; @@ -601,12 +608,16 @@ class SearchDescription } // Housenumbers on the object iteself for unlisted places. $sSelfHnr = 'SELECT * FROM placex WHERE place_id = search_name.place_id'; - $sSelfHnr .= " AND housenumber ~* E'".$sHouseNumberRegex."'"; + $sSelfHnr .= ' AND housenumber ~* E'.$sHouseNumberRegex; $sSql = '(CASE WHEN address_rank = 30 THEN EXISTS('.$sSelfHnr.') '; $sSql .= ' ELSE EXISTS('.$sChildHnr.') '; if ($sIpolHnr) { - $sSql .= 'OR EXISTS('.$sIpolHnr.') '; + $sSql .= 'OR EXISTS(SELECT * FROM location_property_osmline '.$sIpolHnr.') '; + if (CONST_Use_US_Tiger_Data) { + $sSql .= "OR (country_code = 'us' AND "; + $sSql .= ' EXISTS(SELECT * FROM location_property_tiger '.$sIpolHnr.')) '; + } } $sSql .= 'END) DESC'; @@ -739,9 +750,9 @@ class SearchDescription return $aResults; } - $sHouseNumberRegex = '\\\\m'.$this->sHouseNumber.'\\\\M'; + $sHouseNumberRegex = $oDB->getDBQuoted('\\\\m'.$this->sHouseNumber.'\\\\M'); $sSQL = 'SELECT place_id FROM placex WHERE'; - $sSQL .= " housenumber ~* E'".$sHouseNumberRegex."'"; + $sSQL .= ' housenumber ~* E'.$sHouseNumberRegex; $sSQL .= ' AND ('.join(' OR ', $aIDCondition).')'; $sSQL .= $this->oContext->excludeSQL(' AND place_id'); @@ -758,18 +769,9 @@ class SearchDescription // if nothing found, search in the interpolation line table $sSQL = 'SELECT distinct place_id FROM location_property_osmline'; $sSQL .= ' WHERE startnumber is not NULL'; - $sSQL .= ' AND parent_place_id in ('.$sRoadPlaceIDs.') AND ('; - if ($iHousenumber % 2 == 0) { - // If housenumber is even, look for housenumber in streets - // with interpolationtype even or all. - $sSQL .= "interpolationtype='even'"; - } else { - // Else look for housenumber with interpolationtype odd or all. - $sSQL .= "interpolationtype='odd'"; - } - $sSQL .= " or interpolationtype='all') and "; - $sSQL .= $iHousenumber.'>=startnumber and '; - $sSQL .= $iHousenumber.'<=endnumber'; + $sSQL .= ' and parent_place_id in ('.$sRoadPlaceIDs.')'; + $sSQL .= ' and ('.$iHousenumber.' - startnumber) % step = 0'; + $sSQL .= ' and '.$iHousenumber.' between startnumber and endnumber'; $sSQL .= $this->oContext->excludeSQL(' AND place_id'); Debug::printSQL($sSQL);