]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Fri, 8 Feb 2013 18:23:46 +0000 (19:23 +0100)
committerSarah Hoffmann <lonvia@denofr.de>
Fri, 8 Feb 2013 18:23:46 +0000 (19:23 +0100)
1  2 
website/reverse.php
website/search.php

diff --combined website/reverse.php
index 859c7e3dec29d9354c4fe355682d251ff283a945,ab68a84978e303eaccd2a39a559c71d13667ce44..434b5bd10daed928a18ef1ba24b705091bf09dee
@@@ -4,22 -4,6 +4,22 @@@
        require_once(dirname(dirname(__FILE__)).'/lib/init-website.php');
        require_once(CONST_BasePath.'/lib/log.php');
  
 +    if (preg_match(CONST_BlockedUserAgents, $_SERVER["HTTP_USER_AGENT"]) > 0)
 +    {
 +        $fLoadAvg = getLoadAverage();
 +        if ($fLoadAvg >= CONST_BlockReverseMaxLoad) {
 +            header('HTTP/1.0 403 Forbidden');
 +            header('Content-type: text/html; charset=utf-8');
 +              echo "<html><body><h1>App temporarily blocked</h1>";
 +            echo "Your application has been temporarily blocked from the OpenStreetMap Nominatim ";
 +            echo "geolocation service due to high server load.";
 +            echo "\n</body></html>\n";
 +            exit;
 +        }
 +
 +    }
 +
 +
          if (strpos(CONST_BulkUserIPs, ','.$_SERVER["REMOTE_ADDR"].',') !== false)
          {
                  $fLoadAvg = getLoadAverage();
@@@ -54,7 -38,8 +54,8 @@@
  
          if (isset($_GET['osm_type']) && isset($_GET['osm_id']) && (int)$_GET['osm_id'] && ($_GET['osm_type'] == 'N' || $_GET['osm_type'] == 'W' || $_GET['osm_type'] == 'R'))
          {
-                 $iPlaceID = $oDB->getOne("select place_id from placex where osm_type = '".$_GET['osm_type']."' and osm_id = ".(int)$_GET['osm_id']." order by type = 'postcode' asc");
+                 $iPlaceID = $oDB->getOne($sSQL = ("select place_id from placex where osm_type = '".$_GET['osm_type']."' and osm_id = ".(int)$_GET['osm_id']." order by type = 'postcode' asc"));
+               if (CONST_Debug) var_dump($sSQL);
                if (!$iPlaceID) $sError = 'OSM ID Not Found';
          }
        else
                        $sSQL .= ' and (ST_GeometryType(geometry) not in (\'ST_Polygon\',\'ST_MultiPolygon\') ';
                        $sSQL .= ' OR ST_DWithin('.$sPointSQL.', centroid, '.$fSearchDiam.'))';
                        $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', geometry) ASC limit 1';
//var_dump($sSQL);
                      if (CONST_Debug) var_dump($sSQL);
                        $aPlace = $oDB->getRow($sSQL);
                        if (PEAR::IsError($aPlace))
                        {
                $aPlace['addresstype'] = $sAddressType;
  
        }
+       if (CONST_Debug) exit;
        include(CONST_BasePath.'/lib/template/address-'.$sOutputFormat.'.php');
diff --combined website/search.php
index dbb364048b3c1ec51a56bee2d2c442cc9adcb610,f9b58b1cf755b309dd3271cae8eb576a696e57ff..6319a83502e778140942c673f1e69f8d4f0ee522
@@@ -71,7 -71,6 +71,7 @@@
        if (isset($aLangPrefOrder['name:de'])) $bReverseInPlan = true;
        if (isset($aLangPrefOrder['name:ru'])) $bReverseInPlan = true;
        if (isset($aLangPrefOrder['name:ja'])) $bReverseInPlan = true;
 +      if (isset($aLangPrefOrder['name:pl'])) $bReverseInPlan = true;
  
        $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted",$aLangPrefOrder))."]";
  
                {
                        // Start with a blank search
                        $aSearches = array(
 -                              array('iSearchRank' => 0, 'iNamePhrase' => -1, 'sCountryCode' => false, 'aName'=>array(), 'aAddress'=>array(), 
 +                              array('iSearchRank' => 0, 'iNamePhrase' => -1, 'sCountryCode' => false, 'aName'=>array(), 'aAddress'=>array(), 'aFullNameAddress'=>array(),
                                        'aNameNonSearch'=>array(), 'aAddressNonSearch'=>array(),
                                        'sOperator'=>'', 'aFeatureName' => array(), 'sClass'=>'', 'sType'=>'', 'sHouseNumber'=>'', 'fLat'=>'', 'fLon'=>'', 'fRadius'=>'')
                        );
                                                                                                }
                                                                                                else
                                                                                                {
 +                                                                                                      $aCurrentSearch['aFullNameAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
                                                                                                        $aSearch['iSearchRank'] += 1000; // skip;
                                                                                                }
                                                                                        }
                                                        if ($bBoundingBoxSearch) $aTerms[] = "centroid && $sViewboxSmallSQL";
                                                        if ($sNearPointSQL) $aOrder[] = "ST_Distance($sNearPointSQL, centroid) asc";
  
 -                                                      $sImportanceSQL = 'case when importance = 0 OR importance IS NULL then 0.75-(search_rank::float/40) else importance end';
 -
 +                                                      $sImportanceSQL = '(case when importance = 0 OR importance IS NULL then 0.75-(search_rank::float/40) else importance end)';
                                                        if ($sViewboxSmallSQL) $sImportanceSQL .= " * case when ST_Contains($sViewboxSmallSQL, centroid) THEN 1 ELSE 0.5 END";
                                                        if ($sViewboxLargeSQL) $sImportanceSQL .= " * case when ST_Contains($sViewboxLargeSQL, centroid) THEN 1 ELSE 0.5 END";
                                                        $aOrder[] = "$sImportanceSQL DESC";
 +                                                      if (sizeof($aSearch['aFullNameAddress']))
 +                                                              $aOrder[] = '(select count(*) from (select unnest(ARRAY['.join($aSearch['aFullNameAddress'],",").']) INTERSECT select unnest(nameaddress_vector))s) DESC';
 +
                                                
                                                        if (sizeof($aTerms))
                                                        {
                                                                else
                                                                        $sSQL .= " limit ".$iLimit;
  
 -                                                              if (CONST_Debug) { var_dump($sSQL); }
 +                                                              if (CONST_Debug) var_dump($sSQL);
 +                                                              $iStartTime = time();
                                                                $aViewBoxPlaceIDs = $oDB->getAll($sSQL);
                                                                if (PEAR::IsError($aViewBoxPlaceIDs))
                                                                {
                                                                        failInternalError("Could not get places for search terms.", $sSQL, $aViewBoxPlaceIDs);
                                                                }
 +                                                              if (time() - $iStartTime > 60) {
 +                                                                      file_put_contents(CONST_BasePath.'/log/long_queries.log', date('Y-m-d H:i:s', $iStartTime).' '.$sSQL."\n", FILE_APPEND);
 +                                                              }
 +
  //var_dump($aViewBoxPlaceIDs);
                                                                // Did we have an viewbox matches?
                                                                $aPlaceIDs = array();
                                        $sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,";
                                        $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
  //                                    $sSQL .= $sOrderSQL." as porder, ";
 -                                      $sSQL .= "coalesce(importance,0.75-(rank_search::float/40)) as importance ";
 +                                      $sSQL .= "coalesce(importance,0.75-(rank_search::float/40)) as importance, ";
 +                                      $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(placex.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance ";
                                        $sSQL .= "from placex where place_id in ($sPlaceIDs) ";
                                        $sSQL .= "and placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
                                        if ($sAllowedTypesSQLList) $sSQL .= "and placex.class in $sAllowedTypesSQLList ";
                                        $sSQL .= "and linked_place_id is null ";
                                        $sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance";
                                        if (!$bDeDupe) $sSQL .= ",place_id";
 -                                      $sSQL .= ",get_address_by_language(place_id, $sLanguagePrefArraySQL) ";
 -                                      $sSQL .= ",get_name_by_language(name, $sLanguagePrefArraySQL) ";
 -                                      $sSQL .= ",get_name_by_language(name, ARRAY['ref']) ";
 +                                      $sSQL .= ",langaddress ";
 +                                      $sSQL .= ",placename ";
 +                                      $sSQL .= ",ref ";
                                        $sSQL .= " union ";
                                        $sSQL .= "select 'T' as osm_type,place_id as osm_id,'place' as class,'house' as type,null as admin_level,30 as rank_search,30 as rank_address,min(place_id) as place_id,'us' as country_code,";
                                        $sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
                                        $sSQL .= "null as ref,";
                                        $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
  //                                    $sSQL .= $sOrderSQL." as porder, ";
 -                                      $sSQL .= "-0.15 as importance ";
 +                                      $sSQL .= "-0.15 as importance, ";
 +                                      $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_tiger.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance ";
                                        $sSQL .= "from location_property_tiger where place_id in ($sPlaceIDs) ";
                                        $sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
                                        $sSQL .= "group by place_id";
                                        $sSQL .= "null as ref,";
                                        $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
  //                                    $sSQL .= $sOrderSQL." as porder, ";
 -                                      $sSQL .= "-0.10 as importance ";
 +                                      $sSQL .= "-0.10 as importance, ";
 +                                      $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_aux.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance ";
                                        $sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) ";
                                        $sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
                                        $sSQL .= "group by place_id";
                {
                        if (stripos($sAddress, $sWord)!==false) $iCountWords++;
                }
 +
                $aResult['importance'] = $aResult['importance'] + ($iCountWords*0.1); // 0.1 is a completely arbitrary number but something in the range 0.1 to 0.5 would seem right
  
  //if (CONST_Debug) var_dump($aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']);
                }
  */
                $aResult['name'] = $aResult['langaddress'];
 -              $aResult['foundorder'] = $iResNum;
 +              $aResult['foundorder'] = -$aResult['addressimportance'];
                $aSearchResults[$iResNum] = $aResult;
        }
        uasort($aSearchResults, 'byImportance');
                        $bFirst = false;
                }
                if (!$bDeDupe || (!isset($aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']])
-                       && !isset($aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['name']])))
+                       && !isset($aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name']])))
                {
                        $aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']] = true;
-                       $aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['name']] = true;
+                       $aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name']] = true;
                        $aSearchResults[] = $aResult;
                }