From fe09e19e84b4cb3f818372d9bba1f47f478d8e28 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Wed, 14 Dec 2022 17:04:24 +0100 Subject: [PATCH] Increased (find|search)Address performance by using query instead of view --- application/AddressDB/AddressDB.php | 40 +++ application/Api/v1/AddressdbApicontroller.php | 21 +- .../liezen/addressdb_update_from_draft.php | 298 ++++++++++++++++++ 3 files changed, 352 insertions(+), 7 deletions(-) create mode 100644 scripts/addressdb/liezen/addressdb_update_from_draft.php diff --git a/application/AddressDB/AddressDB.php b/application/AddressDB/AddressDB.php index c8b46818a..41ca5ce2d 100644 --- a/application/AddressDB/AddressDB.php +++ b/application/AddressDB/AddressDB.php @@ -3,6 +3,46 @@ class AddressDB { private $db; private $log; + public static $wohneinheit_query = "select `Netzgebiet`.`id` AS `netzgebiet_id`, + `Netzgebiet`.`name` AS `netzgebiet`, + `Netzgebiet`.`extref` AS `netzgebiet_extref`, + `Gemeinde`.`id` AS `gemeinde_id`, + `Gemeinde`.`kennziffer` AS `gemeinde_kennziffer`, + `Gemeinde`.`code` AS `gemeinde_code`, + `Gemeinde`.`name` AS `gemeinde`, + `Ortschaft`.`id` AS `ortschaft_id`, + `Ortschaft`.`kennziffer` AS `ortschaft_kennziffer`, + `Ortschaft`.`name` AS `ortschaft`, + `Plz`.`plz` AS `plz`, + `Strasse`.`id` AS `strasse_id`, + `Strasse`.`kennziffer` AS `strasse_kennziffer`, + `Strasse`.`name` AS `strasse`, + `Hausnummer`.`id` AS `hausnummer_id`, + `Hausnummer`.`oaid` AS `hausnummer_oaid`, + `Hausnummer`.`hausnummer` AS `hausnummer`, + `Hausnummer`.`extref` AS `hausnummer_extref`, + `Hausnummer`.`grund_nr` AS `grund_nr`, + `Hausnummer`.`gps_lat` AS `gps_lat`, + `Hausnummer`.`gps_long` AS `gps_long`, + `Hausnummer`.`rollout` AS `rollout`, + `Hausnummer`.`rollout_info` AS `rollout_info`, + `Hausnummer`.`freigabe` AS `freigabe`, + `Wohneinheit`.`id` AS `wohneinheit_id`, + `Wohneinheit`.`oaid` AS `wohneinheit_oaid`, + `Wohneinheit`.`extref` AS `wohneinheit_extref`, + `Wohneinheit`.`num` AS `num`, + `Wohneinheit`.`block` AS `block`, + `Wohneinheit`.`stiege` AS `stiege`, + `Wohneinheit`.`stock` AS `stock`, + `Wohneinheit`.`tuer` AS `tuer`, + `Wohneinheit`.`bezeichner` AS `bezeichner`, + `Wohneinheit`.`zusatz` AS `zusatz` from `Hausnummer` + left join `Netzgebiet` on (`Hausnummer`.`netzgebiet_id` = `Netzgebiet`.`id`) + left join `Plz` on (`Plz`.`id` = `Hausnummer`.`plz_id`) + left join `Strasse` on (`Strasse`.`id` = `Hausnummer`.`strasse_id`) + left join `Ortschaft` on (`Ortschaft`.`id` = `Hausnummer`.`ortschaft_id`) + left join `Gemeinde` on (`Gemeinde`.`id` = `Strasse`.`gemeinde_id`) + left join `Wohneinheit` on (`Wohneinheit`.`hausnummer_id` = `Hausnummer`.`id`)"; public function __construct() { $this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); diff --git a/application/Api/v1/AddressdbApicontroller.php b/application/Api/v1/AddressdbApicontroller.php index 5a1184f1e..e088a7adc 100644 --- a/application/Api/v1/AddressdbApicontroller.php +++ b/application/Api/v1/AddressdbApicontroller.php @@ -317,11 +317,11 @@ class AddressdbApicontroller extends mfBaseApicontroller { if(!$p) continue; if(in_array($p,$search_parts)) continue; $search_parts[] = $p; - $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%'"; + $gem_search[] = "Gemeinde.name like '$p%'"; + $ort_search[] = "Ortschaft.name like '$p%'"; + $strasse_search[] = "Strasse.name like '$p%'"; + $plz_search[] = "Plz.plz like '$p%'"; + $hausnummer_search[] = "Hausnummer.hausnummer like '$p%'"; } $where = "1=1"; @@ -329,7 +329,10 @@ class AddressdbApicontroller extends mfBaseApicontroller { $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"; + $sql = AddressDB::$wohneinheit_query; + $sql .= "\n 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"; + + //$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); @@ -548,7 +551,11 @@ class AddressdbApicontroller extends mfBaseApicontroller { } //echo $where; //var_dump($this->filter_salescluster_ids);exit; - $sql = "SELECT * FROM view_wohneinheit WHERE $where ORDER BY plz, gemeinde, ortschaft, strasse, LENGTH(hausnummer), hausnummer, block, stiege, stock, LENGTH(num), num, LENGTH(tuer), tuer"; + + $sql = AddressDB::$wohneinheit_query; + $sql .= " WHERE $where ORDER BY plz, gemeinde, ortschaft, strasse, LENGTH(hausnummer), hausnummer, block, stiege, stock, LENGTH(num), num, LENGTH(tuer), tuer"; + + //$sql = "SELECT * FROM view_wohneinheit WHERE $where ORDER BY plz, gemeinde, ortschaft, strasse, LENGTH(hausnummer), hausnummer, block, stiege, stock, LENGTH(num), num, LENGTH(tuer), tuer"; $this->log->debug($sql); $res = $this->db()->query($sql); diff --git a/scripts/addressdb/liezen/addressdb_update_from_draft.php b/scripts/addressdb/liezen/addressdb_update_from_draft.php new file mode 100644 index 000000000..45dec7bf2 --- /dev/null +++ b/scripts/addressdb/liezen/addressdb_update_from_draft.php @@ -0,0 +1,298 @@ +#!/usr/bin/php +loadByExtref($netzgebiet_code); + if(!$netzgebiet->id) { + // create Netzgebiet + $netzgebiet_data = [ + 'name' => "$netzgebiet_name_main - $netzgebiet_subname", + 'extref' => $netzgebiet_code, + 'source' => "csv", + 'source_id' => $csvname + ]; + $netzgebiet = ADBNetzgebietModel::create($netzgebiet_data); + $netzgebiet_id = $netzgebiet->save(); + if(!$netzgebiet_id) { + die("Error creating Netzgebiet!\n"); + } + } + + //var_dump($netzgebiet);exit; + + $nutzung = trim($csv[10]); + + //$unit_count = $csv[10]; + //if(!$unit_count) $unit_count = 1; + + //if(!$strasse_hausnummer) continue; + + if(!strlen($hausnummer_string) || !strlen($strasse_name)) { + die("!! Hausnummer oder Strasse leer (adrcd $adrcd)\n"); + } + + if(!$gem_name || !$plz_string || !$ort_name || !$strasse_name) { + die("!! Konnte Adresse nicht parsen\n"); + } + + if(!$hausnummer_extref) { + die("!!! Keine Hausnummer Extref\n"); + } + + if(!$netzgebiet_extref) { + die("!!! Keine Netzgebiet Extref\n"); + } + + $gemeinde = ADBGemeindeModel::getFirst(['kennziffer' => $gem_kz]); + if(!$gemeinde) { + die("Gemeinde ($gem_kz, $gem_name) nicht in addressdb gefunden\n"); + } + + // check for GemeindeNetzgebiet + checkGemeindeNetzgebiet($gemeinde, $netzgebiet); + //continue; + $strasse = ADBStrasseModel::getFirst(['kennziffer' => $skz]); + if(!$strasse) { + die("Strasse ($skz, $strasse_name) nicht in addressdb gefunden\n"); + } + /*$ortschaft = ADBOrtschaftModel::getFirst(['kennziffer' => $ort_kz]); + if(!$ortschaft) { + die("Ortschaft ($ort_kz, $ort_name) nicht in addressdb gefunden\n"); + }*/ + + $ortschaft = ADBOrtschaftModel::getFirst(['gemeinde_id' => $gemeinde->id, 'name' => $ort_name]); + if(!$ortschaft) { + die("Ortschaft (gemeinde $gem_name ($gem_kz), $ort_name) nicht in addressdb gefunden\n"); + } + + $plz = ADBPlzModel::getFirst(['gemeinde_id' => $gemeinde->id, 'plz' => $plz_string]); + if(!$plz) { + echo "PLZ $plz_string in Gemeinde $gemeinde_name nicht gefunden. Wird angelegt.\n"; + $plz_data = [ + 'gemeinde_id' => $gemeinde->id, + 'plz' => $plz_string, + 'plz_string' => $plz_string + ]; + $plz = ADBPlzModel::create($plz_data); + $plz_id = $plz->save(); + if(!$plz_id) { + var_dump($plz); + die("Error creating PLZ\n"); + } + } + + if(is_numeric($rollout_time)) { + $rollout = $rollout_time; + $rollout_info = null; + $freigabe = $freigabe_default; + } elseif($rollout_time == "2024/2025") { + $rollout = null; + $rollout_info = "2024/2025"; + $freigabe = json_encode(['reorder']); + } else { + $rollout = null; + $rollout_info = "unscheduled"; + $freigabe = json_encode([]); + } + + //$hausnummer = ADBHausnummerModel::getFirst(['gemeind_id' => $gemeinde->id, 'strasse_id' => $strasse->id, 'hausnummer' => $hausnummer_string]); + $hausnummer = ADBHausnummerModel::getFirst(['adrcd' => $adrcd]); + if(!$hausnummer) { + $hausnummer_data = [ + 'adrcd' => $adrcd, + 'netzgebiet_id' => $netzgebiet->id, + 'extref' => $adrcd, + 'ortschaft_id' => $ortschaft->id, + 'plz_id' => $plz->id, + 'strasse_id' => $strasse->id, + 'hausnummer' => $hausnummer_string, + 'grund_nr' => $grundstueck_name, + 'rollout' => $rollout, + 'rollout_info' => $rollout_info, + 'freigabe' => $freigabe + ]; + $hausnummer = ADBHausnummerModel::create($hausnummer_data); + //var_dump($hausnummer);exit; + if(!$hausnummer->save()) { + var_dump($hausnummer_data); + die("Konnte Hausnummer nicht anlegen\n"); + } + if(!$hausnummer->oaid) { + $hausnummer->oaid = $hausnummer->getNewOAID(); + if(!$hausnummer->oaid) { + die("Error generating OAID for hausnummer ".$hausnummer->id); + } + $hausnummer->save(); + } + $c++; + } else { + $hausnummer->netzgebiet_id = $netzgebiet->id; + $hausnummer->extref = $adrcd; + $hausnummer->grund_nr = $grundstueck_name; + $hausnummer->rollout = $rollout; + $hausnummer->rollout_info = $rollout_info; + $hausnummer->freigabe = $freigabe; + if(!$hausnummer->oaid) { + $hausnummer->oaid = $hausnummer->getNewOAID(); + if(!$hausnummer->oaid) { + die("Error generating OAID for hausnummer ".$hausnummer->id); + } + } + if(!$hausnummer->save()) { + var_dump($hausnummer); + die("Konnte Hausnummer nicht speichern\n"); + } + $u++; + } + + // get count of ccurnt wohneinheiten + $existing_units_count = ADBWohneinheitModel::count(['hausnummer_id' => $hausnummer->id]); + $new_units_count = $unit_count - $existing_units_count; + $last_unit_num = 0; + + + //if($new_units_count) { + foreach(ADBWohneinheitModel::search(['hausnummer_id' => $hausnummer->id]) as $tmp_unit) { + if(!$tmp_unit->oaid) { + // generate missing oaid + $tmp_unit->oaid = $tmp_unit->getNewOAID(); + if(!$tmp_unit->oaid) { + die("Error generating OAID for wohneinheit ".$tmp_unit->id); + } + $tmp_unit->save(); + } + + if($tmp_unit->num > $last_unit_num) { + $last_unit_num = $tmp_unit->num; + } + } + //} + + // create wohneinheiten + for($i = 1; $i <= $new_units_count; $i++) { + $num = $last_unit_num + $i; + //echo "$existing_units_count create wohneinheit $num\n"; + $unit_data = [ + 'hausnummer_id' => $hausnummer->id, + 'num' => $num, + ]; + $wohneinheit = ADBWohneinheitModel::create($unit_data); + $wohneinheit_id = $wohneinheit->save(); + if(!$wohneinheit_id) { + die("Cannot save Wohneinheit\n"); + } + $wohneinheit->oaid = $wohneinheit->getNewOAID(); + if(!$wohneinheit->oaid) { + die("Error generating OAID for wohneinheit ".$wohneinheit->id); + } + $wohneinheit->save(); + $w++; + } + +} + +echo "$l lines processed, $c created, $u updated\n"; +echo "$w Wohneinheiten erstellt\n"; + + +function checkGemeindeNetzgebiet($gemeinde, $netzgebiet) { + global $db; + + $sql = "SELECT * FROM GemeindeNetzgebiet WHERE gemeinde_id=".$gemeinde->id." AND netzgebiet_id=".$netzgebiet->id; + $res = $db->query($sql); + if($db->num_rows($res)) { + return true; + } + + $sql = "INSERT INTO GemeindeNetzgebiet (gemeinde_id, netzgebiet_id, `create`, `edit`) VALUES (".$gemeinde->id.", ".$netzgebiet->id.", UNIX_TIMESTAMP(), UNIX_TIMESTAMP())"; + if(!$db->query($sql)) { + die("SQL Query failed: $sql\n ".$db->getLastError()); + } + + return true; +} \ No newline at end of file