$sOutputFormat = 'html';
$aSearchResults = array();
$aExcludePlaceIDs = array();
+ $sCountryCodesSQL = false;
$sSuggestion = $sSuggestionURL = false;
$bDeDupe = isset($_GET['dedupe'])?(bool)$_GET['dedupe']:true;
$bReverseInPlan = false;
if (isset($aLangPrefOrder['name:ru'])) $bReverseInPlan = true;
if (isset($aLangPrefOrder['name:ja'])) $bReverseInPlan = true;
-$bReverseInPlan = true;
-
$sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted",$aLangPrefOrder))."]";
if (isset($_GET['exclude_place_ids']) && $_GET['exclude_place_ids'])
break;
}
}
+
+ if (isset($_GET['countrycodes']))
+ {
+ $aCountryCodes = array();
+ foreach(explode(',',$_GET['countrycodes']) as $sCountryCode)
+ {
+ if (preg_match('/^[a-zA-Z][a-zA-Z]$/', $sCountryCode))
+ {
+ $aCountryCodes[] = "'".strtolower($sCountryCode)."'";
+ }
+ }
+ $sCountryCodesSQL = join(',', $aCountryCodes);
+ }
// Search query
$sQuery = (isset($_GET['q'])?trim($_GET['q']):'');
if ($oDB->getOne($sSQL))
{
$sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType'];
+ if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)";
$sSQL .= " where st_contains($sViewboxSmallSQL, centroid)";
+ if ($sCountryCodesSQL) $sSQL .= " and country_code in ($sCountryCodesSQL)";
if ($sViewboxCentreSQL) $sSQL .= " order by st_distance($sViewboxCentreSQL, centroid) asc";
$sSQL .= " limit $iLimit";
if (CONST_Debug) var_dump($sSQL);
if (!sizeof($aPlaceIDs))
{
$sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType'];
+ if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)";
$sSQL .= " where st_contains($sViewboxLargeSQL, centroid)";
+ if ($sCountryCodesSQL) $sSQL .= " and country_code in ($sCountryCodesSQL)";
if ($sViewboxCentreSQL) $sSQL .= " order by st_distance($sViewboxCentreSQL, centroid) asc";
$sSQL .= " limit $iLimit";
if (CONST_Debug) var_dump($sSQL);
{
$sSQL = "select place_id from placex where class='".$aSearch['sClass']."' and type='".$aSearch['sType']."'";
$sSQL .= " and st_contains($sViewboxSmallSQL, centroid)";
+ if ($sCountryCodesSQL) $sSQL .= " and country_code in ($sCountryCodesSQL)";
if ($sViewboxCentreSQL) $sSQL .= " order by st_distance($sViewboxCentreSQL, centroid) asc";
$sSQL .= " limit $iLimit";
if (CONST_Debug) var_dump($sSQL);
{
$aTerms[] = "place_id not in (".join(',',$aExcludePlaceIDs).")";
}
+ if ($sCountryCodesSQL)
+ {
+ $aTerms[] = "country_code in ($sCountryCodesSQL)";
+ }
+
if ($bBoundingBoxSearch) $aTerms[] = "centroid && $sViewboxSmallSQL";
if ($sNearPointSQL) $aOrder[] = "ST_Distance($sNearPointSQL, centroid) asc";
{
// If they were searching for a named class (i.e. 'Kings Head pub') then we might have an extra match
$sSQL = "select place_id from placex where place_id in ($sPlaceIDs) and class='".$aSearch['sClass']."' and type='".$aSearch['sType']."'";
+ if ($sCountryCodesSQL) $sSQL .= " and country_code in ($sCountryCodesSQL)";
$sSQL .= " order by rank_search asc limit $iLimit";
if (CONST_Debug) var_dump($sSQL);
$aPlaceIDs = $oDB->getCol($sSQL);
if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'near') // & in
{
$sSQL = "select rank_search from placex where place_id in ($sPlaceIDs) order by rank_search asc limit 1";
+
if (CONST_Debug) var_dump($sSQL);
$iMaxRank = ((int)$oDB->getOne($sSQL)) + 5;
// More efficient - can make the range bigger
$fRange = 0.05;
$sSQL = "select l.place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." as l";
+ if ($sCountryCodesSQL) $sSQL .= " join placex as lp using (place_id)";
$sSQL .= ",placex as f where ";
$sSQL .= "f.place_id in ($sPlaceIDs) and ST_DWithin(l.centroid, st_centroid(f.geometry), $fRange) ";
if (sizeof($aExcludePlaceIDs))
{
$sSQL .= " and l.place_id not in (".join(',',$aExcludePlaceIDs).")";
}
+ if ($sCountryCodesSQL) $sSQL .= " and lp.country_code in ($sCountryCodesSQL)";
if ($sNearPointSQL) $sSQL .= " order by ST_Distance($sNearPointSQL, l.centroid) ASC";
else $sSQL .= " order by ST_Distance(l.centroid, f.geometry) asc";
$sSQL .= " limit $iLimit";
{
$sSQL .= " and l.place_id not in (".join(',',$aExcludePlaceIDs).")";
}
+ if ($sCountryCodesSQL) $sSQL .= " and l.country_code in ($sCountryCodesSQL)";
if ($sNearPointSQL) $sSQL .= " order by ST_Distance($sNearPointSQL, l.geometry) ASC";
else $sSQL .= " order by ST_Distance(l.geometry, f.geometry) asc, l.rank_search ASC";
$sSQL .= " limit $iLimit";
$sSQL .= "get_name_by_language(name, $sLanguagePrefArraySQL) as placename,";
$sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,";
$sSQL .= "avg(ST_X(ST_Centroid(geometry))) as lon,avg(ST_Y(ST_Centroid(geometry))) as lat, ";
- $sSQL .= $sOrderSQL." as porder, ";
+// $sSQL .= $sOrderSQL." as porder, ";
$sSQL .= "coalesce(importance,0.9-(rank_search::float/30)) as importance ";
$sSQL .= "from placex where place_id in ($sPlaceIDs) ";
$sSQL .= "and placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
$sSQL .= "null as placename,";
$sSQL .= "null as ref,";
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
- $sSQL .= $sOrderSQL." as porder, ";
+// $sSQL .= $sOrderSQL." as porder, ";
$sSQL .= "-0.15 as importance ";
$sSQL .= "from location_property_tiger where place_id in ($sPlaceIDs) ";
$sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
$sSQL .= "null as placename,";
$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 .= $sOrderSQL." as porder, ";
+ $sSQL .= "-0.10 as importance ";
$sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) ";
$sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
$sSQL .= "group by place_id";
if (!$bDeDupe) $sSQL .= ",place_id";
$sSQL .= ",get_address_by_language(place_id, $sLanguagePrefArraySQL) ";
- $sSQL .= "order by porder asc";
+ $sSQL .= "order by importance desc";
// $sSQL .= "order by rank_search,rank_address,porder asc";
if (CONST_Debug) var_dump('<hr>',$sSQL);
$aSearchResults = $oDB->getAll($sSQL);