Increased (find|search)Address performance by using query instead of
view
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
298
scripts/addressdb/liezen/addressdb_update_from_draft.php
Normal file
298
scripts/addressdb/liezen/addressdb_update_from_draft.php
Normal file
@@ -0,0 +1,298 @@
|
||||
#!/usr/bin/php
|
||||
<?php
|
||||
|
||||
//require 'vendor/autoload.php';
|
||||
require("../../../config/config.php");
|
||||
|
||||
define('FRONKDB_SQLDEBUG',false);
|
||||
error_reporting(E_ALL & ~(E_NOTICE | E_STRICT | E_DEPRECATED));
|
||||
|
||||
require_once(LIBDIR."/mvcfronk/mfRouter/mfRouter.php");
|
||||
require_once(LIBDIR."/mvcfronk/mfBase/mfBaseModel.php");
|
||||
require_once(LIBDIR."/mvcfronk/mfBase/mfBaseController.php");
|
||||
|
||||
|
||||
$netzgebiet_name_main = "Liezen";
|
||||
$freigabe_default = json_encode(["order", "reorder"]);
|
||||
|
||||
|
||||
$me = new User(1);
|
||||
|
||||
$folder = __DIR__."/import/";
|
||||
$csvname = "Adressendatensatz_BP2023_20221201.csv";
|
||||
$filename = $folder.$csvname;
|
||||
|
||||
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
||||
$log = mfLoghandler::singleton();
|
||||
|
||||
$input = fopen($filename, "r");
|
||||
|
||||
$h_extrefs = [];
|
||||
|
||||
$l = 0;
|
||||
$c = 0;
|
||||
$u = 0;
|
||||
$w = 0;
|
||||
while($csv = fgetcsv($input, 0, ";")) {
|
||||
$l++;
|
||||
if($l == 1) continue;
|
||||
|
||||
$hausnummer = false;
|
||||
|
||||
if(!trim($csv[0])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$adrcd = trim($csv[0]);
|
||||
$gem_kz = trim($csv[2]);
|
||||
$gem_name = trim($csv[3]);
|
||||
$ort_kz = trim($csv[5]);
|
||||
$plz_string = trim($csv[4]);
|
||||
$ort_name = trim($csv[6]);
|
||||
$skz = trim($csv[7]);
|
||||
$strasse_name = trim($csv[8]);
|
||||
$hausnummer_string = trim($csv[9]);
|
||||
$hausnummer_extref = trim($csv[0]);
|
||||
if(in_array($hausnummer_extref, $h_extrefs)) {
|
||||
die("Hausnummer extref doppelt! $hausnummer_extref\n");
|
||||
}
|
||||
$h_extrefs[] = $hausnummer_extref;
|
||||
|
||||
//$lat = str_replace(",",".",trim($csv[7]));
|
||||
//$long = str_replace(",",".",trim($csv[8]));
|
||||
|
||||
$rollout_time = trim($csv[12]);
|
||||
$grundstueck_name = trim($csv[14]);
|
||||
if(!$grundstueck_name) $grundstueck_name = null;
|
||||
|
||||
$unit_count = trim($csv[15]);
|
||||
if(!$unit_count) $unit_count = 1;
|
||||
|
||||
$netzgebiet_extref = trim($csv[11]);
|
||||
if(!$netzgebiet_extref) continue;
|
||||
|
||||
if($netzgebiet_extref == "Subcluster-Ardning") {
|
||||
$netzgebiet_code = "Subcluster-Ardning";
|
||||
$netzgebiet_subname = "Subcluster-Ardning";
|
||||
} else {
|
||||
// get code and name
|
||||
$netzgebiet_name_parts = explode(", ",$netzgebiet_extref);
|
||||
if(count($netzgebiet_name_parts) < 2) {
|
||||
die("Netzgebiet Code und Subname können nicht extrahiert werden.\n");
|
||||
}
|
||||
|
||||
$netzgebiet_code = $netzgebiet_name_parts[0];
|
||||
$netzgebiet_subname = $netzgebiet_name_parts[1];
|
||||
}
|
||||
|
||||
// find netzgebiet
|
||||
$netzgebiet = new ADBNetzgebiet();
|
||||
$netzgebiet->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;
|
||||
}
|
||||
Reference in New Issue
Block a user