Added /addressdb/searchAddress api endpoint

This commit is contained in:
Frank Schubert
2022-12-12 15:04:20 +01:00
parent d7e419874e
commit 0ce37b87bc
3 changed files with 218 additions and 10 deletions

View File

@@ -76,10 +76,10 @@ class AddressDBController extends mfBaseController {
$ort_search = $strasse_search = $plz_search = $hausnummer_search = [];
foreach($search_parts as $p) {
$p = trim($p);
$p = $this->db->escape(trim($p));
if(!$p) continue;
$ort_search[] = "ortschaft like '%$p%'";
$strasse_search[] = "strasse like '%$p%'";
$ort_search[] = "ortschaft like '$p%'";
$strasse_search[] = "strasse like '$p%'";
$plz_search[] = "plz like '%$p%'";
$hausnummer_search[] = "hausnummer like '%$p%'";
}
@@ -89,7 +89,7 @@ class AddressDBController extends mfBaseController {
$where .= " AND netzgebiet_id IN (".implode(', ',$scluster_ids).")";
}
$sql = "SELECT * FROM view_hausnummer WHERE $where AND ((".implode(" OR ", $ort_search).") OR (".implode(" OR ", $strasse_search).") OR (".implode(" OR ", $plz_search).") OR (".implode(" OR ", $hausnummer_search)."))";
$sql = "SELECT * FROM view_hausnummer WHERE $where AND ((".implode(" OR ", $ort_search).") OR (".implode(" OR ", $strasse_search).") OR (".implode(" OR ", $plz_search).") OR (".implode(" OR ", $hausnummer_search).")) ORDER BY strasse, LENGTH(hausnummer), hausnummer";
$this->log->debug($sql);
$adb = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
@@ -104,22 +104,39 @@ class AddressDBController extends mfBaseController {
while($data = $adb->fetch_object($res)) {
$address_string = $data->plz." ".$data->ortschaft.", ".$data->strasse." ".$data->hausnummer;
$sort_key = $data->plz." ".$data->ortschaft." ".$data->strasse;
$address = [];
$address['id'] = $data->hausnummer_id;
$address["text"] = $address_string;
$address['sort_key'] = $sort_key;
$addresses[] = $address;
}
// sort results by most occurences of search strings
$sort = [];
foreach($addresses as $address) {
foreach($addresses as $key => $address) {
$includes_int = false;
$count = 0;
foreach($search_parts as $p) {
$count += substr_count(strtolower($address['text']), strtolower($p));
$p = $this->db->escape(trim($p));
if(!$p) continue;
if(is_numeric(($p))) {
$includes_int = true;
if(substr_count(strtolower($address['text']), strtolower($p))) {
$count++;
}
} else {
$count += substr_count(strtolower($address['text']), strtolower($p));
}
}
unset($address['sort_key']);
//echo $address['text']." $p $count<br />\n";
if($includes_int && (($count + 1) - count($search_parts) ) < 1) {
continue;
}
if(!array_key_exists($count, $sort)) {
$sort[$count] = [];
}