mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-12-26 22:44:44 +03:00
fe11d3cbbd
We've previously added searching through rank 30 in a house number search to enable searches for house number+name. This had the unintended side effect that rank 30 objects are also returned in s search that dropped the house number from the query. This is wrong because POIs cannot function as a parent to a house number. This fix drops all rank 30 objects from the results for a house number search if they do not match the requested house number.
122 lines
3.4 KiB
PHP
122 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace Nominatim;
|
|
|
|
/**
|
|
* A single result of a search operation or a reverse lookup.
|
|
*
|
|
* This object only contains the id of the result. It does not yet
|
|
* have any details needed to format the output document.
|
|
*/
|
|
class Result
|
|
{
|
|
const TABLE_PLACEX = 0;
|
|
const TABLE_POSTCODE = 1;
|
|
const TABLE_OSMLINE = 2;
|
|
const TABLE_TIGER = 3;
|
|
|
|
/// Database table that contains the result.
|
|
public $iTable;
|
|
/// Id of the result.
|
|
public $iId;
|
|
/// House number (only for interpolation results).
|
|
public $iHouseNumber = -1;
|
|
/// Number of exact matches in address (address searches only).
|
|
public $iExactMatches = 0;
|
|
/// Subranking within the results (the higher the worse).
|
|
public $iResultRank = 0;
|
|
/// Address rank of the result.
|
|
public $iAddressRank;
|
|
|
|
public function debugInfo()
|
|
{
|
|
return array(
|
|
'Table' => $this->iTable,
|
|
'ID' => $this->iId,
|
|
'House number' => $this->iHouseNumber,
|
|
'Exact Matches' => $this->iExactMatches,
|
|
'Result rank' => $this->iResultRank
|
|
);
|
|
}
|
|
|
|
|
|
public function __construct($sId, $iTable = Result::TABLE_PLACEX)
|
|
{
|
|
$this->iTable = $iTable;
|
|
$this->iId = (int) $sId;
|
|
}
|
|
|
|
public static function joinIdsByTable($aResults, $iTable)
|
|
{
|
|
return join(',', array_keys(array_filter(
|
|
$aResults,
|
|
function ($aValue) use ($iTable) {
|
|
return $aValue->iTable == $iTable;
|
|
}
|
|
)));
|
|
}
|
|
|
|
public static function joinIdsByTableMinRank($aResults, $iTable, $iMinAddressRank)
|
|
{
|
|
return join(',', array_keys(array_filter(
|
|
$aResults,
|
|
function ($aValue) use ($iTable, $iMinAddressRank) {
|
|
return $aValue->iTable == $iTable && $aValue->iAddressRank >= $iMinAddressRank;
|
|
}
|
|
)));
|
|
}
|
|
|
|
public static function joinIdsByTableMaxRank($aResults, $iTable, $iMaxAddressRank)
|
|
{
|
|
return join(',', array_keys(array_filter(
|
|
$aResults,
|
|
function ($aValue) use ($iTable, $iMaxAddressRank) {
|
|
return $aValue->iTable == $iTable && $aValue->iAddressRank <= $iMaxAddressRank;
|
|
}
|
|
)));
|
|
}
|
|
|
|
public static function sqlHouseNumberTable($aResults, $iTable)
|
|
{
|
|
$sHousenumbers = '';
|
|
$sSep = '';
|
|
foreach ($aResults as $oResult) {
|
|
if ($oResult->iTable == $iTable) {
|
|
$sHousenumbers .= $sSep.'('.$oResult->iId.',';
|
|
$sHousenumbers .= $oResult->iHouseNumber.')';
|
|
$sSep = ',';
|
|
}
|
|
}
|
|
|
|
return $sHousenumbers;
|
|
}
|
|
|
|
/**
|
|
* Split a result array into highest ranked result and the rest
|
|
*
|
|
* @param object[] $aResults List of results to split.
|
|
*
|
|
* @return array[]
|
|
*/
|
|
public static function splitResults($aResults)
|
|
{
|
|
$aHead = array();
|
|
$aTail = array();
|
|
$iMinRank = 10000;
|
|
|
|
foreach ($aResults as $oRes) {
|
|
if ($oRes->iResultRank < $iMinRank) {
|
|
$aTail += $aHead;
|
|
$aHead = array($oRes->iId => $oRes);
|
|
$iMinRank = $oRes->iResultRank;
|
|
} elseif ($oRes->iResultRank == $iMinRank) {
|
|
$aHead[$oRes->iId] = $oRes;
|
|
} else {
|
|
$aTail[$oRes->iId] = $oRes;
|
|
}
|
|
}
|
|
|
|
return array('head' => $aHead, 'tail' => $aTail);
|
|
}
|
|
}
|