increased performance of bev import script

This commit is contained in:
Frank Schubert
2022-11-10 16:17:08 +01:00
parent 002371ee97
commit 0764e87790
2 changed files with 173 additions and 67 deletions

View File

@@ -22,13 +22,15 @@ $folder = BASEDIR."/scripts/addressdb/import/bev";
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
$log = mfLoghandler::singleton();
$db->query("SET autocommit=0");
/*
* Import Gemeinden
*/
$filename = "$folder/GEMEINDE.csv";
$input = fopen($filename, "r");
/*
$i = 0;
while($csv = fgetcsv($input, 0, ";")) {
$i++;
@@ -59,11 +61,11 @@ while($csv = fgetcsv($input, 0, ";")) {
}
echo ($i-1)." Gemeinden importiert\n";
*/
/*
* Import Ortschaften
*/
/*
$filename = "$folder/ORTSCHAFT.csv";
$input = fopen($filename, "r");
@@ -101,11 +103,11 @@ while($csv = fgetcsv($input, 0, ";")) {
}
echo ($i-1)." Ortschaften importiert\n";
*/
/*
* Import Strassen
*/
/*
$filename = "$folder/STRASSE.csv";
$input = fopen($filename, "r");
@@ -226,11 +228,14 @@ while($csv = fgetcsv($input, 0, ";")) {
}
echo "\n".($i-1)." Straßen importiert\n";
*/
$filename = "$folder/ADRESSE.csv";
$input = fopen($filename, "r");
$current_skz = false;
$current_gkz = false;
$sdata = [];
$i = 0;
while($csv = fgetcsv($input, 0, ";")) {
$i++;
@@ -248,6 +253,8 @@ while($csv = fgetcsv($input, 0, ";")) {
continue;
}
$adrcd = trim($csv[0]);
$gkz = trim($csv[1]);
$okz = trim($csv[2]);
@@ -260,76 +267,167 @@ while($csv = fgetcsv($input, 0, ";")) {
$hnz2 = trim($csv[10]);
$hnb2 = trim($csv[11]);
if(!$skz) continue;
$gemeinde = getGemeinde($gkz);
if(!$gemeinde) {
die("Kann Adresse nicht importieren: Gemeinde nicht gefunden ($gkz)\n");
}
$ortschaft = getOrtschaft($okz);
if(!$ortschaft) {
die("Kann Adresse nicht importieren: Ortschaft nicht gefunden ($okz)\n");
}
$strasse = getStrasse($skz);
if(!$strasse) {
die("Kann Adresse nicht importieren: Strasse nicht gefunden ($okz)\n");
}
//$plz = ADBPlzModel::getFirst(['gemeinde_id' => $gemeinde->id, "plz" => $plz_string]);
$plz = getPlz($plz_string, $gemeinde->id);
if(!$plz) {
$plz = ADBPlzModel::create([
"gemeinde_id" => $gemeinde->id,
"plz" => $plz_string,
"plzstring" => $plz_string
]);
if(!$plz->save()) {
die("Cannot create PLZ $plz_string (gemeinde ".$gemeinde->id.")\n");
}
}
$hausnummer_string = makeHausnummer($hnz1, $hnz2, $hnv, $hnb1, $hnb2);
if(!$hausnummer_string) {
continue;
//die("Keine Hausnummer: adrcd $adrcd, gkz $gkz, okz $okz, skz $skz, $hnz1, $hnb1, $hnv, $hnz2, $hnb2\n");
}
$hausnummer = ADBHausnummerModel::getFirst([
'ortschaft_id' => $ortschaft->id,
//'plz_id' => $plz->id,
'strasse_id' => $strasse->id,
'hausnummer' => $hausnummer_string
]);
if($hausnummer) {
// update plz if necessary
//var_dump($hausnummer->plz);exit;
if($hausnummer->plz->plz != $plz->plz ) {
echo "Updating PLZ from ".$hausnummer->plz->plz." to ".$plz->plz."\n";
$hausnummer->plz_id = $plz->id;
$hausnummer->save();
}
} else {
// create new Hausnummer
$hausnummer = ADBHausnummerModel::create([
"netzgebiet_id" => 0,
"ortschaft_id" => $ortschaft->id,
"plz_id" => $plz->id,
"strasse_id" => $strasse->id,
if($skz == $current_skz) {
$sdata[(string)$hausnummer_string] = [
"adrcd" => $adrcd,
"gkz" => $gkz,
"okz" => $okz,
"plz" => $plz_string,
"skz" => $skz,
"hausnummer" => $hausnummer_string
]);
if(!$hausnummer->save()) {
die("Error creating Hausnummer: ".print_r($hausnummer, true));
}
];
continue;
}
if($current_skz) {
//var_dump($sdata);exit;
$gemeinde = getGemeinde($current_gkz);
if(!$gemeinde) {
die("Kann Adresse nicht importieren: Gemeinde nicht gefunden ($gkz)\n");
}
$strasse = getStrasse($current_skz);
if(!$strasse) {
die("Kann Adresse nicht importieren: Strasse nicht gefunden ($okz)\n");
}
// do database work for all sdata
$hausnummern_filter = [];
foreach($sdata as $s) {
$plz = getPlz($s["plz"], $gemeinde->id);
if(!$plz) {
//echo "Creating PLZ ".$s["plz"]."\n";
$plz = ADBPlzModel::create([
"gemeinde_id" => $gemeinde->id,
"plz" => $s["plz"],
"plzstring" => $s["plz"]
]);
if(!$plz->save()) {
die("Cannot create PLZ $plz_string (gemeinde ".$gemeinde->id.")\n");
}
}
$hausnummern_filter[] = $s['hausnummer'];
}
$hausnummern = ADBHausnummerModel::search(["strasse_id" => $strasse->id, "hausnummer" => $hausnummern_filter]);
$new_hausnummern = [];
foreach($sdata as $shausnummer => $s) {
$found = false;
foreach($hausnummern as $h) {
if($h->hausnummer == $shausnummer) {
//exists already
$found = true;
// check to update plz
if($h->plz->plz != $s['plz'] ) {
echo "Updating PLZ for Hausnummer ".$h->id." from ".$h->plz->plz." to ".$s["plz"]."\n";
$plz = getPlz($s['plz'], $gemeinde->id);
$h->plz_id = $plz->id;
$h->save();
}
}
}
if(!$found) {
$new_hausnummern[$shausnummer] = $s;
}
}
if(count($new_hausnummern)) {
$insert = "INSERT INTO `Hausnummer` (`netzgebiet_id`, `adrcd`, `ortschaft_id`, `plz_id`, `strasse_id`, `hausnummer`, `create`, `edit`) VALUES ";
foreach($new_hausnummern as $h_string => $s) {
//var_dump($h_string, $s);exit;
//$h_string = $h->hausnummer;
//$s = $sdata[$h_string];
$adrcd = $s["adrcd"];
$strasse_id = $strasse->id;
$plz = getPlz($s['plz'],$gemeinde->id);
if(!$plz) {
var_dump($s);exit;
}
$plz_id = $plz->id;
$ortschaft = getOrtschaft($s["okz"]);
if(!$ortschaft) {
die("Kann Adresse nicht importieren: Ortschaft nicht gefunden (strasse: hausnummer: $h_string, okz: ".$sdata[$h_string]["okz"].")\n");
}
$ortschaft_id = $ortschaft->id;
// add to INSERT statement
$insert .= "(0, '$adrcd', $ortschaft_id, $plz_id, $strasse_id,'$h_string', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),";
}
$insert = preg_replace('/,$/', "", $insert);
//echo "$insert\n";
$db->query($insert);
}
/*
$hausnummer = ADBHausnummerModel::getFirst([
'ortschaft_id' => $ortschaft->id,
//'plz_id' => $plz->id,
'strasse_id' => $strasse->id,
'hausnummer' => $hausnummer_string
]);
if($hausnummer) {
// update plz if necessary
//var_dump($hausnummer->plz);exit;
if($hausnummer->plz->plz != $plz->plz ) {
echo "Updating PLZ from ".$hausnummer->plz->plz." to ".$plz->plz."\n";
$hausnummer->plz_id = $plz->id;
$hausnummer->save();
}
} else {
// create new Hausnummer
$hausnummer = ADBHausnummerModel::create([
"netzgebiet_id" => 0,
"ortschaft_id" => $ortschaft->id,
"plz_id" => $plz->id,
"strasse_id" => $strasse->id,
"hausnummer" => $hausnummer_string
]);
if(!$hausnummer->save()) {
die("Error creating Hausnummer: ".print_r($hausnummer, true));
}
}
*/
}
$current_skz = $skz;
$current_gkz = $gkz;
$sdata = [];
$sdata[(string)$hausnummer_string] = [
"adrcd" => $adrcd,
"gkz" => $gkz,
"okz" => $okz,
"plz" => $plz_string,
"skz" => $skz,
"hausnummer" => $hausnummer_string
];
}
$db->query("COMMIT");
function makeHausnummer($z1 = false, $z2 = false, $v = false, $b1 = false, $b2 = false) {
$h = "";
@@ -368,6 +466,7 @@ function getGemeinde($kz) {
return $gemeinde;
}
function getOrtschaft($kz) {
global $ortschaft_cache;
@@ -383,6 +482,7 @@ function getOrtschaft($kz) {
return $ortschaft;
}
function getStrasse($kz) {
global $strasse_cache;
@@ -398,6 +498,7 @@ function getStrasse($kz) {
return $strasse;
}
function getPlz($plz_search, $gemeinde_id) {
global $plz_cache;