protected $aExcludePlaceIDs = array();
protected $bDeDupe = true;
- protected $bReverseInPlan = false;
+ protected $bReverseInPlan = true;
protected $iLimit = 20;
protected $iFinalLimit = 10;
return $this->aExcludePlaceIDs;
}
+
+ public function getCountryCodes()
+ {
+ return $this->aCountryCodes;
+ }
+
public function getViewBoxString()
{
if (!$this->aViewBox) return null;
$sHousenumbers .= "(".$placeID.", ".$housenumber.")";
if ($i<$length) $sHousenumbers .= ", ";
}
+
if (CONST_Use_US_Tiger_Data) {
// Tiger search only if a housenumber was searched and if it was found (i.e. aPlaceIDs[placeID] = housenumber != -1) (realized through a join)
$sSQL .= " union";
$sSQL .= " SELECT ";
$sSQL .= " 'T' AS osm_type, ";
- $sSQL .= " place_id AS osm_id, ";
+ $sSQL .= " (SELECT osm_id from placex p WHERE p.place_id=min(blub.parent_place_id)) as osm_id, ";
$sSQL .= " 'place' AS class, ";
$sSQL .= " 'house' AS type, ";
$sSQL .= " null AS admin_level, ";
$sSQL .= " UNION ";
$sSQL .= "SELECT ";
$sSQL .= " 'W' AS osm_type, ";
- $sSQL .= " place_id AS osm_id, ";
+ $sSQL .= " osm_id, ";
$sSQL .= " 'place' AS class, ";
$sSQL .= " 'house' AS type, ";
$sSQL .= " null AS admin_level, ";
$sSQL .= " null AS extra_place ";
$sSQL .= " FROM (";
$sSQL .= " SELECT ";
+ $sSQL .= " osm_id, ";
$sSQL .= " place_id, ";
$sSQL .= " calculated_country_code, ";
$sSQL .= " CASE "; // interpolate the housenumbers here
}
$sQuery = $this->sQuery;
+ if (!preg_match('//u', $sQuery)) {
+ userError("Query string is not UTF-8 encoded.");
+ }
// Conflicts between US state abreviations and various words for 'the' in different languages
if (isset($this->aLangPrefOrder['name:en'])) {
$aOrder[0] .= " SELECT place_id ";
$aOrder[0] .= " FROM location_property_osmline ";
$aOrder[0] .= " WHERE parent_place_id = search_name.place_id";
+ $aOrder[0] .= " AND startnumber is not NULL";
$aOrder[0] .= " AND ".intval($aSearch['sHouseNumber']).">=startnumber ";
$aOrder[0] .= " AND ".intval($aSearch['sHouseNumber'])."<=endnumber ";
$aOrder[0] .= " LIMIT 1";
// TODO: filter out the pointless search terms (2 letter name tokens and less)
// they might be right - but they are just too darned expensive to run
if (sizeof($aSearch['aName'])) $aTerms[] = "name_vector @> ARRAY[".join($aSearch['aName'], ",")."]";
- if (sizeof($aSearch['aNameNonSearch'])) $aTerms[] = "array_cat(name_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aNameNonSearch'], ",")."]";
+ //if (sizeof($aSearch['aNameNonSearch'])) $aTerms[] = "array_cat(name_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aNameNonSearch'], ",")."]";
if (sizeof($aSearch['aAddress']) && $aSearch['aName'] != $aSearch['aAddress']) {
// For infrequent name terms disable index usage for address
if (CONST_Search_NameOnlySearchFrequencyThreshold
&& sizeof($aSearch['aName']) == 1
&& $aWordFrequencyScores[$aSearch['aName'][reset($aSearch['aName'])]] < CONST_Search_NameOnlySearchFrequencyThreshold
) {
- $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join(array_merge($aSearch['aAddress'], $aSearch['aAddressNonSearch']), ",")."]";
+ //$aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join(array_merge($aSearch['aAddress'], $aSearch['aAddressNonSearch']), ",")."]";
+ $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddress'],",")."]";
} else {
$aTerms[] = "nameaddress_vector @> ARRAY[".join($aSearch['aAddress'], ",")."]";
- if (sizeof($aSearch['aAddressNonSearch'])) {
+ /*if (sizeof($aSearch['aAddressNonSearch'])) {
$aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddressNonSearch'], ",")."]";
- }
+ }*/
}
}
if ($aSearch['sCountryCode']) $aTerms[] = "country_code = '".pg_escape_string($aSearch['sCountryCode'])."'";
// do we need to use transliteration and the regex for housenumbers???
//new query for lines, not housenumbers anymore
$sSQL = "SELECT distinct place_id FROM location_property_osmline";
- $sSQL .= " WHERE parent_place_id in (".$sPlaceIDs.") and (";
+ $sSQL .= " WHERE startnumber is not NULL and parent_place_id in (".$sPlaceIDs.") and (";
if ($searchedHousenumber%2 == 0) {
//if housenumber is even, look for housenumber in streets with interpolationtype even or all
$sSQL .= "interpolationtype='even'";
$sSQL .= " SELECT place_id ";
$sSQL .= " FROM location_property_osmline ";
$sSQL .= " WHERE place_id in (".join(',', array_keys($aResultPlaceIDs)).")";
- $sSQL .= " AND (30 between $this->iMinAddressRank and $this->iMaxAddressRank)";
+ $sSQL .= " AND startnumber is not NULL AND (30 between $this->iMinAddressRank and $this->iMaxAddressRank)";
if (CONST_Debug) var_dump($sSQL);
$aFilteredPlaceIDs = chksql($this->oDB->getCol($sSQL));
$tempIDs = array();