New file |
0,0 → 1,190 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Réalise la migration des obs du référentiel bdnff vers le référentie bdtfx |
* |
* @category php 5.2 |
* @package Cel/Scripts |
* @author Aurelien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class MigrationReferentiel { |
|
private $bdd = null; |
private $script = null; |
|
private $table_eflore = 'tb_eflore.bdtfx_v1_01'; |
private $table_cel = 'tb_cel.cel_obs'; |
private $correspondance_nn_sel_nn_ret = null; |
private $infos_noms = array(); |
|
private $obs_sans_nn = array(); |
private $obs_a_modifier = array(); |
private $modif_douteuses = array(); |
private $modif_familles = 0; |
|
private $chemin_log = '/home/telabotap/www/tmp/migration_noms_log.csv'; |
private $fp = null; |
|
public function __construct(Conteneur $conteneur) { |
$this->bdd = $conteneur->getBdd(); |
$this->script = $conteneur->getScript(); |
$this->initialiserLog(); |
} |
|
public function executer($arguments) { |
if (isset($arguments[0]) == false) { |
throw new Exception("Veuillez indiquer l'action à réaliser en paramètre.", E_USER_ERROR); |
} |
$action = $arguments[0]; |
switch ($action) { |
case 'migration_referentiel' : |
$this->migrerReferentiel(); |
break; |
} |
fclose($this->fp); |
} |
|
private function migrerReferentiel() { |
|
echo "-------------------------------------------------------------------\n"; |
echo " ETAPE 1. Paramétrage ... \n"; |
echo "-------------------------------------------------------------------\n"; |
$this->chargerInfosNoms(); |
|
echo "-------------------------------------------------------------------\n"; |
echo " ETAPE 2. Chargement des observations ... \n"; |
echo "-------------------------------------------------------------------\n"; |
|
$requete_selection_obs = 'SELECT id_observation, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, '. |
'famille, nom_referentiel FROM '.$this->table_cel; |
$liste_obs = $this->bdd->requeter($requete_selection_obs); |
echo sizeof($liste_obs)." observations sélectionnées \n"; |
|
foreach ($liste_obs as $obs) { |
if($this->doitChangerNomRetenu($obs)) { |
$nouveau_nom = $this->getInfosNouveauNumNomRetenu($obs); |
$this->obs_a_modifier[] = array( |
'id' => $obs['id_observation'], |
'nouveau_nom_sci_retenu' => $nouveau_nom['nom_complet'], |
'nouveau_nn_retenu' => $nouveau_nom['num_nom'], |
'nouveau_num_tax' => $nouveau_nom['num_taxonomique'], |
'nouvelle_famille' => $nouveau_nom['famille'] |
); |
$this->logger($obs, $nouveau_nom); |
} |
} |
|
echo "-------------------------------------------------------------------\n"; |
echo " ETAPE 3. modification des observations ... \n"; |
echo "-------------------------------------------------------------------\n"; |
echo sizeof($this->obs_a_modifier)." obs doivent voir changer leur nom retenu \n"; |
echo $this->modif_familles." obs doivent voir changer leur famille \n"; |
echo sizeof($this->obs_sans_nn)." observations n'ont pas de num nom \n"; |
echo sizeof($this->modif_douteuses)." modifications sont douteuses et ne seront pas effectuées \n"; |
echo "\n"; |
$this->executerRequeteMiseAJour(); |
echo "\n"; |
echo "-------------------------------------------------------------------\n"; |
echo " Migration des noms terminée ... \n"; |
echo "-------------------------------------------------------------------\n"; |
|
} |
|
private function chargerInfosNoms() { |
|
$requete = 'SELECT num_nom, num_nom_retenu, nom_complet, num_taxonomique, famille FROM '.$this->table_eflore; |
$nums = $this->bdd->requeter($requete); |
|
foreach ($nums as $num) { |
$this->correspondance_nn_sel_nn_ret[$num['num_nom']] = $num['num_nom_retenu']; |
$this->infos_noms[$num['num_nom']] = $num; |
} |
|
echo sizeof($this->correspondance_nn_sel_nn_ret)." noms sélectionnés\n"; |
} |
|
private function doitChangerNomRetenu($obs) { |
$changement = false; |
$nn_retenu_obs = $obs['nom_ret_nn']; |
$nn_saisi_obs = $obs['nom_sel_nn']; |
$famille_saisie_obs = $obs['famille']; |
$sans_nn_retenu = false; |
|
if($nn_saisi_obs != '') { |
if(!isset($this->correspondance_nn_sel_nn_ret[$nn_saisi_obs]) || $this->correspondance_nn_sel_nn_ret[$nn_saisi_obs] == 0) { |
$this->obs_sans_nn[] = $obs['id_observation']; |
$sans_nn_retenu = true; |
} else { |
if($nn_retenu_obs != $this->correspondance_nn_sel_nn_ret[$nn_saisi_obs] && str_word_count($obs['nom_ret']) >= 1) { |
$changement = true; |
} |
} |
|
if(!$sans_nn_retenu && $famille_saisie_obs != $this->infos_noms[$nn_saisi_obs]['famille']) { |
$changement = true; |
$this->modif_familles++; |
} |
} |
|
if($changement && str_word_count($obs['nom_ret']) == 1) { |
$this->modif_douteuses[] = $obs; |
$changement = false; |
} |
|
return $changement; |
} |
|
private function getInfosNouveauNumNomRetenu($obs) { |
$nouveau_nn_ret = $this->correspondance_nn_sel_nn_ret[$obs['nom_sel_nn']]; |
return $this->infos_noms[$nouveau_nn_ret]; |
} |
|
private function executerRequeteMiseAJour() { |
$total = 0; |
foreach($this->obs_a_modifier as $valeurs) { |
$requete = $this->assemblerRequeteMiseAJour($valeurs); |
$migration_noms = $this->bdd->executer($requete); |
if ($migration_noms) { |
$total++; |
$this->script->afficherAvancement('Migration des noms (par 1)', $total); |
} else { |
echo $requete."\n"; |
exit('Erreur lors de la migration des noms de l\'observation '.$valeurs['id']."\n"); |
} |
} |
} |
private function proteger($valeur) { |
return $this->bdd->proteger($valeur); |
} |
|
private function assemblerRequeteMiseAJour($tableau) { |
$requete = 'UPDATE '.$this->table_cel.' '. |
'SET nom_ret = '.$this->proteger($tableau['nouveau_nom_sci_retenu']).', '. |
'nom_ret_nn = '.$this->proteger($tableau['nouveau_nn_retenu']).', '. |
'nt = '.$this->proteger($tableau['nouveau_num_tax']).', '. |
'famille = '.$this->proteger($tableau['nouvelle_famille']).', '. |
'nom_referentiel = "bdtfx:v1.01" '. |
'WHERE id_observation = '.$this->proteger($tableau['id']); |
return $requete; |
} |
|
private function initialiserLog() { |
$this->fp = fopen($this->chemin_log, 'w'); |
$colonnes = 'nom sélectionné, nn nom sélectionné, ancien nom retenu, nn ancien nom retenu, '. |
'nouveau nom sélectionné, nn nouveau nom sélectionné'."\n"; |
fwrite($this->fp, $colonnes); |
} |
|
private function logger($obs, $nouveau_nom) { |
$chaine = '"'.$obs['nom_sel'].'"'.','.'"'.$obs['nom_sel_nn'].'"'.','.'"'.$obs['nom_ret'].'"'.','. |
'"'.$obs['nom_ret_nn'].'"'.','.'"'.$nouveau_nom['nom_complet'].'"'.','. |
'"'.$nouveau_nom['num_nom'].'"'."\n"; |
fwrite($this->fp, $chaine); |
} |
} |
?> |