From e8de3058b5ff4c1fd073174b767a4c45cd364779 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Tue, 17 Jan 2023 15:04:47 +0100 Subject: [PATCH] Added AddressDB/Export; ADBHausnummer::unit_count is now recalculated whenever a Wohneinheit is saved --- Layout/default/AddressDB/export.csv.php | 7 ++--- .../ADBHausnummer/ADBHausnummerModel.php | 1 + application/ADBWohneinheit/ADBWohneinheit.php | 14 ++++++++++ .../ADBWohneinheit/ADBWohneinheitModel.php | 11 ++++++-- application/AddressDB/AddressDBController.php | 2 ++ .../update_hausnummer_unit_count.php | 28 +++++++++++++++++++ 6 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 scripts/addressdb/update_hausnummer_unit_count.php diff --git a/Layout/default/AddressDB/export.csv.php b/Layout/default/AddressDB/export.csv.php index 2b1fc54a1..6c3b197e3 100644 --- a/Layout/default/AddressDB/export.csv.php +++ b/Layout/default/AddressDB/export.csv.php @@ -3,7 +3,7 @@ ob_end_flush(); header("Content-type: text/csv"); header('Content-disposition: attachment; filename="addressdb-export-'.date('Y-m-d_H-i-s').'.csv"'); ?> -AddressDB_ID;Extref;Adrcd;OAID;Neztgebiet_Extref;Netzgebiet;GKZ;Gemeinde;OKZ;Ortschaft;SKZ;Strasse;PLZ;Hausnummer;Grundstueck;GPS Breite; GPS Laenge;Rollout;Rollout_Info;Freigabe;Nutzungseinheiten +AddressDB_ID;Extref;Adrcd;OAID;Netzgebiet_Extref;Netzgebiet;GKZ;Gemeinde;OKZ;Ortschaft;PLZ;SKZ;Strasse;Hausnummer;Grundstueck;GPS Breite; GPS Laenge;Rollout;Rollout_Info;Freigabe;Nutzungseinheiten $data->id]); - //$unit_count = 1; + $unit_count = $data->unit_count; ?> -id?>;"extref?>";adrcd?>;"oaid?>";"extref?>";"name?>";kennziffer?>;"name?>";kennziffer?>;"name?>";kennziffer?>;"name?>";"plz?>";"hausnummer?>";"grund_nr?>";gps_lat?>;gps_long?>;rollout?>;"rollout_info?>";"";; +id?>;"extref?>";adrcd?>;"oaid?>";"extref?>";"name?>";kennziffer?>;"name?>";kennziffer?>;"name?>";"plz?>";kennziffer?>;"name?>";"hausnummer?>";"grund_nr?>";gps_lat?>;gps_long?>;rollout?>;"rollout_info?>";"";; query($sql); if($db->num_rows($res)) { + // hack for AddressDBController::exportAction if($returnDBRessource) { return $res; } diff --git a/application/ADBWohneinheit/ADBWohneinheit.php b/application/ADBWohneinheit/ADBWohneinheit.php index af597a8f7..24511f435 100644 --- a/application/ADBWohneinheit/ADBWohneinheit.php +++ b/application/ADBWohneinheit/ADBWohneinheit.php @@ -8,6 +8,20 @@ class ADBWohneinheit extends mfBaseModel { $this->table = "Wohneinheit"; } + protected function afterSave() { + if(!$this->id) return true; + if(!$this->hausnummer_id) return true; + + if(!defined("ADBWohneinheit_onSave_noAutoUnitCount") || !ADBWohneinheit_onSave_noAutoUnitCount) { + $unit_count = ADBWohneinheitModel::count(['hausnummer_id' => $this->hausnummer_id]); + $hausnummer = $this->getProperty("hausnummer"); + if($hausnummer->id) { + $hausnummer->unit_count = $unit_count; + $hausnummer->save(); + } + } + } + public static function parseHausnummerZusatz($text) { $data = []; diff --git a/application/ADBWohneinheit/ADBWohneinheitModel.php b/application/ADBWohneinheit/ADBWohneinheitModel.php index 382708e2d..612b251ea 100644 --- a/application/ADBWohneinheit/ADBWohneinheitModel.php +++ b/application/ADBWohneinheit/ADBWohneinheitModel.php @@ -47,7 +47,14 @@ class ADBWohneinheitModel { $db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); $where = self::getSqlFilter($filter); - $res = $db->select("Wohneinheit", "*", "$where ORDER BY hausnummer_id,block,stiege,LENGTH(stock),stock,LENGTH(tuer),tuer LIMIT 1"); + $sql = "SELECT Wohneinheit.* FROM Wohneinheit + LEFT JOIN Hausnummer ON (Hausnummer.id = Wohneinheit.hausnummer_id) + WHERE $where + GROUP BY Wohneinheit.id + ORDER BY hausnummer_id,block,stiege,LENGTH(stock),stock,LENGTH(tuer),tuer,num + LIMIT 1"; + + $res = $db->query($sql); if($db->num_rows($res)) { $data = $db->fetch_object($res); $item = new ADBWohneinheit($data); @@ -65,7 +72,7 @@ class ADBWohneinheitModel { $db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); - $res = $db->select("Wohneinheit", "*", "1=1 ORDER BY hausnummer_id,block,stiege,LENGTH(stock),stock,LENGTH(tuer),tuer"); + $res = $db->select("Wohneinheit", "*", "1=1 ORDER BY hausnummer_id,block,stiege,LENGTH(stock),stock,LENGTH(tuer),tuer,num"); if($db->num_rows($res)) { while($data = $db->fetch_object($res)) { $items[] = new ADBWohneinheit($data); diff --git a/application/AddressDB/AddressDBController.php b/application/AddressDB/AddressDBController.php index 5e4041ae0..9fb85ea69 100644 --- a/application/AddressDB/AddressDBController.php +++ b/application/AddressDB/AddressDBController.php @@ -364,6 +364,8 @@ class AddressDBController extends mfBaseController { $addressdb_filter['netzgebiet_id'] = $netzgebiet_ids; } + // Get mysqli resource from Model so layout can output data as it's retrieved + // Fixes lousy performance and horrendous memory usage $res = ADBHausnummerModel::search($addressdb_filter, [], true); $this->layout()->setTemplate("AddressDB/export.csv"); diff --git a/scripts/addressdb/update_hausnummer_unit_count.php b/scripts/addressdb/update_hausnummer_unit_count.php new file mode 100644 index 000000000..892fab0a1 --- /dev/null +++ b/scripts/addressdb/update_hausnummer_unit_count.php @@ -0,0 +1,28 @@ +#!/usr/bin/php +hausnummer_id); + if($hausnummer->id) { + $unit_count = ADBWohneinheitModel::count(['hausnummer_id' => $unit->hausnummer_id]); + $hausnummer->unit_count = $unit_count; + if(!$hausnummer->save()) { + echo "error saving hausnummer ".$hausnummer->id."\n"; + } + $i++; + } +} + +echo "Updated $i Wohneinheiten\n";