From 7c8c206818266f40d2447e9b4c1b059c1139b152 Mon Sep 17 00:00:00 2001 From: Marc Tobias Metten Date: Tue, 16 Jun 2015 21:11:21 +0200 Subject: [PATCH] new method /lookup.php - Reverse search by multiple osm ids --- lib/template/search-xml.php | 5 +- settings/settings.php | 2 + tests/features/api/lookup.feature | 17 +++++ tests/features/api/reverse_simple.feature | 2 +- tests/steps/api_result.py | 2 +- tests/steps/api_setup.py | 7 ++ utils/setup.php | 1 + website/lookup.php | 93 +++++++++++++++++++++++ 8 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 tests/features/api/lookup.feature create mode 100755 website/lookup.php diff --git a/lib/template/search-xml.php b/lib/template/search-xml.php index 693330bb..c1fd58f0 100644 --- a/lib/template/search-xml.php +++ b/lib/template/search-xml.php @@ -5,7 +5,8 @@ echo "?xml version=\"1.0\" encoding=\"UTF-8\" ?"; echo ">\n"; - echo ""; + echo ""; diff --git a/settings/settings.php b/settings/settings.php index a1fbc9f8..48ff7c4e 100644 --- a/settings/settings.php +++ b/settings/settings.php @@ -100,6 +100,8 @@ @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 index 00000000..fb5e444f --- /dev/null +++ b/tests/features/api/lookup.feature @@ -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 diff --git a/tests/features/api/reverse_simple.feature b/tests/features/api/reverse_simple.feature index 7d564dde..8621ec65 100644 --- a/tests/features/api/reverse_simple.feature +++ b/tests/features/api/reverse_simple.feature @@ -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 diff --git a/tests/steps/api_result.py b/tests/steps/api_result.py index e86641fc..17d5e4eb 100644 --- a/tests/steps/api_result.py +++ b/tests/steps/api_result.py @@ -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) diff --git a/tests/steps/api_setup.py b/tests/steps/api_setup.py index fcaa39a2..b5a098fc 100644 --- a/tests/steps/api_setup.py +++ b/tests/steps/api_setup.py @@ -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) diff --git a/utils/setup.php b/utils/setup.php index b49813a8..3fad6fe8 100755 --- a/utils/setup.php +++ b/utils/setup.php @@ -710,6 +710,7 @@ @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 index 00000000..d1c81292 --- /dev/null +++ b/website/lookup.php @@ -0,0 +1,93 @@ + 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'); -- 2.39.5