Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 891 | Go to most recent revision | 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);
                $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);
        }
        

}