New file |
0,0 → 1,272 |
<?php |
/** |
* |
* |
* @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org> |
* |
* |
*/ |
class BaseflorRangSupInsertion { |
|
private $table = null; |
private $donnees_initiales = array(); |
private $valeurs_insertion; |
private $infos_taxon = array(); |
private $conteneur; |
private $efloreCommun; |
private $message; |
private $outils; |
private $nn_courant; |
private $nn_superieur; |
private $champs_ecologiques = array(); |
private $Bdd; |
|
|
public function __construct(Conteneur $conteneur, Bdd $bdd) { |
$this->conteneur = $conteneur; |
$this->Bdd = $bdd; |
$this->efloreCommun = $conteneur->getEfloreCommun(); |
$this->message = $conteneur->getMessages(); |
$this->outils = $conteneur->getOutils(); |
$this->dossierBase = dirname(__FILE__).'/'; |
} |
|
public function insererDonnees(){ |
echo "Chargement de la structure en cours \n" ; |
$this->efloreCommun->chargerFichierSql('chemins.rang_sup_sql'); |
echo "Récupération des données de baseflor en cours \n"; |
$this->recupererDonneesInitiales(); |
echo "Calcul des valeurs pour les rangs supérieurs en cours \n"; |
$this->consulterInfosTaxons(); |
$this->recupererValeursInsertion(); |
$this->insererDonneesRangSup(); |
} |
|
|
private function insererDonneesRangSup() { |
$table = Config::get('tables.rang_sup'); |
$requete_truncate = 'TRUNCATE TABLE '.$table; |
$this->Bdd->requeter($requete_truncate); |
$i = 0; |
foreach ($this->valeurs_insertion as $nn => $valeurs){ |
$requete = "INSERT INTO $table VALUES({$i},$nn, 'bdtfx', '{$valeurs['ve_lumiere']['min']}', ". |
"'{$valeurs['ve_lumiere']['max']}','{$valeurs['ve_temperature']['min']}',". |
"'{$valeurs['ve_temperature']['max']}','{$valeurs['ve_continentalite']['min']}',". |
"'{$valeurs['ve_continentalite']['max']}','{$valeurs['ve_humidite_atmos']['min']}',". |
"'{$valeurs['ve_humidite_atmos']['max']}','{$valeurs['ve_humidite_edaph']['min']}',". |
"'{$valeurs['ve_humidite_edaph']['max']}','{$valeurs['ve_reaction_sol']['min']}',". |
"'{$valeurs['ve_reaction_sol']['max']}','{$valeurs['ve_nutriments_sol']['min']}',". |
"'{$valeurs['ve_nutriments_sol']['max']}','{$valeurs['ve_salinite']['min']}',". |
"'{$valeurs['ve_salinite']['max']}','{$valeurs['ve_texture_sol']['min']}',". |
"'{$valeurs['ve_texture_sol']['max']}','{$valeurs['ve_mat_org_sol']['min']}',". |
"'{$valeurs['ve_mat_org_sol']['max']}');"; |
$this->Bdd->requeter($requete); |
$i++; |
$this->message->afficherAvancement('Insertion des valeurs pour les rangs supérieurs en cours'); |
} |
} |
|
|
|
|
// dans cette solution je parcours les donnees de baseflor |
// je teste une donnée (si min max) pour récuperer les valeurs pour chaque rang superieur |
// jusqu'à famille (180) puis je passe à la suivante jusqu'à avoir parcouru tout baseflor |
private function recupererValeursInsertion(){ |
$this->champs_ecologiques = $this->outils->recupererTableauConfig(Config::get('Parametres.champsEcologiques')); |
$this->valeurs_insertion = array(); |
if (empty($this->donnees_initiales)) { |
throw new Exception("Erreur : pas de données à traiter."); |
} else { |
foreach ($this->donnees_initiales as $nn => $ecologie) { |
$this->nn_courant = $nn; |
$this->nn_superieur = isset($this->infos_taxon[$this->nn_courant]) ? $this->infos_taxon[$this->nn_courant]['nn_sup'] : null; |
$rang = isset($this->infos_taxon[$this->nn_superieur]) ? $this->infos_taxon[$this->nn_superieur]['rang'] : 179 ; |
while ($rang >= 180){ |
if (!isset($donnees_initiales[$this->nn_superieur])) { |
foreach ($this->champs_ecologiques as $nom) { |
|
|
$this->testerSiMinMax($nom, $ecologie[$nom]); |
|
} |
} |
$this->nn_superieur = isset($this->infos_taxon[$this->nn_superieur]) ? $this->infos_taxon[$this->nn_superieur]['nn_sup'] : null; |
$rang = !empty($this->nn_superieur) ? $this->infos_taxon[$this->nn_superieur]['rang'] : 179 ; |
} |
} |
} |
} |
|
// ici je parcours toutes les données de baseflor et je teste et récupère les valeurs pour le rang superieur |
//direct puis je récupère les données obtenues et je recommence jusqu'à que tous les rangs obtenus soient des familles |
private function recupererValeursInsertion2(){ |
$this->champs_ecologiques = $this->outils->recupererTableauConfig(Config::get('Parametres.champsEcologiques')); |
$this->valeurs_insertion = array(); |
if (empty($this->donnees_initiales)) { |
throw new Exception("Erreur : pas de données à traiter."); |
} else { |
$donnees_traitees = $this->donnees_initiales; |
$donnees_deja_traitees = array(); |
$condition_fin = true; |
$tab_num_nom = array_keys($donnees_traitees); |
while (!empty($donnees_traitees)) { |
reset($donnees_traitees); |
$this->nn_courant = array_shift($tab_num_nom); |
$data = array_shift($donnees_traitees); |
if (isset($this->infos_taxon[$this->nn_courant])) { |
$this->nn_superieur = $this->infos_taxon[$this->nn_courant]['nn_sup']; |
if (!isset($donnees_deja_traitees[$this->nn_courant])) { |
if ($this->infos_taxon[$this->nn_superieur]['rang'] >= 180){ |
$condition_fin = false; |
foreach ($this->champs_ecologiques as $nom) { |
|
$this->testerSiMinMax($nom, $data[$nom]); |
|
|
} |
} |
} |
$donnees_deja_traitees[$this->nn_courant] = 1; |
} |
if ($condition_fin == false && empty($donnees_traitees)) { |
$donnees_traitees = $this->valeurs_insertion; |
$tab_num_nom = array_keys($donnees_traitees); |
$condition_fin = true; |
} |
} |
} |
} |
|
// je stocke des valeurs à insérer sous la forme : $insertion [{nn_tax_sup}][{nom_de_chps}][{max ou min}] = {valeur} |
private function testerSiMinMax($nom, $valeur) { |
$nn = $this->nn_superieur; |
if ( !isset($this->valeurs_insertion[$nn][$nom]['min']) |
|| empty($valeur['min']) |
|| empty($this->valeurs_insertion[$nn][$nom]['min']) |
|| $this->valeurs_insertion[$nn][$nom]['min'] > $valeur['min'] ){ |
$this->valeurs_insertion[$nn][$nom]['min'] = $valeur['min']; |
|
} |
|
if ( !isset($this->valeurs_insertion[$nn][$nom]['max']) |
|| empty($this->valeurs_insertion[$nn][$nom]['max']) |
|| empty($valeur['max']) |
|| $this->valeurs_insertion[$nn][$nom]['max'] < $valeur['max'] ) { |
$this->valeurs_insertion[$nn][$nom]['max'] = $valeur['max']; |
} |
} |
|
// je stocke les infos taxons sous la forme : $info_taxon[{num_nomem}][{num_nomen_sup ou rang}] = {valeur} |
private function consulterInfosTaxons() { |
$table = Config::get('tables.taxons'); |
$requete = 'SELECT A.num_nom AS nn, B.num_tax_sup AS nn_sup, A.rang '. |
"FROM $table A JOIN $table B ON (A.num_nom_retenu = B.num_nom) ". |
'WHERE B.num_nom = B.num_nom_retenu '; |
$resultat = $this->Bdd->recupererTous($requete); |
foreach ($resultat as $res) { |
$this->infos_taxon[$res['nn']] = array('nn_sup' => $res['nn_sup'], 'rang' => $res['rang'] ); |
} |
} |
|
// je stocke les valeurs initiales sous la forme : $initiales[{nn_nomem}][{champs ecologique}][{'min' ou 'max'}] |
private function recupererDonneesInitiales() { |
$table = Config::get('tables.donnees'); |
$requete = "SELECT num_nomen, ve_lumiere, ve_temperature, ve_continentalite, ve_humidite_atmos, ". |
"ve_humidite_edaph, ve_reaction_sol, ve_nutriments_sol, ve_salinite, ve_texture_sol, ve_mat_org_sol ". |
"FROM $table WHERE BDNT = 'BDTFX' ". |
" AND num_nomen != 0 ". |
" AND !(ve_lumiere = '' and ve_mat_org_sol = '' and ve_temperature = '' and ve_continentalite = '' ". |
" and ve_humidite_atmos = '' and ve_humidite_edaph = '' and ve_nutriments_sol = '' and ve_salinite = ''". |
" and ve_texture_sol = '' and ve_reaction_sol = '')"; |
$resultat = $this->Bdd->recupererTous($requete); |
foreach ($resultat as $res) { |
$this->donnees_initiales[$res['num_nomen']] = array( |
've_lumiere' => array('min' => $res['ve_lumiere'], 'max' => $res['ve_lumiere']), |
've_temperature' => array('min' => $res['ve_temperature'], 'max' => $res['ve_temperature']), |
've_continentalite' => array('min' => $res['ve_continentalite'], 'max' => $res['ve_continentalite']), |
've_humidite_atmos' => array('min' => $res['ve_humidite_atmos'], 'max' => $res['ve_humidite_atmos']), |
've_humidite_edaph' => array('min' => $res['ve_humidite_edaph'], 'max' => $res['ve_humidite_edaph']), |
've_reaction_sol' => array('min' => $res['ve_reaction_sol'], 'max' => $res['ve_reaction_sol']), |
've_nutriments_sol' => array('min' => $res['ve_nutriments_sol'], 'max' => $res['ve_nutriments_sol']), |
've_salinite' => array('min' => $res['ve_salinite'], 'max' => $res['ve_salinite']), |
've_texture_sol' => array('min' => $res['ve_texture_sol'], 'max' => $res['ve_texture_sol']), |
've_mat_org_sol' => array('min' => $res['ve_mat_org_sol'], 'max' => $res['ve_mat_org_sol'])); |
} |
} |
|
|
// +++ Fonctions de vérification des donnée obtenues ++++// |
|
public function testAscendantsDeBaseflor(){ |
$this->recupererDonneesInitiales(); |
$this->consulterInfosTaxons(); |
$fichier = dirname(__FILE__).'/log/verifTaxonsSup.log'; |
$liste = array(); |
foreach ($this->donnees_initiales as $nn => $data) { |
$nn_sup = isset($this->infos_taxon[$nn]) ? $this->infos_taxon[$nn]['nn_sup'] : '' ; |
if (!empty($nn_sup) && !isset($donnees_initiales[$nn_sup])){ |
$rang = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['rang'] : 179 ; |
while ($rang >= 180) { |
if (!empty($nn_sup)) { |
if (isset($liste["$nn_sup($rang)"])){ |
$liste["$nn_sup($rang)"] .= ", $nn"; |
}else { |
$liste["$nn_sup($rang)"] = "$nn"; |
} |
$nn_sup = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['nn_sup'] : '' ; |
$rang = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['rang'] : 179 ; |
}else { |
break; |
} |
} |
} |
} |
$log = "un ascendant (pas forcement l'ascendant directement au dessus) : les descendants contenus dans baseflor \n"; |
foreach ($liste as $cle => $inferieur){ |
$log .= "$cle : $inferieur \n"; |
} |
file_put_contents($fichier, $log); |
} |
|
public function testEcologieAscendantsDeBaseflor(){ |
$this->recupererDonneesInitiales(); |
$this->consulterInfosTaxons(); |
$fichier = dirname(__FILE__).'/log/verifTaxonsSupEcolo.log'; |
$liste = array(); |
foreach ($this->donnees_initiales as $nn => $data) { |
$nn_sup = isset($this->infos_taxon[$nn]) ? $this->infos_taxon[$nn]['nn_sup'] : '' ; |
if (!empty($nn_sup) && !isset($donnees_initiales[$nn_sup])){ |
$rang = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['rang'] : 179 ; |
while ($rang >= 180) { |
if (!empty($nn_sup)) { |
$ecolo = array_values($data); |
list($l,$t,$c,$ha,$he,$r,$n,$s,$tx,$mo) = $ecolo; |
if (isset($liste["$nn_sup($rang)"])){ |
$liste["$nn_sup($rang)"] .= ",[{$l['min']}, {$t['min']}, {$c['min']}," |
."{$ha['min']}, {$he['min']}, {$r['min']}, {$n['min']}, {$s['min']}," |
."{$tx['min']}, {$mo['min']}]"; |
}else { |
$liste["$nn_sup($rang)"] = "[{$l['min']}, {$t['min']}, {$c['min']}," |
."{$ha['min']}, {$he['min']}, {$r['min']}, {$n['min']}, {$s['min']}," |
."{$tx['min']}, {$mo['min']}]"; |
} |
$nn_sup = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['nn_sup'] : '' ; |
$rang = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['rang'] : 179 ; |
}else { |
break; |
} |
} |
} |
} |
$log = "nn ascendant (pas forcement l'ascendant directement au dessus) :" |
." valeurs descendants contenus dans baseflor \n" |
."Pour le calcul des valeurs min et max de gauche, les valeurs de droite sont utilisées. \n"; |
foreach ($liste as $cle => $inferieurs){ |
$log .= "$cle : $inferieurs \n"; |
} |
file_put_contents($fichier, $log); |
} |
|
|
} |