Rev 880 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?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);foreach ($this->valeurs_insertion as $nn => $valeurs){$requete = "INSERT INTO $table VALUES('',$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);$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 baseflorprivate 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 famillesprivate 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 != '' OR ve_mat_org_sol != '' OR ve_temperature != '' "." OR ve_continentalite != '' OR ve_humidite_atmos != '' OR ve_humidite_edaph != '' "." OR ve_nutriments_sol != '' OR ve_salinite != '' OR ve_texture_sol != '' OR 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);}}