include unlisted places in ordering by housenumber

When ordering results by the fact that they have a housenumber,
also take cases into account where the housenumber is on the
place itself. This may happen when the search includes the name
of the place and the housenumber or for addr:place addresses
where the place is unlisted.
This commit is contained in:
Sarah Hoffmann 2021-10-28 11:27:31 +02:00
parent d3d07128b2
commit 2275fe59ab

View File

@ -581,32 +581,37 @@ class SearchDescription
// Sort by existence of the requested house number but only if not // 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 // 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. // every single result has to be checked.
if ($this->sHouseNumber && ($this->bRareName || !empty($this->aAddress) || $this->sPostcode)) { if ($this->sHouseNumber && ($this->bRareName || !empty($this->aAddress) || $this->sPostcode)) {
$sHouseNumberRegex = '\\\\m'.$this->sHouseNumber.'\\\\M'; $sHouseNumberRegex = '\\\\m'.$this->sHouseNumber.'\\\\M';
$aOrder[] = ' (';
$aOrder[0] .= 'EXISTS('; // Housenumbers on streets and places.
$aOrder[0] .= ' SELECT place_id'; $sChildHnr = 'SELECT * FROM placex WHERE parent_place_id = search_name.place_id';
$aOrder[0] .= ' FROM placex'; $sChildHnr .= " AND housenumber ~* E'".$sHouseNumberRegex."'";
$aOrder[0] .= ' WHERE parent_place_id = search_name.place_id'; // Interpolations on streets and places.
$aOrder[0] .= " AND housenumber ~* E'".$sHouseNumberRegex."'"; if (preg_match('/^[0-9]+$/', $this->sHouseNumber)) {
$aOrder[0] .= ' LIMIT 1'; $sIpolHnr = 'SELECT * FROM location_property_osmline ';
$aOrder[0] .= ') '; $sIpolHnr .= 'WHERE parent_place_id = search_name.place_id ';
// also housenumbers from interpolation lines table are needed $sIpolHnr .= ' AND startnumber is not NULL';
if (preg_match('/[0-9]+/', $this->sHouseNumber)) { $sIpolHnr .= ' AND '.$this->sHouseNumber.'>=startnumber ';
$iHouseNumber = intval($this->sHouseNumber); $sIpolHnr .= ' AND '.$this->sHouseNumber.'<=endnumber ';
$aOrder[0] .= 'OR EXISTS('; } else {
$aOrder[0] .= ' SELECT place_id '; $sIpolHnr = false;
$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] .= ')';
} }
$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)) { if (!empty($this->aName)) {