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') . ">";
@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);
--- /dev/null
+Feature: Places by osm_type and osm_id Tests
+ Simple tests for internal server errors and response format.
+
+ 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
+
+ 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
| 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
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)
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)
@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');
--- /dev/null
+<?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();
+ $aCleanedQueryParts = array();
+ if (isset($_GET['osm_ids']))
+ {
+ $oPlaceLookup = new PlaceLookup($oDB);
+ $oPlaceLookup->setLanguagePreference($aLangPrefOrder);
+ $oPlaceLookup->setIncludeAddressDetails($bShowAddressDetails);
+
+ $aOsmIds = explode(',', $_GET['osm_ids']);
+
+ if ( count($aOsmIds) > CONST_Places_Max_ID_count )
+ {
+ userError('Bulk User: Only ' . CONST_Places_Max_ID_count . " ids are allowed in one request.");
+ exit;
+ }
+
+ foreach ($aOsmIds AS $sItem)
+ {
+ // Skip empty sItem
+ if (empty($sItem)) continue;
+
+ $sType = $sItem[0];
+ $iId = (int) substr($sItem, 1);
+ if ( $iId > 0 && ($sType == 'N' || $sType == 'W' || $sType == 'R') )
+ {
+ $aCleanedQueryParts[] = $sType . $iId;
+ $oPlaceLookup->setOSMID($sType, $iId);
+ $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']);
+ if (isset($oPlace['aAddress'])) $oResult['address'] = $oPlace['aAddress'];
+ unset($oResult['langaddress']);
+ $oResult['name'] = $oPlace['langaddress'];
+ $aSearchResults[] = $oResult;
+ }
+ }
+ }
+ }
+
+
+ if (CONST_Debug) exit;
+
+ $sXmlRootTag = 'lookupresults';
+ $sQuery = join(',',$aCleanedQueryParts);
+ // we initialize these to avoid warnings in our logfile
+ $sViewBox = '';
+ $bShowPolygons = '';
+ $aExcludePlaceIDs = [];
+ $sMoreURL = '';
+
+ include(CONST_BasePath.'/lib/template/search-'.$sOutputFormat.'.php');