]> git.openstreetmap.org Git - nominatim.git/commitdiff
new method /lookup.php - Reverse search by multiple osm ids
authorMarc Tobias Metten <mtmail@gmx.net>
Tue, 16 Jun 2015 19:11:21 +0000 (21:11 +0200)
committerMarc Tobias Metten <mtmail@gmx.net>
Tue, 16 Jun 2015 19:11:21 +0000 (21:11 +0200)
lib/template/search-xml.php
settings/settings.php
tests/features/api/lookup.feature [new file with mode: 0644]
tests/features/api/reverse_simple.feature
tests/steps/api_result.py
tests/steps/api_setup.py
utils/setup.php
website/lookup.php [new file with mode: 0755]

index 693330bb52cfce29fba95d3ce1c45415085b4b99..c1fd58f02ed4f612424eeebdd3d1829394207f15 100644 (file)
@@ -5,7 +5,8 @@
        echo "?xml version=\"1.0\" encoding=\"UTF-8\" ?";
        echo ">\n";
 
-       echo "<searchresults";
+       echo "<";
+       echo (isset($sXmlRootTag)?$sXmlRootTag:'searchresults');
        echo " timestamp='".date(DATE_RFC822)."'";
        echo " attribution='Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'";
        echo " querystring='".htmlspecialchars($sQuery, ENT_QUOTES)."'";
                }
        }
        
-       echo "</searchresults>";
+       echo "</" . (isset($sXmlRootTag)?$sXmlRootTag:'searchresults') . ">";
index a1fbc9f8e9a56684206d3470ac62561b5c4c7bac..48ff7c4ea7ba8204abbb3bdbd1d684eb81a31582 100644 (file)
        @define('CONST_Search_TryDroppedAddressTerms', false);
        @define('CONST_Search_NameOnlySearchFrequencyThreshold', 500);
 
+       @define('CONST_Places_Max_ID_count', 50); 
+
        // Set to zero to disable polygon output
        @define('CONST_PolygonOutput_MaximumTypes', 1);
 
diff --git a/tests/features/api/lookup.feature b/tests/features/api/lookup.feature
new file mode 100644 (file)
index 0000000..fb5e444
--- /dev/null
@@ -0,0 +1,17 @@
+Feature: Places by osm_type and osm_id Tests
+    Simple tests for internal server errors and response format.
+
+    @mtm
+    Scenario: address lookup for existing node, way, relation
+        When looking up xml places N158845944,W72493656,,R62422,X99,N0
+        Then the result is valid xml
+        exactly 3 results are returned
+        When looking up json places N158845944,W72493656,,R62422,X99,N0
+        Then the result is valid json
+        exactly 3 results are returned
+
+    @mtm
+    Scenario: address lookup for non-existing or invalid node, way, relation
+        When looking up xml places X99,,N0,nN158845944,ABC,,W9
+        Then the result is valid xml
+        exactly 0 results are returned
\ No newline at end of file
index 7d564dde77e0fb656d97204655c5a0c806ccfbf6..8621ec655903d80006909b7ecf9fff097287cf48 100644 (file)
@@ -94,4 +94,4 @@ Feature: Simple Reverse Tests
      | 48.966.0 | 8.4482
      | 48.966   | 8.448.2
      | Nan      | 8.448
-     | 48.966   | Nan
+     | 48.966   | Nan
\ No newline at end of file
index e86641fc7ee3b8402d5765a38186f1e5ad867d73..17d5e4eb09098c404461f8076df1ba75d396e704 100644 (file)
@@ -27,7 +27,7 @@ def _parse_xml():
     world.results = []
 
     # results
-    if page.nodeName == 'searchresults':
+    if page.nodeName == 'searchresults' or page.nodeName == 'lookupresults':
         for node in page.childNodes:
             if node.nodeName != "#text":
                 assert_equals(node.nodeName, 'place', msg="Unexpected element '%s'" % node.nodeName)
index fcaa39a2adc91c01c4c9747f754562dc8f990452..b5a098fcc2023adb746ead972d49e75e653f31ce 100644 (file)
@@ -123,6 +123,13 @@ def api_setup_details(step, obj):
         world.params['place_id']  = obj
     api_call('details')
 
+@step(u'looking up (\w+) places ((?:[a-z]\d+,*)+)')
+def api_setup_lookup(step, fmt, ids):
+    world.params['osm_ids'] = ids
+    if fmt and fmt.strip():
+        world.params['format'] = fmt.strip()
+    api_call('lookup')
+
 @step(u'sending an API call (\w+)')
 def api_general_call(step, call):
     api_call(call)
