mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-10-26 11:11:19 +03:00
Merge pull request #2498 from lonvia/ordering-for-unlisted-place-results
Include unlisted places in ordering by housenumber
This commit is contained in:
commit
d11bf9288e
@ -581,32 +581,37 @@ class SearchDescription
|
||||
|
||||
// Sort by existence of the requested house number but only if not
|
||||
// too many results are expected for the street, i.e. if the result
|
||||
// will be narrowed down by an address. Remeber that with ordering
|
||||
// will be narrowed down by an address. Remember that with ordering
|
||||
// every single result has to be checked.
|
||||
if ($this->sHouseNumber && ($this->bRareName || !empty($this->aAddress) || $this->sPostcode)) {
|
||||
$sHouseNumberRegex = '\\\\m'.$this->sHouseNumber.'\\\\M';
|
||||
$aOrder[] = ' (';
|
||||
$aOrder[0] .= 'EXISTS(';
|
||||
$aOrder[0] .= ' SELECT place_id';
|
||||
$aOrder[0] .= ' FROM placex';
|
||||
$aOrder[0] .= ' WHERE parent_place_id = search_name.place_id';
|
||||
$aOrder[0] .= " AND housenumber ~* E'".$sHouseNumberRegex."'";
|
||||
$aOrder[0] .= ' LIMIT 1';
|
||||
$aOrder[0] .= ') ';
|
||||
// also housenumbers from interpolation lines table are needed
|
||||
if (preg_match('/[0-9]+/', $this->sHouseNumber)) {
|
||||
$iHouseNumber = intval($this->sHouseNumber);
|
||||
$aOrder[0] .= 'OR EXISTS(';
|
||||
$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 '.$iHouseNumber.'>=startnumber ';
|
||||
$aOrder[0] .= ' AND '.$iHouseNumber.'<=endnumber ';
|
||||
$aOrder[0] .= ' LIMIT 1';
|
||||
$aOrder[0] .= ')';
|
||||
|
||||
// Housenumbers on streets and places.
|
||||
$sChildHnr = 'SELECT * FROM placex WHERE parent_place_id = search_name.place_id';
|
||||
$sChildHnr .= " AND housenumber ~* E'".$sHouseNumberRegex."'";
|
||||
// Interpolations on streets and places.
|
||||
if (preg_match('/^[0-9]+$/', $this->sHouseNumber)) {
|
||||
$sIpolHnr = 'SELECT * FROM location_property_osmline ';
|
||||
$sIpolHnr .= 'WHERE parent_place_id = search_name.place_id ';
|
||||
$sIpolHnr .= ' AND startnumber is not NULL';
|
||||
$sIpolHnr .= ' AND '.$this->sHouseNumber.'>=startnumber ';
|
||||
$sIpolHnr .= ' AND '.$this->sHouseNumber.'<=endnumber ';
|
||||
} else {
|
||||
$sIpolHnr = false;
|
||||
}
|
||||
$aOrder[0] .= ') DESC';
|
||||
// Housenumbers on the object iteself for unlisted places.
|
||||
$sSelfHnr = 'SELECT * FROM placex WHERE place_id = search_name.place_id';
|
||||
$sSelfHnr .= " AND housenumber ~* E'".$sHouseNumberRegex."'";
|
||||
|
||||
$sSql = '(CASE WHEN address_rank = 30 THEN EXISTS('.$sSelfHnr.') ';
|
||||
$sSql .= ' ELSE EXISTS('.$sChildHnr.') ';
|
||||
if ($sIpolHnr) {
|
||||
$sSql .= 'OR EXISTS('.$sIpolHnr.') ';
|
||||
}
|
||||
$sSql .= 'END) DESC';
|
||||
|
||||
|
||||
$aOrder[] = $sSql;
|
||||
}
|
||||
|
||||
if (!empty($this->aName)) {
|
||||
|
Loading…
Reference in New Issue
Block a user