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] = [];
}

View File

@@ -13,6 +13,8 @@ class AddressdbApicontroller extends mfBaseApicontroller {
$this->addRoute("/addressdb/findAddress", "find", "GET");
$this->addRoute("/addressdb/findAddress", "find", "POST");
$this->addRoute("/addressdb/searchAddress", "search", "GET");
$this->addRoute("/addressdb/searchAddress", "search", "POST");
$this->addRoute("/addressdb/findStreet", "findStreet", "GET");
$this->addRoute("/addressdb/findStreet", "findStreet", "POST");
$this->addRoute("/addressdb/findZip", "findZip", "GET");
@@ -288,6 +290,191 @@ class AddressdbApicontroller extends mfBaseApicontroller {
return mfResponse::Ok(['streets' => array_values($streets)]);
}
protected function search() {
$get = array_merge($this->post, $this->get);
$search = $this->db()->escape(trim($get['search']));
$format = "flat";
if($get['format'] == "tree") {
$format = "tree";
}
if(!$search) {
return mfResponse::BadRequest(['message' => "Search string cannot be empty"]);
}
if($search == "%") {
return mfResponse::BadRequest(['message' => "Search string cannot be empty"]);
}
$search_parts = explode(" ", $search);
$ort_search = $strasse_search = $plz_search = $hausnummer_search = [];
foreach($search_parts as $p) {
$p = $this->db()->escape(trim($p));
if(!$p) continue;
$gem_search[] = "gemeinde like '$p%'";
$ort_search[] = "ortschaft like '$p%'";
$strasse_search[] = "strasse like '$p%'";
$plz_search[] = "plz like '%$p%'";
$hausnummer_search[] = "hausnummer like '%$p%'";
}
$where = "1=1";
if(count($this->filter_salescluster_ids)) {
$where .= " AND netzgebiet_id IN (".implode(",", $this->filter_salescluster_ids).")";
}
$sql = "SELECT * FROM view_wohneinheit 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, LENGTH(tuer),tuer, zusatz, LENGTH(num), num";
$this->log->debug($sql);
$res = $this->db()->query($sql);
if($this->db()->num_rows($res)) {
$tmp_addresses = [];
while($data = $this->db()->fetch_object($res)) {
$address_key = $data->hausnummer_id;
if($this->hausnummer_add_zusatz) {
$address_key = $data->hausnummer_id."-".$data->zusatz;
}
$sort_key = $data->plz." ".$data->ortschaft." ".$data->strasse." ".$data->hausnummer." ".$data->zusatz;
if(!array_key_exists($address_key, $tmp_addresses)) {
// get allowed preorderTypes
$ptypes = [];
if($data->freigabe) {
$freigaben = json_decode($data->freigabe);
if(is_array($freigaben) && count($freigaben)) {
foreach($freigaben as $freigabe) {
if(in_array($freigabe, $this->allowed_preordertypes)) {
$ptypes[] = $freigabe;
}
}
}
}
$housenumber = $data->hausnummer;
if($this->hausnummer_add_zusatz) {
if($data->zusatz) {
$housenumber .= " (".$data->zusatz.")";
}
}
$tmp_addresses[$address_key] = [
'sort_key' => $sort_key,
'oaid' => $data->hausnummer_oaid,
'zip' => $data->plz,
'city' => ($this->district_is_city) ? $data->ortschaft : $data->gemeinde,
'district' => $data->ortschaft,
'street' => $data->strasse,
'housenumber' => $housenumber,
'lot_number' => $data->grund_nr,
'building_unit_count' => 0,
'gps_lat' => ($data->gps_lat) ? (float)$data->gps_lat : null,
'gps_long' => ($data->gps_long) ? (float)$data->gps_long : null,
'rollout_year' => ($data->rollout) ? (int)$data->rollout : null,
'rollout_info' => $data->rollout_info,
'preorderTypes' => $ptypes,
'units' => []
];
}
$tmp_addresses[$address_key]['units'][] = [
'oaid' => $data->wohneinheit_oaid,
'num' => (int)$data->num,
'block' => $data->block,
'stiege' => $data->stiege,
'stock' => $data->stock,
'tuer' => $data->tuer,
'zusatz' => $data->zusatz,
];
$tmp_addresses[$address_key]['building_unit_count']++;
}
// sort found addresses by count of found keywords
// if there is an int we don't want to show more than one street
$sorted_addresses = [];
foreach($tmp_addresses as $temp_add) {
$includes_int = false;
$count = 0;
foreach($search_parts as $p) {
$p = $this->db->escape(trim($p));
if(strlen($p) === 0) continue;
if(is_numeric(($p))) {
$includes_int = true;
if(substr_count(strtolower($temp_add['sort_key']), strtolower($p))) {
$count++;
}
} else {
$count += substr_count(strtolower($temp_add['sort_key']), strtolower($p));
}
}
unset($temp_add['sort_key']);
//echo $address['text']." $p $count<br />\n";
if($includes_int && (($count + 1) - count($search_parts) ) < 1) {
continue;
}
if(!array_key_exists($count, $sorted_addresses)) {
$sorted_addresses[$count] = [];
}
$sorted_addresses[$count][] = $temp_add;
}
ksort($sorted_addresses, SORT_NUMERIC);
$sorted_addresses = array_reverse($sorted_addresses, true);
// sort / format
if($format == "tree") {
foreach($sorted_addresses as $counted_addresses) {
foreach($counted_addresses as $cadd) {
$addresses[] = $cadd;
}
}
//var_dump($addresses);exit;
//$addresses = array_values($sorted_addresses);
if(!$addresses) $addresses = [];
} else {
foreach($sorted_addresses as $counted_addresses) {
foreach($counted_addresses as $ta) {
foreach($ta['units'] as $u) {
$new_address = [];
$new_address['oaid'] = $u['oaid'];
$new_address['building_oaid'] = $ta['oaid'];
$new_address['street'] = $ta['street'];
$new_address['housenumber'] = $ta['housenumber'];
$new_address['zip'] = $ta['zip'];
$new_address['city'] = $ta['city'];
$new_address['district'] = $ta['district'];
$new_address['lot_number'] = $ta['lot_number'];
$new_address['building_unit_count'] = $ta['building_unit_count'];
$new_address['num'] = $u['num'];
$new_address['block'] = $u['block'];
$new_address['stiege'] = $u['stiege'];
$new_address['stock'] = $u['stock'];
$new_address['tuer'] = $u['tuer'];
$new_address['zusatz'] = $u['zusatz'];
$new_address['gps_lat'] = $ta['gps_lat'];
$new_address['gps_long'] = $ta['gps_long'];
$new_address['rollout_year'] = $ta['rollout_year'];
$new_address['rollout_info'] = $ta['rollout_info'];
$new_address['preorderTypes'] = $ta['preorderTypes'];
$addresses[] = $new_address;
}
}
}
}
}
return mfResponse::Ok(['addresses' => $addresses]);
}
protected function find() {
// unofficially supporting GET and POST in v1
$get = array_merge($this->post, $this->get);
@@ -343,7 +530,10 @@ class AddressdbApicontroller extends mfBaseApicontroller {
if($this->db()->num_rows($res)) {
$tmp_addresses = [];
while($data = $this->db()->fetch_object($res)) {
$address_key = $data->hausnummer_id."-".$data->zusatz;
$address_key = $data->hausnummer_id;
if($this->hausnummer_add_zusatz) {
$address_key = $data->hausnummer_id."-".$data->zusatz;
}
if(!array_key_exists($address_key, $tmp_addresses)) {
// get allowed preorderTypes
@@ -375,8 +565,8 @@ class AddressdbApicontroller extends mfBaseApicontroller {
'housenumber' => $housenumber,
'lot_number' => $data->grund_nr,
'building_unit_count' => 0,
'gps_lat' => (float)$data->gps_lat,
'gps_long' => (float)$data->gps_long,
'gps_lat' => ($data->gps_lat) ? (float)$data->gps_lat : null,
'gps_long' => ($data->gps_long) ? (float)$data->gps_long : null,
'rollout_year' => ($data->rollout) ? (int)$data->rollout : null,
'rollout_info' => $data->rollout_info,
'preorderTypes' => $ptypes,
@@ -406,7 +596,7 @@ class AddressdbApicontroller extends mfBaseApicontroller {
foreach($ta['units'] as $u) {
$new_address = [];
$new_address['oaid'] = $u['oaid'];
$new_address['buildin_oaid'] = $ta['oaid'];
$new_address['building_oaid'] = $ta['oaid'];
$new_address['street'] = $ta['street'];
$new_address['housenumber'] = $ta['housenumber'];
$new_address['zip'] = $ta['zip'];

View File

@@ -324,6 +324,7 @@ class PreorderApicontroller extends mfBaseApicontroller {
if($unit) {
$preorder_data['adb_wohneinheit_id'] = $unit->wohneinheit_id;
$preorder_data['oaid'] = $unit->wohneinheit_oaid;
}
if($address_info) {
$preorder_data['address_info'] = $address_info;