Added /addressdb/searchAddress api endpoint
This commit is contained in:
@@ -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] = [];
|
||||
}
|
||||
|
||||
@@ -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'];
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user