index b49813a8ab7f056603e469b8fd8e7fcdfd2c1258..3fad6fe80bc4e09e74a6ce260c845d723d8cf790 100755 (executable)
                @symlink(CONST_BasePath.'/website/reverse.php', $sTargetDir.'/reverse.php');
                @symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/search.php');
                @symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/index.php');
+               @symlink(CONST_BasePath.'/website/lookup.php', $sTargetDir.'/lookup.php');
                @symlink(CONST_BasePath.'/website/deletable.php', $sTargetDir.'/deletable.php');
                @symlink(CONST_BasePath.'/website/polygons.php', $sTargetDir.'/polygons.php');
                @symlink(CONST_BasePath.'/website/status.php', $sTargetDir.'/status.php');
diff --git a/website/lookup.php b/website/lookup.php
new file mode 100755 (executable)
index 0000000..d1c8129
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+       @define('CONST_ConnectionBucket_PageType', 'Reverse');
+
+       require_once(dirname(dirname(__FILE__)).'/lib/init-website.php');
+       require_once(CONST_BasePath.'/lib/log.php');
+       require_once(CONST_BasePath.'/lib/PlaceLookup.php');
+
+       if (strpos(CONST_BulkUserIPs, ','.$_SERVER["REMOTE_ADDR"].',') !== false)
+       {
+               $fLoadAvg = getLoadAverage();
+               if ($fLoadAvg > 2) sleep(60);
+               if ($fLoadAvg > 4) sleep(120);
+               if ($fLoadAvg > 6)
+               {
+                       userError("Bulk User: Temporary block due to high server load");
+                       exit;
+               }
+       }
+
+       $oDB =& getDB();
+       ini_set('memory_limit', '200M');
+
+       // Format for output
+       $sOutputFormat = 'xml';
+       if (isset($_GET['format']) && ($_GET['format'] == 'xml' || $_GET['format'] == 'json'))
+       {
+               $sOutputFormat = $_GET['format'];
+       }
+
+       // Show address breakdown
+       $bShowAddressDetails = true;
+       if (isset($_GET['addressdetails'])) $bShowAddressDetails = (bool)$_GET['addressdetails'];
+
+       // Preferred language
+       $aLangPrefOrder = getPreferredLanguages();
+
+       $hLog = logStart($oDB, 'place', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
+
+       $aSearchResults = array();
+       if (isset($_GET['osm_ids']))
+       {
+               $oPlaceLookup = new PlaceLookup($oDB);
+               $oPlaceLookup->setLanguagePreference($aLangPrefOrder);
+               $oPlaceLookup->setIncludeAddressDetails($bShowAddressDetails);
+               
+               $osm_ids = explode(',', $_GET['osm_ids']);
+               
+               if ( count($osm_ids) > CONST_Places_Max_ID_count ) 
+               {
+                       userError('Bulk User: Only ' . CONST_Places_Max_ID_count . " ids are allowed in one request.");
+                       exit;
+               }
+               
+               $type = ''; 
+               $id = 0;
+               foreach ($osm_ids AS $item) 
+               {
+                       // Skip empty items
+                       if (empty($item)) continue;
+                       
+                       $type = $item[0];
+                       $id = (int) substr($item, 1);
+                       if ( $id > 0 && ($type == 'N' || $type == 'W' || $type == 'R') )
+                       {
+                               $oPlaceLookup->setOSMID($type, $id);
+                               $oPlace = $oPlaceLookup->lookup();
+                               if ($oPlace){
+                                       // we want to use the search-* output templates, so we need to fill
+                                       // $aSearchResults and slightly change the (reverse search) oPlace
+                                       // key names
+                                       $oResult = $oPlace;
+                                       unset($oResult['aAddress']);
+                                       $oResult['address'] = $oPlace['aAddress'];
+                                       unset($oResult['langaddress']);
+                                       $oResult['name'] = $oPlace['langaddress'];
+                                       $aSearchResults[] = $oResult;
+                               }
+                       }
+               }
+       }
+
+
+       if (CONST_Debug) exit;
+
+       $sXmlRootTag = 'lookupresults';
+       // we initialize these to avoid warnings in our logfile
+       $sQuery = '';
+       $sViewBox = '';
+       $bShowPolygons = '';
+       $aExcludePlaceIDs = [];
+       $sMoreURL = '';
+
+       include(CONST_BasePath.'/lib/template/search-'.$sOutputFormat.'.php');