Subversion Repositories Applications.referentiel

Rev

Rev 323 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Versionnage de référentiels de nomenclature et taxonomie
*
* Description : classe permettant de versionner les référentiels selon le manuel technique
* Utilisation : php script.php versionnage -p bdnff -a tout
*
//Auteur original :
* @author       Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright    Tela-Botanica 1999-2010
* @link                 http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel
* @licence              GPL v3 & CeCILL v2
* @version              $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
// TODO : lors de la génération de la version 2 de la BDTFX tester les diff! Il se peut que la mémoire soit dépassée.
class Famille extends ScriptCommande {
        
        const SCRIPT_NOM = 'famille';
        private $referentielDao = null;
        public $parametres = array(
                        '-r' => array(true, true, 'referentiel'));
        
        
        
        public function executer() {
                $this->referentielDao = new ReferentielDao();
                // Récupération du dernier traitement demandé
                $referentiel = $this->getParam('r');
                $resultats = $this->referentielDao->preparerTablePrChpFamille($referentiel); 
                
                $noms = array();
                $introuvables = array();
                $introuvablesSyno = array();
                $i = 1;

                while(true) {
                        printf("passe n°%d:\n", $i);
                        $this->traiterResultatsFamille($resultats, $noms, $introuvables, $introuvablesSyno);
                        echo "\n\n";
                        // printf("noms: %d, introuvables: %d, introuvablesSyno: %d\n", count($noms), count($introuvables), count($introuvablesSyno));
                        // XXX, au 22/07/2013, 3 passes sont suffisantes
                        // TODO: MySQL procédure stockée !
                        if($i++ == 3) break;
                        $resultats = array_merge($resultats, $introuvables, $introuvablesSyno);
                        $introuvables = $introuvablesSyno = array();
                }

                foreach ($introuvablesSyno as $id => $nom) {
                        $nn = $nom['num_nom'];
                        $nnr = $nom['num_nom_retenu'];
                        if (isset($noms[$nnr])) {
                                $noms[$nn] = $noms[$nnr];
                        } else {
                                $introuvables[] = $nn;
                        }
                        unset($introuvablesSyno[$id]);
                        
                }
                echo "\n";
                

                /*$msg = 'Plusieurs familles sont introuvables';
                $this->creerFichierLog($msg, $introuvables, 'famille_introuvable');*/

                $this->referentielDao->remplirChpFamille($referentiel, $noms);
    }

        

        
        private function traiterResultatsFamille(&$resultats, &$noms, &$introuvables, &$introuvablesSyno) {
                foreach ($resultats as $id => $nom) {
                        $nn = $nom['num_nom'];
                        $nnr = $nom['num_nom_retenu'];
                        $nts = $nom['num_tax_sup'];
                        $rg = $nom['rang'];
                        if ($nnr != '') {
                                if ($rg == '180') {
                                        $noms[$nn] = $nom['nom_sci'];
                                } else {
                                        if ($nn == $nnr) {
                                                // nom retenu
                                                if (isset($noms[$nts])) {
                                                        // signifie que recupererTuplesPrChpFamille() devrait
                                                        // récupérer ce record *avant*
                                                        $noms[$nn] = $noms[$nts];
                                                } else {
                                                        $introuvables[] = $nn;
                                                }
                                        } else {// nom synonyme
                                                if (isset($noms[$nnr])) {
                                                        // signifie que recupererTuplesPrChpFamille() devrait
                                                        // récupérer ce record *avant*
                                                        $noms[$nn] = $noms[$nnr];
                                                } else {
                                                        $introuvablesSyno[] = $nom;
                                                }
                                        }
                                }
                        }
                        unset($resultats[$id]);
                }
        }

}
?>