From: Sarah Hoffmann Date: Mon, 12 Jul 2021 15:14:59 +0000 (+0200) Subject: Merge pull request #2391 from lonvia/fix-sonar-issues X-Git-Tag: v4.0.0~52 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/b4fec57b6d53f8e8a45c46ff11f13cbcbea1006a?hp=322fa19cebbd2e5fee5d487fe83b9b0a24e052be Merge pull request #2391 from lonvia/fix-sonar-issues Fix bugs and code smells found by Sonarqube --- diff --git a/lib-php/AddressDetails.php b/lib-php/AddressDetails.php index bf8defc2..91e3d89f 100644 --- a/lib-php/AddressDetails.php +++ b/lib-php/AddressDetails.php @@ -61,7 +61,7 @@ class AddressDetails return join(', ', $aParts); } - public function getAddressNames($sCountry = null) + public function getAddressNames() { $aAddress = array(); @@ -79,12 +79,11 @@ class AddressDetails $sName = $aLine['housenumber']; } - if (isset($sName)) { - if (!isset($aAddress[$sTypeLabel]) - || $aLine['class'] == 'place' - ) { - $aAddress[$sTypeLabel] = $sName; - } + if (isset($sName) + && (!isset($aAddress[$sTypeLabel]) + || $aLine['class'] == 'place') + ) { + $aAddress[$sTypeLabel] = $sName; } } diff --git a/lib-php/DB.php b/lib-php/DB.php index abd23179..03ee6f1b 100644 --- a/lib-php/DB.php +++ b/lib-php/DB.php @@ -39,7 +39,9 @@ class DB $conn->exec("SET DateStyle TO 'sql,european'"); $conn->exec("SET client_encoding TO 'utf-8'"); $iMaxExecution = ini_get('max_execution_time'); - if ($iMaxExecution > 0) $conn->setAttribute(\PDO::ATTR_TIMEOUT, $iMaxExecution); // seconds + if ($iMaxExecution > 0) { + $conn->setAttribute(\PDO::ATTR_TIMEOUT, $iMaxExecution); // seconds + } $this->connection = $conn; return true; @@ -95,7 +97,9 @@ class DB try { $stmt = $this->getQueryStatement($sSQL, $aInputVars, $sErrMessage); $row = $stmt->fetch(\PDO::FETCH_NUM); - if ($row === false) return false; + if ($row === false) { + return false; + } } catch (\PDOException $e) { throw new \Nominatim\DatabaseError($sErrMessage, 500, null, $e, $sSQL); } @@ -306,9 +310,13 @@ class DB if (preg_match('/^pgsql:(.+)$/', $sDSN, $aMatches)) { foreach (explode(';', $aMatches[1]) as $sKeyVal) { list($sKey, $sVal) = explode('=', $sKeyVal, 2); - if ($sKey == 'host') $sKey = 'hostspec'; - if ($sKey == 'dbname') $sKey = 'database'; - if ($sKey == 'user') $sKey = 'username'; + if ($sKey == 'host') { + $sKey = 'hostspec'; + } elseif ($sKey == 'dbname') { + $sKey = 'database'; + } elseif ($sKey == 'user') { + $sKey = 'username'; + } $aInfo[$sKey] = $sVal; } } diff --git a/lib-php/DatabaseError.php b/lib-php/DatabaseError.php index 3a53bc8f..ec428de1 100644 --- a/lib-php/DatabaseError.php +++ b/lib-php/DatabaseError.php @@ -5,7 +5,7 @@ namespace Nominatim; class DatabaseError extends \Exception { - public function __construct($message, $code = 500, Exception $previous = null, $oPDOErr, $sSql = null) + public function __construct($message, $code, $previous, $oPDOErr, $sSql = null) { parent::__construct($message, $code, $previous); // https://secure.php.net/manual/en/class.pdoexception.php diff --git a/lib-php/DebugHtml.php b/lib-php/DebugHtml.php index 98da8794..19221b43 100644 --- a/lib-php/DebugHtml.php +++ b/lib-php/DebugHtml.php @@ -78,7 +78,7 @@ class Debug echo 'Address TokensAddress Not'; echo 'countryoperator'; echo 'classtypepostcodehousenumber'; - foreach ($aSearches as $iRank => $aRankedSet) { + foreach ($aSearches as $aRankedSet) { foreach ($aRankedSet as $aRow) { $aRow->dumpAsHtmlTableRow($aWordsIDs); } diff --git a/lib-php/Geocode.php b/lib-php/Geocode.php index a3883b25..ec21a0dc 100644 --- a/lib-php/Geocode.php +++ b/lib-php/Geocode.php @@ -70,7 +70,9 @@ class Geocode $aParams['exclude_place_ids'] = implode(',', $this->aExcludePlaceIDs); } - if ($this->bBoundedSearch) $aParams['bounded'] = '1'; + if ($this->bBoundedSearch) { + $aParams['bounded'] = '1'; + } if ($this->aCountryCodes) { $aParams['countrycodes'] = implode(',', $this->aCountryCodes); @@ -85,8 +87,11 @@ class Geocode public function setLimit($iLimit = 10) { - if ($iLimit > 50) $iLimit = 50; - if ($iLimit < 1) $iLimit = 1; + if ($iLimit > 50) { + $iLimit = 50; + } elseif ($iLimit < 1) { + $iLimit = 1; + } $this->iFinalLimit = $iLimit; $this->iLimit = $iLimit + min($iLimit, 10); @@ -181,18 +186,24 @@ class Geocode if ($sExcluded) { foreach ($sExcluded as $iExcludedPlaceID) { $iExcludedPlaceID = (int)$iExcludedPlaceID; - if ($iExcludedPlaceID) + if ($iExcludedPlaceID) { $aExcludePlaceIDs[$iExcludedPlaceID] = $iExcludedPlaceID; + } } - if (isset($aExcludePlaceIDs)) + if (isset($aExcludePlaceIDs)) { $this->aExcludePlaceIDs = $aExcludePlaceIDs; + } } // Only certain ranks of feature $sFeatureType = $oParams->getString('featureType'); - if (!$sFeatureType) $sFeatureType = $oParams->getString('featuretype'); - if ($sFeatureType) $this->setFeatureType($sFeatureType); + if (!$sFeatureType) { + $sFeatureType = $oParams->getString('featuretype'); + } + if ($sFeatureType) { + $this->setFeatureType($sFeatureType); + } // Country code list $sCountries = $oParams->getStringList('countrycodes'); @@ -202,8 +213,9 @@ class Geocode $aCountries[] = strtolower($sCountryCode); } } - if (isset($aCountries)) + if (isset($aCountries)) { $this->aCountryCodes = $aCountries; + } } $aViewbox = $oParams->getStringList('viewboxlbrt'); @@ -255,13 +267,17 @@ class Geocode public function loadStructuredAddressElement($sValue, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues) { $sValue = trim($sValue); - if (!$sValue) return false; + if (!$sValue) { + return false; + } $this->aStructuredQuery[$sKey] = $sValue; if ($this->iMinAddressRank == 0 && $this->iMaxAddressRank == 30) { $this->iMinAddressRank = $iNewMinAddressRank; $this->iMaxAddressRank = $iNewMaxAddressRank; } - if ($aItemListValues) $this->aAddressRankList = array_merge($this->aAddressRankList, $aItemListValues); + if ($aItemListValues) { + $this->aAddressRankList = array_merge($this->aAddressRankList, $aItemListValues); + } return true; } @@ -295,11 +311,11 @@ class Geocode public function fallbackStructuredQuery() { - if (!$this->aStructuredQuery) return false; - $aParams = $this->aStructuredQuery; - if (count($aParams) == 1) return false; + if (!$aParams || count($aParams) == 1) { + return false; + } $aOrderToFallback = array('postalcode', 'street', 'city', 'county', 'state'); @@ -336,14 +352,9 @@ class Geocode // Add all words from this wordset foreach ($aWordset as $iToken => $sToken) { - //echo "
$sToken"; $aNewWordsetSearches = array(); foreach ($aWordsetSearches as $oCurrentSearch) { - //echo ""; - //var_dump($oCurrentSearch); - //echo ""; - // Tokens with full name matches. foreach ($oValidTokens->get(' '.$sToken) as $oSearchTerm) { $aNewSearches = $oCurrentSearch->extendWithFullTerm( @@ -387,7 +398,6 @@ class Geocode usort($aNewWordsetSearches, array('Nominatim\SearchDescription', 'bySearchRank')); $aWordsetSearches = array_slice($aNewWordsetSearches, 0, 50); } - //var_Dump('
',count($aWordsetSearches)); exit; $aNewPhraseSearches = array_merge($aNewPhraseSearches, $aNewWordsetSearches); usort($aNewPhraseSearches, array('Nominatim\SearchDescription', 'bySearchRank')); @@ -395,8 +405,11 @@ class Geocode $aSearchHash = array(); foreach ($aNewPhraseSearches as $iSearch => $aSearch) { $sHash = serialize($aSearch); - if (isset($aSearchHash[$sHash])) unset($aNewPhraseSearches[$iSearch]); - else $aSearchHash[$sHash] = 1; + if (isset($aSearchHash[$sHash])) { + unset($aNewPhraseSearches[$iSearch]); + } else { + $aSearchHash[$sHash] = 1; + } } $aNewPhraseSearches = array_slice($aNewPhraseSearches, 0, 50); @@ -417,10 +430,12 @@ class Geocode $iSearchCount = 0; $aSearches = array(); - foreach ($aGroupedSearches as $iScore => $aNewSearches) { + foreach ($aGroupedSearches as $aNewSearches) { $iSearchCount += count($aNewSearches); $aSearches = array_merge($aSearches, $aNewSearches); - if ($iSearchCount > 50) break; + if ($iSearchCount > 50) { + break; + } } } @@ -477,7 +492,9 @@ class Geocode public function lookup() { Debug::newFunction('Geocode::lookup'); - if (!$this->sQuery && !$this->aStructuredQuery) return array(); + if (!$this->sQuery && !$this->aStructuredQuery) { + return array(); + } Debug::printDebugArray('Geocode', $this); @@ -503,10 +520,6 @@ class Geocode Debug::newSection('Query Preprocessing'); - $sLanguagePrefArraySQL = $this->oDB->getArraySQL( - $this->oDB->getDBQuotedList($this->aLangPrefOrder) - ); - $sQuery = $this->sQuery; if (!preg_match('//u', $sQuery)) { userError('Query string is not UTF-8 encoded.'); @@ -639,7 +652,9 @@ class Geocode $aGroupedSearches = array(); foreach ($aSearches as $aSearch) { if ($aSearch->getRank() < $this->iMaxRank) { - if (!isset($aGroupedSearches[$aSearch->getRank()])) $aGroupedSearches[$aSearch->getRank()] = array(); + if (!isset($aGroupedSearches[$aSearch->getRank()])) { + $aGroupedSearches[$aSearch->getRank()] = array(); + } $aGroupedSearches[$aSearch->getRank()][] = $aSearch; } } @@ -653,7 +668,9 @@ class Geocode $sHash = serialize($aSearch); if (isset($aSearchHash[$sHash])) { unset($aGroupedSearches[$iGroup][$iSearch]); - if (empty($aGroupedSearches[$iGroup])) unset($aGroupedSearches[$iGroup]); + if (empty($aGroupedSearches[$iGroup])) { + unset($aGroupedSearches[$iGroup]); + } } else { $aSearchHash[$sHash] = 1; } @@ -697,7 +714,9 @@ class Geocode } } - if ($iQueryLoop > 20) break; + if ($iQueryLoop > 20) { + break; + } } if (!empty($aResults)) { @@ -772,9 +791,9 @@ class Geocode $aResults = $tempIDs; } - if (!empty($aResults)) break; - if ($iGroupLoop > 4) break; - if ($iQueryLoop > 30) break; + if (!empty($aResults) || $iGroupLoop > 4 || $iQueryLoop > 30) { + break; + } } } else { // Just interpret as a reverse geocode @@ -792,10 +811,8 @@ class Geocode // No results? Done if (empty($aResults)) { - if ($this->bFallback) { - if ($this->fallbackStructuredQuery()) { - return $this->lookup(); - } + if ($this->bFallback && $this->fallbackStructuredQuery()) { + return $this->lookup(); } return array(); @@ -814,7 +831,9 @@ class Geocode $aRecheckWords = preg_split('/\b[\s,\\-]*/u', $sQuery); foreach ($aRecheckWords as $i => $sWord) { - if (!preg_match('/[\pL\pN]/', $sWord)) unset($aRecheckWords[$i]); + if (!preg_match('/[\pL\pN]/', $sWord)) { + unset($aRecheckWords[$i]); + } } Debug::printVar('Recheck words', $aRecheckWords); @@ -874,7 +893,9 @@ class Geocode foreach ($aRecheckWords as $i => $sWord) { if (stripos($sAddress, $sWord)!==false) { $iCountWords++; - if (preg_match('/(^|,)\s*'.preg_quote($sWord, '/').'\s*(,|$)/', $sAddress)) $iCountWords += 0.1; + if (preg_match('/(^|,)\s*'.preg_quote($sWord, '/').'\s*(,|$)/', $sAddress)) { + $iCountWords += 0.1; + } } } @@ -891,15 +912,8 @@ class Geocode $aToFilter = $aSearchResults; $aSearchResults = array(); - $bFirst = true; foreach ($aToFilter as $aResult) { $this->aExcludePlaceIDs[$aResult['place_id']] = $aResult['place_id']; - if ($bFirst) { - $fLat = $aResult['lat']; - $fLon = $aResult['lon']; - if (isset($aResult['zoom'])) $iZoom = $aResult['zoom']; - $bFirst = false; - } if (!$this->oPlaceLookup->doDeDupe() || (!isset($aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']]) && !isset($aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name'].$aResult['admin_level']])) ) { @@ -909,7 +923,9 @@ class Geocode } // Absolute limit on number of results - if (count($aSearchResults) >= $this->iFinalLimit) break; + if (count($aSearchResults) >= $this->iFinalLimit) { + break; + } } Debug::printVar('Post-filter results', $aSearchResults); diff --git a/lib-php/ParameterParser.php b/lib-php/ParameterParser.php index 32a848b9..d4068aa3 100644 --- a/lib-php/ParameterParser.php +++ b/lib-php/ParameterParser.php @@ -90,14 +90,16 @@ class ParameterParser $aLanguages = array(); $sLangString = $this->getString('accept-language', $sFallback); - if ($sLangString) { - if (preg_match_all('/(([a-z]{1,8})([-_][a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $sLangString, $aLanguagesParse, PREG_SET_ORDER)) { - foreach ($aLanguagesParse as $iLang => $aLanguage) { - $aLanguages[$aLanguage[1]] = isset($aLanguage[5])?(float)$aLanguage[5]:1 - ($iLang/100); - if (!isset($aLanguages[$aLanguage[2]])) $aLanguages[$aLanguage[2]] = $aLanguages[$aLanguage[1]]/10; + if ($sLangString + && preg_match_all('/(([a-z]{1,8})([-_][a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $sLangString, $aLanguagesParse, PREG_SET_ORDER) + ) { + foreach ($aLanguagesParse as $iLang => $aLanguage) { + $aLanguages[$aLanguage[1]] = isset($aLanguage[5])?(float)$aLanguage[5]:1 - ($iLang/100); + if (!isset($aLanguages[$aLanguage[2]])) { + $aLanguages[$aLanguage[2]] = $aLanguages[$aLanguage[1]]/10; } - arsort($aLanguages); } + arsort($aLanguages); } if (empty($aLanguages) && CONST_Default_Language) { $aLanguages[CONST_Default_Language] = 1; diff --git a/lib-php/PlaceLookup.php b/lib-php/PlaceLookup.php index b9fa3b1c..7e78d536 100644 --- a/lib-php/PlaceLookup.php +++ b/lib-php/PlaceLookup.php @@ -89,20 +89,36 @@ class PlaceLookup { $aParams = array(); - if ($this->bAddressDetails) $aParams['addressdetails'] = '1'; - if ($this->bExtraTags) $aParams['extratags'] = '1'; - if ($this->bNameDetails) $aParams['namedetails'] = '1'; + if ($this->bAddressDetails) { + $aParams['addressdetails'] = '1'; + } + if ($this->bExtraTags) { + $aParams['extratags'] = '1'; + } + if ($this->bNameDetails) { + $aParams['namedetails'] = '1'; + } - if ($this->bIncludePolygonAsText) $aParams['polygon_text'] = '1'; - if ($this->bIncludePolygonAsGeoJSON) $aParams['polygon_geojson'] = '1'; - if ($this->bIncludePolygonAsKML) $aParams['polygon_kml'] = '1'; - if ($this->bIncludePolygonAsSVG) $aParams['polygon_svg'] = '1'; + if ($this->bIncludePolygonAsText) { + $aParams['polygon_text'] = '1'; + } + if ($this->bIncludePolygonAsGeoJSON) { + $aParams['polygon_geojson'] = '1'; + } + if ($this->bIncludePolygonAsKML) { + $aParams['polygon_kml'] = '1'; + } + if ($this->bIncludePolygonAsSVG) { + $aParams['polygon_svg'] = '1'; + } if ($this->fPolygonSimplificationThreshold > 0.0) { $aParams['polygon_threshold'] = $this->fPolygonSimplificationThreshold; } - if (!$this->bDeDupe) $aParams['dedupe'] = '0'; + if (!$this->bDeDupe) { + $aParams['dedupe'] = '0'; + } return $aParams; } @@ -147,8 +163,9 @@ class PlaceLookup private function langAddressSql($sHousenumber) { - if ($this->bAddressDetails) + if ($this->bAddressDetails) { return ''; // langaddress will be computed from address details + } return 'get_address_by_language(place_id,'.$sHousenumber.','.$this->aLangPrefOrderSql.') AS langaddress,'; } @@ -234,12 +251,20 @@ class PlaceLookup $sSQL .= ' housenumber,'; $sSQL .= ' country_code, '; $sSQL .= ' importance, '; - if (!$this->bDeDupe) $sSQL .= 'place_id,'; - if (!$this->bAddressDetails) $sSQL .= 'langaddress, '; + if (!$this->bDeDupe) { + $sSQL .= 'place_id,'; + } + if (!$this->bAddressDetails) { + $sSQL .= 'langaddress, '; + } $sSQL .= ' placename, '; $sSQL .= ' ref, '; - if ($this->bExtraTags) $sSQL .= 'extratags, '; - if ($this->bNameDetails) $sSQL .= 'name, '; + if ($this->bExtraTags) { + $sSQL .= 'extratags, '; + } + if ($this->bNameDetails) { + $sSQL .= 'name, '; + } $sSQL .= ' extra_place '; $aSubSelects[] = $sSQL; @@ -260,8 +285,12 @@ class PlaceLookup $sSQL .= $this->langAddressSql('-1'); $sSQL .= ' postcode as placename,'; $sSQL .= ' postcode as ref,'; - if ($this->bExtraTags) $sSQL .= 'null::text AS extra,'; - if ($this->bNameDetails) $sSQL .= 'null::text AS names,'; + if ($this->bExtraTags) { + $sSQL .= 'null::text AS extra,'; + } + if ($this->bNameDetails) { + $sSQL .= 'null::text AS names,'; + } $sSQL .= ' ST_x(geometry) AS lon, ST_y(geometry) AS lat,'; $sSQL .= ' (0.75-(rank_search::float/40)) AS importance, '; $sSQL .= $this->addressImportanceSql('geometry', 'lp.parent_place_id'); @@ -298,8 +327,12 @@ class PlaceLookup $sSQL .= $this->langAddressSql('housenumber_for_place'); $sSQL .= ' null::text AS placename, '; $sSQL .= ' null::text AS ref, '; - if ($this->bExtraTags) $sSQL .= 'null::text AS extra,'; - if ($this->bNameDetails) $sSQL .= 'null::text AS names,'; + if ($this->bExtraTags) { + $sSQL .= 'null::text AS extra,'; + } + if ($this->bNameDetails) { + $sSQL .= 'null::text AS names,'; + } $sSQL .= ' st_x(centroid) AS lon, '; $sSQL .= ' st_y(centroid) AS lat,'; $sSQL .= ' -1.15 AS importance, '; @@ -344,8 +377,12 @@ class PlaceLookup $sSQL .= $this->langAddressSql('housenumber_for_place'); $sSQL .= ' null::text AS placename, '; $sSQL .= ' null::text AS ref, '; - if ($this->bExtraTags) $sSQL .= 'null::text AS extra, '; - if ($this->bNameDetails) $sSQL .= 'null::text AS names, '; + if ($this->bExtraTags) { + $sSQL .= 'null::text AS extra, '; + } + if ($this->bNameDetails) { + $sSQL .= 'null::text AS names, '; + } $sSQL .= ' st_x(centroid) AS lon, '; $sSQL .= ' st_y(centroid) AS lat, '; // slightly smaller than the importance for normal houses @@ -448,7 +485,9 @@ class PlaceLookup { $aOutlineResult = array(); - if (!$iPlaceID) return $aOutlineResult; + if (!$iPlaceID) { + return $aOutlineResult; + } // Get the bounding box and outline polygon $sSQL = 'select place_id,0 as numfeatures,st_area(geometry) as area,'; @@ -460,10 +499,18 @@ class PlaceLookup } $sSQL .= ' ST_YMin(geometry) as minlat,ST_YMax(geometry) as maxlat,'; $sSQL .= ' ST_XMin(geometry) as minlon,ST_XMax(geometry) as maxlon'; - if ($this->bIncludePolygonAsGeoJSON) $sSQL .= ',ST_AsGeoJSON(geometry) as asgeojson'; - if ($this->bIncludePolygonAsKML) $sSQL .= ',ST_AsKML(geometry) as askml'; - if ($this->bIncludePolygonAsSVG) $sSQL .= ',ST_AsSVG(geometry) as assvg'; - if ($this->bIncludePolygonAsText) $sSQL .= ',ST_AsText(geometry) as astext'; + if ($this->bIncludePolygonAsGeoJSON) { + $sSQL .= ',ST_AsGeoJSON(geometry) as asgeojson'; + } + if ($this->bIncludePolygonAsKML) { + $sSQL .= ',ST_AsKML(geometry) as askml'; + } + if ($this->bIncludePolygonAsSVG) { + $sSQL .= ',ST_AsSVG(geometry) as assvg'; + } + if ($this->bIncludePolygonAsText) { + $sSQL .= ',ST_AsText(geometry) as astext'; + } if ($fLonReverse != null && $fLatReverse != null) { $sFrom = ' from (SELECT * , CASE WHEN (class = \'highway\') AND (ST_GeometryType(geometry) = \'ST_LineString\') THEN '; $sFrom .=' ST_ClosestPoint(geometry, ST_SetSRID(ST_Point('.$fLatReverse.','.$fLonReverse.'),4326))'; @@ -486,10 +533,18 @@ class PlaceLookup $aOutlineResult['lon'] = $aPointPolygon['centrelon']; } - if ($this->bIncludePolygonAsGeoJSON) $aOutlineResult['asgeojson'] = $aPointPolygon['asgeojson']; - if ($this->bIncludePolygonAsKML) $aOutlineResult['askml'] = $aPointPolygon['askml']; - if ($this->bIncludePolygonAsSVG) $aOutlineResult['assvg'] = $aPointPolygon['assvg']; - if ($this->bIncludePolygonAsText) $aOutlineResult['astext'] = $aPointPolygon['astext']; + if ($this->bIncludePolygonAsGeoJSON) { + $aOutlineResult['asgeojson'] = $aPointPolygon['asgeojson']; + } + if ($this->bIncludePolygonAsKML) { + $aOutlineResult['askml'] = $aPointPolygon['askml']; + } + if ($this->bIncludePolygonAsSVG) { + $aOutlineResult['assvg'] = $aPointPolygon['assvg']; + } + if ($this->bIncludePolygonAsText) { + $aOutlineResult['astext'] = $aPointPolygon['astext']; + } if (abs($aPointPolygon['minlat'] - $aPointPolygon['maxlat']) < 0.0000001) { $aPointPolygon['minlat'] = $aPointPolygon['minlat'] - $fRadius; diff --git a/lib-php/ReverseGeocode.php b/lib-php/ReverseGeocode.php index cf396b7a..47e931ef 100644 --- a/lib-php/ReverseGeocode.php +++ b/lib-php/ReverseGeocode.php @@ -74,8 +74,6 @@ class ReverseGeocode protected function lookupLargeArea($sPointSQL, $iMaxRank) { - $oResult = null; - if ($iMaxRank > 4) { $aPlace = $this->lookupPolygon($sPointSQL, $iMaxRank); if ($aPlace) { @@ -167,9 +165,13 @@ class ReverseGeocode { Debug::newFunction('lookupPolygon'); // polygon search begins at suburb-level - if ($iMaxRank > 25) $iMaxRank = 25; + if ($iMaxRank > 25) { + $iMaxRank = 25; + } // no polygon search over country-level - if ($iMaxRank < 5) $iMaxRank = 5; + if ($iMaxRank < 5) { + $iMaxRank = 5; + } // search for polygon $sSQL = 'SELECT place_id, parent_place_id, rank_address, rank_search FROM'; $sSQL .= '(select place_id, parent_place_id, rank_address, rank_search, country_code, geometry'; @@ -190,7 +192,6 @@ class ReverseGeocode if ($aPoly) { // if a polygon is found, search for placenodes begins ... - $iParentPlaceID = $aPoly['parent_place_id']; $iRankAddress = $aPoly['rank_address']; $iRankSearch = $aPoly['rank_search']; $iPlaceID = $aPoly['place_id']; @@ -242,26 +243,24 @@ class ReverseGeocode public function lookupPoint($sPointSQL, $bDoInterpolation = true) { Debug::newFunction('lookupPoint'); - // starts if the search is on POI or street level, - // searches for the nearest POI or street, - // if a street is found and a POI is searched for, - // the nearest POI which the found street is a parent of is choosen. - $iMaxRank = $this->iMaxRank; - // Find the nearest point $fSearchDiam = 0.006; $oResult = null; $aPlace = null; // for POI or street level - if ($iMaxRank >= 26) { + if ($this->iMaxRank >= 26) { + // starts if the search is on POI or street level, + // searches for the nearest POI or street, + // if a street is found and a POI is searched for, + // the nearest POI which the found street is a parent of is choosen. $sSQL = 'select place_id,parent_place_id,rank_address,country_code,'; $sSQL .= ' ST_distance('.$sPointSQL.', geometry) as distance'; $sSQL .= ' FROM '; $sSQL .= ' placex'; $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')'; $sSQL .= ' AND'; - $sSQL .= ' rank_address between 26 and '.$iMaxRank; + $sSQL .= ' rank_address between 26 and '.$this->iMaxRank; $sSQL .= ' and (name is not null or housenumber is not null'; $sSQL .= ' or rank_address between 26 and 27)'; $sSQL .= ' and (rank_address between 26 and 27'; @@ -284,7 +283,7 @@ class ReverseGeocode if ($aPlace) { // if street and maxrank > streetlevel - if ($iRankAddress <= 27 && $iMaxRank > 27) { + if ($iRankAddress <= 27 && $this->iMaxRank > 27) { // find the closest object (up to a certain radius) of which the street is a parent of $sSQL = ' select place_id,'; $sSQL .= ' ST_distance('.$sPointSQL.', geometry) as distance'; @@ -338,7 +337,7 @@ class ReverseGeocode } } - if ($bDoInterpolation && $iMaxRank >= 30) { + if ($bDoInterpolation && $this->iMaxRank >= 30) { $fDistance = $fSearchDiam; if ($aPlace) { // We can't reliably go from the closest street to an @@ -356,7 +355,6 @@ class ReverseGeocode $oResult = new Result($aHouse['place_id'], Result::TABLE_OSMLINE); $oResult->iHouseNumber = closestHouseNumber($aHouse); $aPlace = $aHouse; - $iRankAddress = 30; } } @@ -366,7 +364,7 @@ class ReverseGeocode } } else { // lower than street level ($iMaxRank < 26 ) - $oResult = $this->lookupLargeArea($sPointSQL, $iMaxRank); + $oResult = $this->lookupLargeArea($sPointSQL, $this->iMaxRank); } Debug::printVar('Final result', $oResult); diff --git a/lib-php/SearchDescription.php b/lib-php/SearchDescription.php index 3c572f2f..6091fd61 100644 --- a/lib-php/SearchDescription.php +++ b/lib-php/SearchDescription.php @@ -415,7 +415,6 @@ class SearchDescription public function query(&$oDB, $iMinRank, $iMaxRank, $iLimit) { $aResults = array(); - $iHousenumber = -1; if ($this->sCountryCode && empty($this->aName) diff --git a/lib-php/Shell.php b/lib-php/Shell.php index b43db135..4bec20e9 100644 --- a/lib-php/Shell.php +++ b/lib-php/Shell.php @@ -33,7 +33,9 @@ class Shell public function addEnvPair($sKey, $sVal) { if (isset($sKey) && $sKey && isset($sVal)) { - if (!isset($this->aEnv)) $this->aEnv = $_ENV; + if (!isset($this->aEnv)) { + $this->aEnv = $_ENV; + } $this->aEnv = array_merge($this->aEnv, array($sKey => $sVal), $_ENV); } return $this; @@ -75,11 +77,8 @@ class Shell return $iStat; } - - private function escapeParam($sParam) { - if (preg_match('/^-*\w+$/', $sParam)) return $sParam; - return escapeshellarg($sParam); + return (preg_match('/^-*\w+$/', $sParam)) ? $sParam : escapeshellarg($sParam); } } diff --git a/lib-php/admin/export.php b/lib-php/admin/export.php index b038cf2a..9f205de7 100644 --- a/lib-php/admin/export.php +++ b/lib-php/admin/export.php @@ -49,7 +49,9 @@ $oDB->connect(); if (isset($aCMDResult['output-type'])) { - if (!isset($aRankmap[$aCMDResult['output-type']])) fail('unknown output-type: '.$aCMDResult['output-type']); + if (!isset($aRankmap[$aCMDResult['output-type']])) { + fail('unknown output-type: '.$aCMDResult['output-type']); + } $iOutputRank = $aRankmap[$aCMDResult['output-type']]; } else { $iOutputRank = $aRankmap['street']; @@ -58,14 +60,18 @@ // Preferred language $oParams = new Nominatim\ParameterParser(); - if (!isset($aCMDResult['language'])) $aCMDResult['language'] = 'xx'; + if (!isset($aCMDResult['language'])) { + $aCMDResult['language'] = 'xx'; + } $aLangPrefOrder = $oParams->getPreferredLanguages($aCMDResult['language']); $sLanguagePrefArraySQL = $oDB->getArraySQL($oDB->getDBQuotedList($aLangPrefOrder)); // output formatting: build up a lookup table that maps address ranks to columns $aColumnMapping = array(); $iNumCol = 0; - if (!isset($aCMDResult['output-format'])) $aCMDResult['output-format'] = 'street;suburb;city;county;state;country'; + if (!isset($aCMDResult['output-format'])) { + $aCMDResult['output-format'] = 'street;suburb;city;county;state;country'; + } foreach (preg_split('/\s*;\s*/', $aCMDResult['output-format']) as $sColumn) { $bHasData = false; foreach (preg_split('/\s*,\s*/', $sColumn) as $sRank) { @@ -80,7 +86,9 @@ } } } - if ($bHasData) $iNumCol++; + if ($bHasData) { + $iNumCol++; + } } // build the query for objects @@ -122,7 +130,9 @@ if ($sOsmType) { $sSQL = 'select place_id from placex where osm_type = :osm_type and osm_id = :osm_id'; $sParentId = $oDB->getOne($sSQL, array('osm_type' => $sOsmType, 'osm_id' => $sOsmId)); - if (!$sParentId) fail('Could not find place '.$sOsmType.' '.$sOsmId); + if (!$sParentId) { + fail('Could not find place '.$sOsmType.' '.$sOsmId); + } } if ($sParentId) { $sPlacexSQL .= ' and place_id in (select place_id from place_addressline where address_place_id = '.$sParentId.' and isaddress)'; @@ -136,7 +146,6 @@ $oResults = $oDB->getQueryStatement($sPlacexSQL); $fOutstream = fopen('php://output', 'w'); while ($aRow = $oResults->fetch()) { - //var_dump($aRow); $iPlaceID = $aRow['place_id']; $sSQL = "select rank_address,get_name_by_language(name,$sLanguagePrefArraySQL) as localname from get_addressdata(:place_id, -1)"; $sSQL .= ' WHERE isaddress'; diff --git a/lib-php/admin/update.php b/lib-php/admin/update.php index ea58f37c..3075070a 100644 --- a/lib-php/admin/update.php +++ b/lib-php/admin/update.php @@ -40,7 +40,9 @@ $oDB->connect(); $fPostgresVersion = $oDB->getPostgresVersion(); $aDSNInfo = Nominatim\DB::parseDSN(getSetting('DATABASE_DSN')); -if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432; +if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) { + $aDSNInfo['port'] = 5432; +} // cache memory to be used by osm2pgsql, should not be more than the available memory $iCacheMemory = (isset($aResult['osm2pgsql-cache'])?$aResult['osm2pgsql-cache']:2000); diff --git a/lib-php/admin/warm.php b/lib-php/admin/warm.php index d6aa3d9b..39a37506 100644 --- a/lib-php/admin/warm.php +++ b/lib-php/admin/warm.php @@ -62,11 +62,15 @@ if (!$aResult['search-only']) { $oPlaceLookup->setLanguagePreference(array('en')); echo 'Warm reverse: '; - if ($bVerbose) echo "\n"; + if ($bVerbose) { + echo "\n"; + } for ($i = 0; $i < 1000; $i++) { $fLat = rand(-9000, 9000) / 100; $fLon = rand(-18000, 18000) / 100; - if ($bVerbose) echo "$fLat, $fLon = "; + if ($bVerbose) { + echo "$fLat, $fLon = "; + } $oLookup = $oReverseGeocode->lookup($fLat, $fLon); $aSearchResults = $oLookup ? $oPlaceLookup->lookup(array($oLookup->iId => $oLookup)) : null; @@ -79,10 +83,14 @@ if (!$aResult['reverse-only']) { $oGeocode = new Nominatim\Geocode($oDB); echo 'Warm search: '; - if ($bVerbose) echo "\n"; + if ($bVerbose) { + echo "\n"; + } $sSQL = 'SELECT word FROM word WHERE word is not null ORDER BY search_name_count DESC LIMIT 1000'; foreach ($oDB->getCol($sSQL) as $sWord) { - if ($bVerbose) echo "$sWord = "; + if ($bVerbose) { + echo "$sWord = "; + } $oGeocode->setLanguagePreference(array('en')); $oGeocode->setQuery($sWord); diff --git a/lib-php/cmd.php b/lib-php/cmd.php index 9c971e5f..a52e8fce 100644 --- a/lib-php/cmd.php +++ b/lib-php/cmd.php @@ -9,8 +9,12 @@ function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnkn foreach ($aSpec as $aLine) { if (is_array($aLine)) { - if ($aLine[0]) $aQuick['--'.$aLine[0]] = $aLine; - if ($aLine[1]) $aQuick['-'.$aLine[1]] = $aLine; + if ($aLine[0]) { + $aQuick['--'.$aLine[0]] = $aLine; + } + if ($aLine[1]) { + $aQuick['-'.$aLine[1]] = $aLine; + } $aCounts[$aLine[0]] = 0; } } @@ -28,7 +32,9 @@ function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnkn $xVal = array(); for ($n = $aLine[4]; $i < $iSize && $n; $n--) { $i++; - if ($i >= $iSize || $aArg[$i][0] == '-') showUsage($aSpec, $bExitOnError, 'Parameter of \''.$aLine[0].'\' is missing'); + if ($i >= $iSize || $aArg[$i][0] == '-') { + showUsage($aSpec, $bExitOnError, 'Parameter of \''.$aLine[0].'\' is missing'); + } switch ($aLine[6]) { case 'realpath': @@ -56,7 +62,9 @@ function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnkn break; } } - if ($aLine[4] == 1) $xVal = $xVal[0]; + if ($aLine[4] == 1) { + $xVal = $xVal[0]; + } } else { $xVal = true; } @@ -65,7 +73,9 @@ function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnkn } if ($aLine[3] > 1) { - if (!array_key_exists($aLine[0], $aResult)) $aResult[$aLine[0]] = array(); + if (!array_key_exists($aLine[0], $aResult)) { + $aResult[$aLine[0]] = array(); + } $aResult[$aLine[0]][] = $xVal; } else { $aResult[$aLine[0]] = $xVal; @@ -75,18 +85,23 @@ function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnkn } } - if (array_key_exists('help', $aResult)) showUsage($aSpec); - if ($bUnknown && $bExitOnUnknown) showUsage($aSpec, $bExitOnError, 'Unknown option \''.$bUnknown.'\''); + if (array_key_exists('help', $aResult)) { + showUsage($aSpec); + } + if ($bUnknown && $bExitOnUnknown) { + showUsage($aSpec, $bExitOnError, 'Unknown option \''.$bUnknown.'\''); + } foreach ($aSpec as $aLine) { if (is_array($aLine)) { - if ($aCounts[$aLine[0]] < $aLine[2]) showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is missing'); - if ($aCounts[$aLine[0]] > $aLine[3]) showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is pressent too many times'); - switch ($aLine[6]) { - case 'bool': - if (!array_key_exists($aLine[0], $aResult)) - $aResult[$aLine[0]] = false; - break; + if ($aCounts[$aLine[0]] < $aLine[2]) { + showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is missing'); + } + if ($aCounts[$aLine[0]] > $aLine[3]) { + showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is pressent too many times'); + } + if ($aLine[6] == 'bool' && !array_key_exists($aLine[0], $aResult)) { + $aResult[$aLine[0]] = false; } } } @@ -109,8 +124,12 @@ function showUsage($aSpec, $bExit = false, $sError = false) echo "\n"; } $aNames = array(); - if ($aLine[1]) $aNames[] = '-'.$aLine[1]; - if ($aLine[0]) $aNames[] = '--'.$aLine[0]; + if ($aLine[1]) { + $aNames[] = '-'.$aLine[1]; + } + if ($aLine[0]) { + $aNames[] = '--'.$aLine[0]; + } $sName = join(', ', $aNames); echo ' '.$sName.str_repeat(' ', 30-strlen($sName)).$aLine[7]."\n"; } else { diff --git a/lib-php/init-website.php b/lib-php/init-website.php index f2d52980..d6cc8a24 100644 --- a/lib-php/init-website.php +++ b/lib-php/init-website.php @@ -81,6 +81,10 @@ if (CONST_NoAccessControl) { header('Access-Control-Allow-Headers: '.$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']); } } -if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'OPTIONS') exit; +if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'OPTIONS') { + exit; +} -if (CONST_Debug) header('Content-type: text/html; charset=utf-8'); +if (CONST_Debug) { + header('Content-type: text/html; charset=utf-8'); +} diff --git a/lib-php/lib.php b/lib-php/lib.php index 8d82c5b3..d95ad4ee 100644 --- a/lib-php/lib.php +++ b/lib-php/lib.php @@ -6,10 +6,7 @@ function loadSettings($sProjectDir) // Temporary hack to set the direcory via environment instead of // the installed scripts. Neither setting is part of the official // set of settings. - defined('CONST_DataDir') or define('CONST_DataDir', $_SERVER['NOMINATIM_DATADIR']); - defined('CONST_SqlDir') or define('CONST_SqlDir', $_SERVER['NOMINATIM_SQLDIR']); defined('CONST_ConfigDir') or define('CONST_ConfigDir', $_SERVER['NOMINATIM_CONFIGDIR']); - defined('CONST_Default_ModulePath') or define('CONST_Default_ModulePath', $_SERVER['NOMINATIM_DATABASE_MODULE_SRC_PATH']); } function getSetting($sConfName, $sDefault = null) @@ -32,22 +29,14 @@ function getSettingBool($sConfName) || strcmp($sVal, '1') == 0; } -function getSettingConfig($sConfName, $sSystemConfig) -{ - $sValue = $_SERVER['NOMINATIM_'.$sConfName]; - - if (!$sValue) { - return CONST_ConfigDir.'/'.$sSystemConfig; - } - - return $sValue; -} - function fail($sError, $sUserError = false) { - if (!$sUserError) $sUserError = $sError; + if (!$sUserError) { + $sUserError = $sError; + } error_log('ERROR: '.$sError); - var_dump($sUserError)."\n"; + var_dump($sUserError); + echo "\n"; exit(-1); } @@ -95,8 +84,9 @@ function getDatabaseDate(&$oDB) function byImportance($a, $b) { - if ($a['importance'] != $b['importance']) + if ($a['importance'] != $b['importance']) { return ($a['importance'] > $b['importance']?-1:1); + } return $a['foundorder'] <=> $b['foundorder']; } @@ -231,6 +221,8 @@ function closestHouseNumber($aRow) if (!function_exists('array_key_last')) { function array_key_last(array $array) { - if (!empty($array)) return key(array_slice($array, -1, 1, true)); + if (!empty($array)) { + return key(array_slice($array, -1, 1, true)); + } } } diff --git a/lib-php/log.php b/lib-php/log.php index 25ed75cb..d7e14932 100644 --- a/lib-php/log.php +++ b/lib-php/log.php @@ -5,15 +5,23 @@ function logStart(&$oDB, $sType = '', $sQuery = '', $aLanguageList = array()) { $fStartTime = microtime(true); $aStartTime = explode('.', $fStartTime); - if (!isset($aStartTime[1])) $aStartTime[1] = '0'; + if (!isset($aStartTime[1])) { + $aStartTime[1] = '0'; + } $sOutputFormat = ''; - if (isset($_GET['format'])) $sOutputFormat = $_GET['format']; + if (isset($_GET['format'])) { + $sOutputFormat = $_GET['format']; + } if ($sType == 'reverse') { $sOutQuery = (isset($_GET['lat'])?$_GET['lat']:'').'/'; - if (isset($_GET['lon'])) $sOutQuery .= $_GET['lon']; - if (isset($_GET['zoom'])) $sOutQuery .= '/'.$_GET['zoom']; + if (isset($_GET['lon'])) { + $sOutQuery .= $_GET['lon']; + } + if (isset($_GET['zoom'])) { + $sOutQuery .= '/'.$_GET['zoom']; + } } else { $sOutQuery = $sQuery; } @@ -28,13 +36,15 @@ function logStart(&$oDB, $sType = '', $sQuery = '', $aLanguageList = array()) ); if (CONST_Log_DB) { - if (isset($_GET['email'])) + if (isset($_GET['email'])) { $sUserAgent = $_GET['email']; - elseif (isset($_SERVER['HTTP_REFERER'])) + } elseif (isset($_SERVER['HTTP_REFERER'])) { $sUserAgent = $_SERVER['HTTP_REFERER']; - elseif (isset($_SERVER['HTTP_USER_AGENT'])) + } elseif (isset($_SERVER['HTTP_USER_AGENT'])) { $sUserAgent = $_SERVER['HTTP_USER_AGENT']; - else $sUserAgent = ''; + } else { + $sUserAgent = ''; + } $sSQL = 'insert into new_query_log (type,starttime,query,ipaddress,useragent,language,format,searchterm)'; $sSQL .= ' values ('; $sSQL .= join(',', $oDB->getDBQuotedList(array( @@ -60,7 +70,9 @@ function logEnd(&$oDB, $hLog, $iNumResults) if (CONST_Log_DB) { $aEndTime = explode('.', $fEndTime); - if (!$aEndTime[1]) $aEndTime[1] = '0'; + if (!$aEndTime[1]) { + $aEndTime[1] = '0'; + } $sEndTime = date('Y-m-d H:i:s', $aEndTime[0]).'.'.$aEndTime[1]; $sSQL = 'update new_query_log set endtime = '.$oDB->getDBQuoted($sEndTime).', results = '.$iNumResults; diff --git a/lib-php/migration/PhraseSettingsToJson.php b/lib-php/migration/PhraseSettingsToJson.php index 15c49f0a..ac6e6213 100644 --- a/lib-php/migration/PhraseSettingsToJson.php +++ b/lib-php/migration/PhraseSettingsToJson.php @@ -8,10 +8,12 @@ if (file_exists($phpPhraseSettingsFile) && !file_exists($jsonPhraseSettingsFile) $data = array(); - if (isset($aTagsBlacklist)) + if (isset($aTagsBlacklist)) { $data['blackList'] = $aTagsBlacklist; - if (isset($aTagsWhitelist)) + } + if (isset($aTagsWhitelist)) { $data['whiteList'] = $aTagsWhitelist; + } $jsonFile = fopen($jsonPhraseSettingsFile, 'w'); fwrite($jsonFile, json_encode($data)); diff --git a/lib-php/output.php b/lib-php/output.php index 8de81576..ee1db44c 100644 --- a/lib-php/output.php +++ b/lib-php/output.php @@ -3,14 +3,26 @@ function formatOSMType($sType, $bIncludeExternal = true) { - if ($sType == 'N') return 'node'; - if ($sType == 'W') return 'way'; - if ($sType == 'R') return 'relation'; + if ($sType == 'N') { + return 'node'; + } + if ($sType == 'W') { + return 'way'; + } + if ($sType == 'R') { + return 'relation'; + } - if (!$bIncludeExternal) return ''; + if (!$bIncludeExternal) { + return ''; + } - if ($sType == 'T') return 'way'; - if ($sType == 'I') return 'way'; + if ($sType == 'T') { + return 'way'; + } + if ($sType == 'I') { + return 'way'; + } // not handled: P, L diff --git a/lib-php/template/address-geocodejson.php b/lib-php/template/address-geocodejson.php index 0066e80e..927f3861 100644 --- a/lib-php/template/address-geocodejson.php +++ b/lib-php/template/address-geocodejson.php @@ -5,9 +5,11 @@ $aFilteredPlaces = array(); if (empty($aPlace)) { - if (isset($sError)) + if (isset($sError)) { $aFilteredPlaces['error'] = $sError; - else $aFilteredPlaces['error'] = 'Unable to geocode'; + } else { + $aFilteredPlaces['error'] = 'Unable to geocode'; + } javascript_renderData($aFilteredPlaces); } else { $aFilteredPlaces = array( @@ -17,7 +19,9 @@ if (empty($aPlace)) { ) ); - if (isset($aPlace['place_id'])) $aFilteredPlaces['properties']['geocoding']['place_id'] = $aPlace['place_id']; + if (isset($aPlace['place_id'])) { + $aFilteredPlaces['properties']['geocoding']['place_id'] = $aPlace['place_id']; + } $sOSMType = formatOSMType($aPlace['osm_type']); if ($sOSMType) { $aFilteredPlaces['properties']['geocoding']['osm_type'] = $sOSMType; diff --git a/lib-php/template/address-geojson.php b/lib-php/template/address-geojson.php index 089a86b6..0dd96f21 100644 --- a/lib-php/template/address-geojson.php +++ b/lib-php/template/address-geojson.php @@ -3,9 +3,11 @@ $aFilteredPlaces = array(); if (empty($aPlace)) { - if (isset($sError)) + if (isset($sError)) { $aFilteredPlaces['error'] = $sError; - else $aFilteredPlaces['error'] = 'Unable to geocode'; + } else { + $aFilteredPlaces['error'] = 'Unable to geocode'; + } javascript_renderData($aFilteredPlaces); } else { $aFilteredPlaces = array( @@ -13,7 +15,9 @@ if (empty($aPlace)) { 'properties' => array() ); - if (isset($aPlace['place_id'])) $aFilteredPlaces['properties']['place_id'] = $aPlace['place_id']; + if (isset($aPlace['place_id'])) { + $aFilteredPlaces['properties']['place_id'] = $aPlace['place_id']; + } $sOSMType = formatOSMType($aPlace['osm_type']); if ($sOSMType) { $aFilteredPlaces['properties']['osm_type'] = $sOSMType; @@ -36,8 +40,12 @@ if (empty($aPlace)) { if (isset($aPlace['address'])) { $aFilteredPlaces['properties']['address'] = $aPlace['address']->getAddressNames(); } - if (isset($aPlace['sExtraTags'])) $aFilteredPlaces['properties']['extratags'] = $aPlace['sExtraTags']; - if (isset($aPlace['sNameDetails'])) $aFilteredPlaces['properties']['namedetails'] = $aPlace['sNameDetails']; + if (isset($aPlace['sExtraTags'])) { + $aFilteredPlaces['properties']['extratags'] = $aPlace['sExtraTags']; + } + if (isset($aPlace['sNameDetails'])) { + $aFilteredPlaces['properties']['namedetails'] = $aPlace['sNameDetails']; + } if (isset($aPlace['aBoundingBox'])) { $aFilteredPlaces['bbox'] = array( diff --git a/lib-php/template/address-json.php b/lib-php/template/address-json.php index 691d6a74..513d312e 100644 --- a/lib-php/template/address-json.php +++ b/lib-php/template/address-json.php @@ -3,19 +3,27 @@ $aFilteredPlaces = array(); if (empty($aPlace)) { - if (isset($sError)) + if (isset($sError)) { $aFilteredPlaces['error'] = $sError; - else $aFilteredPlaces['error'] = 'Unable to geocode'; + } else { + $aFilteredPlaces['error'] = 'Unable to geocode'; + } } else { - if (isset($aPlace['place_id'])) $aFilteredPlaces['place_id'] = $aPlace['place_id']; + if (isset($aPlace['place_id'])) { + $aFilteredPlaces['place_id'] = $aPlace['place_id']; + } $aFilteredPlaces['licence'] = 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright'; $sOSMType = formatOSMType($aPlace['osm_type']); if ($sOSMType) { $aFilteredPlaces['osm_type'] = $sOSMType; $aFilteredPlaces['osm_id'] = $aPlace['osm_id']; } - if (isset($aPlace['lat'])) $aFilteredPlaces['lat'] = $aPlace['lat']; - if (isset($aPlace['lon'])) $aFilteredPlaces['lon'] = $aPlace['lon']; + if (isset($aPlace['lat'])) { + $aFilteredPlaces['lat'] = $aPlace['lat']; + } + if (isset($aPlace['lon'])) { + $aFilteredPlaces['lon'] = $aPlace['lon']; + } if ($sOutputFormat == 'jsonv2' || $sOutputFormat == 'geojson') { $aFilteredPlaces['place_rank'] = $aPlace['rank_search']; @@ -35,8 +43,12 @@ if (empty($aPlace)) { if (isset($aPlace['address'])) { $aFilteredPlaces['address'] = $aPlace['address']->getAddressNames(); } - if (isset($aPlace['sExtraTags'])) $aFilteredPlaces['extratags'] = $aPlace['sExtraTags']; - if (isset($aPlace['sNameDetails'])) $aFilteredPlaces['namedetails'] = $aPlace['sNameDetails']; + if (isset($aPlace['sExtraTags'])) { + $aFilteredPlaces['extratags'] = $aPlace['sExtraTags']; + } + if (isset($aPlace['sNameDetails'])) { + $aFilteredPlaces['namedetails'] = $aPlace['sNameDetails']; + } if (isset($aPlace['aBoundingBox'])) { $aFilteredPlaces['boundingbox'] = $aPlace['aBoundingBox']; diff --git a/lib-php/template/address-xml.php b/lib-php/template/address-xml.php index ab0bc72c..cf045ab9 100644 --- a/lib-php/template/address-xml.php +++ b/lib-php/template/address-xml.php @@ -12,17 +12,29 @@ echo " querystring='".htmlspecialchars($_SERVER['QUERY_STRING'], ENT_QUOTES)."'" echo ">\n"; if (empty($aPlace)) { - if (isset($sError)) + if (isset($sError)) { echo "$sError"; - else echo 'Unable to geocode'; + } else { + echo 'Unable to geocode'; + } } else { echo ' $sPhrase) { + foreach ($aNormPhrases as $sPhrase) { if (strlen($sPhrase) > 0) { $aWords = explode(' ', $sPhrase); Tokenizer::addTokens($aTokens, $aWords); diff --git a/lib-php/website/details.php b/lib-php/website/details.php index 55a088d1..c16725e2 100644 --- a/lib-php/website/details.php +++ b/lib-php/website/details.php @@ -95,16 +95,22 @@ $iPlaceID = (int)$sPlaceId; if (CONST_Use_US_Tiger_Data) { $iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_tiger WHERE place_id = '.$iPlaceID); - if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; + if ($iParentPlaceID) { + $iPlaceID = $iParentPlaceID; + } } // interpolated house numbers $iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_osmline WHERE place_id = '.$iPlaceID); -if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; +if ($iParentPlaceID) { + $iPlaceID = $iParentPlaceID; +} // artificial postcodes $iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_postcode WHERE place_id = '.$iPlaceID); -if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; +if ($iParentPlaceID) { + $iPlaceID = $iParentPlaceID; +} $hLog = logStart($oDB, 'details', $_SERVER['QUERY_STRING'], $aLangPrefOrder); diff --git a/lib-php/website/lookup.php b/lib-php/website/lookup.php index 737edc62..eb3705fc 100644 --- a/lib-php/website/lookup.php +++ b/lib-php/website/lookup.php @@ -35,8 +35,10 @@ if (count($aOsmIds) > CONST_Places_Max_ID_count) { foreach ($aOsmIds as $sItem) { // Skip empty sItem - if (empty($sItem)) continue; - + if (empty($sItem)) { + continue; + } + $sType = $sItem[0]; $iId = (int) substr($sItem, 1); if ($iId > 0 && ($sType == 'N' || $sType == 'W' || $sType == 'R')) { @@ -48,7 +50,9 @@ foreach ($aOsmIds as $sItem) { // key names $oResult = $oPlace; unset($oResult['aAddress']); - if (isset($oPlace['aAddress'])) $oResult['address'] = $oPlace['aAddress']; + if (isset($oPlace['aAddress'])) { + $oResult['address'] = $oPlace['aAddress']; + } if ($sOutputFormat != 'geocodejson') { unset($oResult['langaddress']); $oResult['name'] = $oPlace['langaddress']; @@ -71,7 +75,9 @@ foreach ($aOsmIds as $sItem) { } -if (CONST_Debug) exit; +if (CONST_Debug) { + exit; +} $sXmlRootTag = 'lookupresults'; $sQuery = join(',', $aCleanedQueryParts); diff --git a/lib-php/website/polygons.php b/lib-php/website/polygons.php index 88b48ae8..c1382dbf 100644 --- a/lib-php/website/polygons.php +++ b/lib-php/website/polygons.php @@ -30,8 +30,12 @@ while ($iTotalBroken && empty($aPolygons)) { $iDays++; } - if ($bReduced) $aWhere[] = "errormessage like 'Area reduced%'"; - if ($sClass) $sWhere[] = "class = '".pg_escape_string($sClass)."'"; + if ($bReduced) { + $aWhere[] = "errormessage like 'Area reduced%'"; + } + if ($sClass) { + $sWhere[] = "class = '".pg_escape_string($sClass)."'"; + } if (!empty($aWhere)) { $sSQL .= ' WHERE '.join(' and ', $aWhere); diff --git a/lib-php/website/search.php b/lib-php/website/search.php index 6b271f0b..b3a0fe83 100644 --- a/lib-php/website/search.php +++ b/lib-php/website/search.php @@ -77,7 +77,9 @@ if (isset($_SERVER['REQUEST_SCHEME']) $sMoreURL = '/search.php?'.http_build_query($aMoreParams); } -if (CONST_Debug) exit; +if (CONST_Debug) { + exit; +} $sOutputTemplate = ($sOutputFormat == 'jsonv2') ? 'json' : $sOutputFormat; include(CONST_LibDir.'/template/search-'.$sOutputTemplate.'.php'); diff --git a/nominatim/db/async_connection.py b/nominatim/db/async_connection.py index db4b89ce..f06f3159 100644 --- a/nominatim/db/async_connection.py +++ b/nominatim/db/async_connection.py @@ -33,18 +33,17 @@ class DeadlockHandler: self.ignore_sql_errors = ignore_sql_errors def __enter__(self): - pass + return self def __exit__(self, exc_type, exc_value, traceback): if __has_psycopg2_errors__: if exc_type == psycopg2.errors.DeadlockDetected: # pylint: disable=E1101 self.handler() return True - else: - if exc_type == psycopg2.extensions.TransactionRollbackError: - if exc_value.pgcode == '40P01': - self.handler() - return True + elif exc_type == psycopg2.extensions.TransactionRollbackError \ + and exc_value.pgcode == '40P01': + self.handler() + return True if self.ignore_sql_errors and isinstance(exc_value, psycopg2.Error): LOG.info("SQL error ignored: %s", exc_value) @@ -191,10 +190,7 @@ class WorkerPool: yield thread if command_stat > self.REOPEN_CONNECTIONS_AFTER: - for thread in self.threads: - while not thread.is_done(): - thread.wait() - thread.connect() + self._reconnect_threads() ready = self.threads command_stat = 0 else: @@ -203,6 +199,13 @@ class WorkerPool: self.wait_time += time.time() - tstart + def _reconnect_threads(self): + for thread in self.threads: + while not thread.is_done(): + thread.wait() + thread.connect() + + def __enter__(self): return self diff --git a/nominatim/indexer/indexer.py b/nominatim/indexer/indexer.py index 5ab0eac3..76883500 100644 --- a/nominatim/indexer/indexer.py +++ b/nominatim/indexer/indexer.py @@ -92,7 +92,7 @@ class Indexer: def index_full(self, analyse=True): - """ Index the complete database. This will first index boudnaries + """ Index the complete database. This will first index boundaries followed by all other objects. When `analyse` is True, then the database will be analysed at the appropriate places to ensure that database statistics are updated. @@ -100,13 +100,10 @@ class Indexer: with connect(self.dsn) as conn: conn.autocommit = True - if analyse: - def _analyze(): + def _analyze(): + if analyse: with conn.cursor() as cur: cur.execute('ANALYZE') - else: - def _analyze(): - pass self.index_by_rank(0, 4) _analyze() diff --git a/nominatim/tokenizer/icu_name_processor.py b/nominatim/tokenizer/icu_name_processor.py index 28719df1..93d2b0ff 100644 --- a/nominatim/tokenizer/icu_name_processor.py +++ b/nominatim/tokenizer/icu_name_processor.py @@ -119,18 +119,22 @@ class ICUNameProcessor: pos += 1 force_space = False - results = set() - + # No variants detected? Fast return. if startpos == 0: trans_name = self.to_ascii.transliterate(norm_name).strip() + return [trans_name] if trans_name else [] + + return self._compute_result_set(partials, baseform[startpos:]) + + + def _compute_result_set(self, partials, prefix): + results = set() + + for variant in partials: + vname = variant + prefix + trans_name = self.to_ascii.transliterate(vname[1:-1]).strip() if trans_name: results.add(trans_name) - else: - for variant in partials: - name = variant + baseform[startpos:] - trans_name = self.to_ascii.transliterate(name[1:-1]).strip() - if trans_name: - results.add(trans_name) return list(results) diff --git a/nominatim/tokenizer/legacy_icu_tokenizer.py b/nominatim/tokenizer/legacy_icu_tokenizer.py index c585c5af..12ee0404 100644 --- a/nominatim/tokenizer/legacy_icu_tokenizer.py +++ b/nominatim/tokenizer/legacy_icu_tokenizer.py @@ -411,33 +411,36 @@ class LegacyICUNameAnalyzer: self.add_country_names(country_feature.lower(), names) address = place.get('address') - if address: - hnrs = [] - addr_terms = [] - for key, value in address.items(): - if key == 'postcode': - self._add_postcode(value) - elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'): - hnrs.append(value) - elif key == 'street': - token_info.add_street(*self._compute_name_tokens({'name': value})) - elif key == 'place': - token_info.add_place(*self._compute_name_tokens({'name': value})) - elif not key.startswith('_') and \ - key not in ('country', 'full'): - addr_terms.append((key, *self._compute_name_tokens({'name': value}))) - - if hnrs: - hnrs = self._split_housenumbers(hnrs) - token_info.add_housenumbers(self.conn, [self._make_standard_hnr(n) for n in hnrs]) - - if addr_terms: - token_info.add_address_terms(addr_terms) + self._process_place_address(token_info, address) return token_info.data + def _process_place_address(self, token_info, address): + hnrs = [] + addr_terms = [] + for key, value in address.items(): + if key == 'postcode': + self._add_postcode(value) + elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'): + hnrs.append(value) + elif key == 'street': + token_info.add_street(*self._compute_name_tokens({'name': value})) + elif key == 'place': + token_info.add_place(*self._compute_name_tokens({'name': value})) + elif not key.startswith('_') and \ + key not in ('country', 'full'): + addr_terms.append((key, *self._compute_name_tokens({'name': value}))) + + if hnrs: + hnrs = self._split_housenumbers(hnrs) + token_info.add_housenumbers(self.conn, [self._make_standard_hnr(n) for n in hnrs]) + + if addr_terms: + token_info.add_address_terms(addr_terms) + + def _compute_name_tokens(self, names): """ Computes the full name and partial name tokens for the given dictionary of names. diff --git a/nominatim/tokenizer/legacy_tokenizer.py b/nominatim/tokenizer/legacy_tokenizer.py index 6040f88f..24af1c3a 100644 --- a/nominatim/tokenizer/legacy_tokenizer.py +++ b/nominatim/tokenizer/legacy_tokenizer.py @@ -424,37 +424,37 @@ class LegacyNameAnalyzer: self.add_country_names(country_feature.lower(), names) address = place.get('address') - if address: - hnrs = [] - addr_terms = [] - for key, value in address.items(): - if key == 'postcode': - self._add_postcode(value) - elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'): - hnrs.append(value) - elif key == 'street': - token_info.add_street(self.conn, value) - elif key == 'place': - token_info.add_place(self.conn, value) - elif not key.startswith('_') and \ - key not in ('country', 'full'): - addr_terms.append((key, value)) - - if hnrs: - token_info.add_housenumbers(self.conn, hnrs) - - if addr_terms: - token_info.add_address_terms(self.conn, addr_terms) + self._process_place_address(token_info, address) return token_info.data - def _add_postcode(self, postcode): - """ Make sure the normalized postcode is present in the word table. - """ - if re.search(r'[:,;]', postcode) is None: - self._cache.add_postcode(self.conn, self.normalize_postcode(postcode)) + def _process_place_address(self, token_info, address): + hnrs = [] + addr_terms = [] + + for key, value in address.items(): + if key == 'postcode': + # Make sure the normalized postcode is present in the word table. + if re.search(r'[:,;]', value) is None: + self._cache.add_postcode(self.conn, + self.normalize_postcode(value)) + elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'): + hnrs.append(value) + elif key == 'street': + token_info.add_street(self.conn, value) + elif key == 'place': + token_info.add_place(self.conn, value) + elif not key.startswith('_') and key not in ('country', 'full'): + addr_terms.append((key, value)) + + if hnrs: + token_info.add_housenumbers(self.conn, hnrs) + + if addr_terms: + token_info.add_address_terms(self.conn, addr_terms) + class _TokenInfo: diff --git a/nominatim/tools/database_import.py b/nominatim/tools/database_import.py index efbf2ec8..df82f9aa 100644 --- a/nominatim/tools/database_import.py +++ b/nominatim/tools/database_import.py @@ -130,9 +130,8 @@ def import_osm_data(osm_file, options, drop=False, ignore_errors=False): if drop: conn.drop_table('planet_osm_nodes') - if drop: - if options['flatnode_file']: - Path(options['flatnode_file']).unlink() + if drop and options['flatnode_file']: + Path(options['flatnode_file']).unlink() def create_tables(conn, config, reverse_only=False): diff --git a/nominatim/tools/refresh.py b/nominatim/tools/refresh.py index 25a97127..97e2e037 100644 --- a/nominatim/tools/refresh.py +++ b/nominatim/tools/refresh.py @@ -155,6 +155,20 @@ def recompute_importance(conn): conn.commit() +def _quote_php_variable(var_type, config, conf_name): + if var_type == bool: + return 'true' if config.get_bool(conf_name) else 'false' + + if var_type == int: + return getattr(config, conf_name) + + if not getattr(config, conf_name): + return 'false' + + quoted = getattr(config, conf_name).replace("'", "\\'") + return f"'{quoted}'" + + def setup_website(basedir, config, conn): """ Create the website script stubs. """ @@ -174,18 +188,11 @@ def setup_website(basedir, config, conn): config.project_dir / 'tokenizer')) for php_name, conf_name, var_type in PHP_CONST_DEFS: - if var_type == bool: - varout = 'true' if config.get_bool(conf_name) else 'false' - elif var_type == int: - varout = getattr(config, conf_name) - elif not getattr(config, conf_name): - varout = 'false' - else: - varout = "'{}'".format(getattr(config, conf_name).replace("'", "\\'")) + varout = _quote_php_variable(var_type, config, conf_name) - template += "@define('CONST_{}', {});\n".format(php_name, varout) + template += f"@define('CONST_{php_name}', {varout});\n" - template += "\nrequire_once('{}/website/{{}}');\n".format(config.lib_dir.php) + template += f"\nrequire_once('{config.lib_dir.php}/website/{{}}');\n" search_name_table_exists = bool(conn and conn.table_exists('search_name')) diff --git a/nominatim/tools/special_phrases/sp_importer.py b/nominatim/tools/special_phrases/sp_importer.py index 48764518..681990fa 100644 --- a/nominatim/tools/special_phrases/sp_importer.py +++ b/nominatim/tools/special_phrases/sp_importer.py @@ -20,6 +20,12 @@ from nominatim.errors import UsageError from nominatim.tools.special_phrases.importer_statistics import SpecialPhrasesImporterStatistics LOG = logging.getLogger() + +def _classtype_table(phrase_class, phrase_type): + """ Return the name of the table for the given class and type. + """ + return f'place_classtype_{phrase_class}_{phrase_type}' + class SPImporter(): # pylint: disable-msg=too-many-instance-attributes """ @@ -164,7 +170,7 @@ class SPImporter(): phrase_class = pair[0] phrase_type = pair[1] - table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type) + table_name = _classtype_table(phrase_class, phrase_type) if table_name in self.table_phrases_to_delete: self.statistics_handler.notify_one_table_ignored() @@ -193,7 +199,7 @@ class SPImporter(): """ Create table place_classtype of the given phrase_class/phrase_type if doesn't exit. """ - table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type) + table_name = _classtype_table(phrase_class, phrase_type) with self.db_connection.cursor() as db_cursor: db_cursor.execute(SQL(""" CREATE TABLE IF NOT EXISTS {{}} {} @@ -208,7 +214,7 @@ class SPImporter(): Create indexes on centroid and place_id for the place_classtype table. """ index_prefix = 'idx_place_classtype_{}_{}_'.format(phrase_class, phrase_type) - base_table = 'place_classtype_{}_{}'.format(phrase_class, phrase_type) + base_table = _classtype_table(phrase_class, phrase_type) #Index on centroid if not self.db_connection.index_exists(index_prefix + 'centroid'): with self.db_connection.cursor() as db_cursor: @@ -230,7 +236,7 @@ class SPImporter(): """ Grant access on read to the table place_classtype for the webuser. """ - table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type) + table_name = _classtype_table(phrase_class, phrase_type) with self.db_connection.cursor() as db_cursor: db_cursor.execute(SQL("""GRANT SELECT ON {} TO {}""") .format(Identifier(table_name), @@ -274,9 +280,8 @@ class SPImporter(): (self.phplib_dir / 'migration/PhraseSettingsToJson.php').resolve(), file_path], check=True) LOG.warning('special_phrase configuration file has been converted to json.') - return json_file_path except subprocess.CalledProcessError: LOG.error('Error while converting %s to json.', file_path) raise - else: - return json_file_path + + return json_file_path