/branches/v5.9-aulnaie/scripts/modules/baseflor/BaseflorIndex.php |
---|
New file |
0,0 → 1,83 |
<?php |
/** |
* |
* @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org> |
* |
* |
*/ |
class BaseflorIndex { |
private $conteneur; |
private $efloreCommun; |
private $message; |
private $dossierBase; |
private $valeurs_insertion = 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->dossierBase = dirname(__FILE__).'/'; |
} |
public function insererDonnees(){ |
$this->efloreCommun->chargerFichierSql('chemins.index_sql'); |
$this->recupererDonneesBaseflor(); |
$this->recupererDonneesRangSup(); |
$this->insererDonneesIndex(); |
} |
private function recupererDonneesBaseflor() { |
$table = Config::get('tables.donnees'); |
$requete = "SELECT cle, num_nomen, BDNT FROM $table WHERE num_nomen != 0 ". |
" 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); |
$this->valeurs_insertion['baseflor'] = $resultat; |
$this->valeurs_insertion['rangSup'] = $resultat; |
} |
private function recupererDonneesRangSup() { |
$table = Config::get('tables.rang_sup'); |
$requete = "SELECT cle, num_nomen, bdnt FROM $table ;"; |
$resultat = $this->Bdd->recupererTous($requete); |
$this->valeurs_insertion['rangSup']= $resultat; |
} |
private function insererDonneesIndex() { |
$table = Config::get('tables.index'); |
$requete_truncate = 'TRUNCATE TABLE '.$table; |
$this->Bdd->requeter($requete_truncate); |
$i = 0; |
foreach ($this->valeurs_insertion as $tab => $res){ |
if ($tab == 'baseflor') { |
foreach ($res as $valeurs ) { |
if ($valeurs['num_nomen'] != 0) { |
$requete = "INSERT INTO $table VALUES({$i},{$valeurs['cle']},null,'".strtolower($valeurs['BDNT']).".nn:{$valeurs['num_nomen']}')"; |
$this->Bdd->requeter($requete); |
$i++; |
$this->message->afficherAvancement('Insertion des valeurs issues de baseflor en cours'); |
} |
} |
} else { |
foreach ($res as $valeurs ) { |
if ($valeurs['num_nomen'] != 0) { |
$requete = "INSERT INTO $table VALUES({$i},null,{$valeurs['cle']},'{$valeurs['bdnt']}.nn:{$valeurs['num_nomen']}')"; |
$this->Bdd->requeter($requete); |
$i++; |
$this->message->afficherAvancement('Insertion des valeurs issues des rangs supérieurs en cours'); |
} |
} |
} |
} |
} |
} |
?> |
/branches/v5.9-aulnaie/scripts/modules/baseflor/baseflor.ini |
---|
New file |
0,0 → 1,52 |
version="2014_04_25" |
dossierTsv = "{ref:dossierDonneesEflore}baseflor/2014-04-25/" |
dossierSql = "{ref:dossierTsv}" |
dossierRangSup = "{ref:dossierDonneesEflore}baseflor/2014-04-25/rang_sup/" |
dossierIndex = "{ref:dossierDonneesEflore}baseflor/2014-04-25/index/" |
[tables] |
donnees = "baseflor_v{ref:version}" |
ontologies = "baseflor_ontologies" |
metadonnees = "baseflor_meta" |
rang_sup = "baseflor_rang_sup_ecologie_v{ref:version}" |
taxons = "bdtfx_v2_00"; |
index = "baseflor_index_v{ref:version}"; |
[fichiers] |
structureSql = "baseflor.sql" |
metadonnees = "insertion_baseflor_meta.sql" |
donnees = "baseflor_v{ref:version}.tsv" |
donnees_verif = "baseflor_verif.txt" |
ontologies = "baseflor_ontologies.tsv" |
rang_sup_sql = "baseflor_rang_sup_ecologie.sql" |
index_sql = "baseflor_index.sql" |
[chemins] |
structureSql = "{ref:dossierSql}{ref:fichiers.structureSql}" |
donnees = "{ref:dossierTsv}{ref:fichiers.donnees}" |
donnees_verif = "{ref:dossierTsv}{ref:fichiers.donnees_verif}" |
ontologies ="{ref:dossierTsv}{ref:fichiers.ontologies}" |
metadonnees = "{ref:dossierSql}{ref:fichiers.metadonnees}" |
rang_sup_sql = "{ref:dossierRangSup}{ref:fichiers.rang_sup_sql}" |
index_sql = "{ref:dossierIndex}{ref:fichiers.index_sql}" |
[services] |
url_base="http://localhost/" |
url_service_base="{ref:url_base}service:eflore:0.1/" |
[Parametres] |
typesBio = "A,a,B,b,C,c,Cfru,cfru,Csuf,csuf,Ccou,ccou,H,h,Heri,heri,Hsto,hsto,Hces,hces,Hros,hros,Hrub,hrub,Hbis,hbis,G,g,Gbul,gbul,Gtub,gtub,Grhi,grhi,T,t,Tver,tver,Test,test" |
sousTypesBio = "aqua,lia,épi,hpar,par,suc,semp,cad,car" |
signesSeuls = "?, x, x~, x=, xb, xB, -" |
signesNonSeuls = "~, =, b, B" |
intervalles = "1-9 = 23;24;25;26;28;29;31;32;33;34;35;37;38, |
1-12 = 27;36, |
0-9 = 30;39" |
motifs = "/(^[0-9]*\/)|(inconnu)/ = 1, |
/(^[AB]?[0-9]+$)|(^nc$)/ = 2;3, |
/[^0-9]+/ = 4;5;6;7;8;9;10;11;12;13;16;19;20;21;22;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55, |
/^([1-9]|1[0-2])(\-([1-9]|1[0-2]))*$/ = 14" |
champsEcologiques = "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" |
/branches/v5.9-aulnaie/scripts/modules/baseflor/BaseflorRangSupInsertion.php |
---|
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); |
} |
} |
/branches/v5.9-aulnaie/scripts/modules/baseflor/BaseflorVerif.php |
---|
New file |
0,0 → 1,149 |
<?php |
class BaseflorVerif extends VerificateurDonnees { |
private $type_bio = array(); |
private $ss_type_bio = array(); |
private $signes_seuls = array();// basés sur valeurs trouvées (--> pas de légende !) |
private $signes_nn_seuls = array();// basés sur valeurs trouvées (--> pas de légende !) |
private $intervalles = array(); |
private $motifs = array(); |
//obligatoire |
public function definirTraitementsColonnes() { |
$this->initialiserParametresVerif() ; |
if (( $this->colonne_num > 0 && $this->colonne_num < 15 ) |
|| $this->colonne_num == 16 |
|| ($this->colonne_num > 18 && $this->colonne_num < 23) |
|| $this->colonne_num > 39) { |
$this->verifierColonne(); |
} elseif ($this->colonne_num == 15) { |
$this->verifierTypeBio(); |
} elseif ($this->colonne_num >= 23 && $this->colonne_num <= 32) { |
$this->verifierIntervalles($this->colonne_valeur); |
} elseif ($this->colonne_num >= 33 && $this->colonne_num < 41) { |
$this->verifierValeursIndic(); |
} |
} |
private function initialiserParametresVerif() { |
$this->type_bio = $this->getParametreTableau('Parametres.typesBio'); |
$this->ss_type_bio = $this->getParametreTableau('Parametres.sousTypesBio'); |
$this->signes_seuls = $this->getParametreTableau('Parametres.signesSeuls'); |
$this->signes_nn_seuls = $this->getParametreTableau('Parametres.signesNonSeuls'); |
$this->intervalles = $this->inverserTableau($this->getParametreTableau('Parametres.intervalles')); |
$this->motifs = $this->inverserTableau($this->getParametreTableau('Parametres.motifs')); |
} |
//++---------------------------------traitements des colonnes baseflor------------------------------------++ |
private function verifierColonne(){ |
$motif = $this->motifs[$this->colonne_num]; |
if (preg_match($motif, $this->colonne_valeur) == 0 && $this->verifierSiVide() == false){ |
$this->erreurs_ligne[$this->colonne_num] = $this->colonne_valeur; |
} |
} |
private function verifierSiVide(){ |
$vide = ($this->colonne_valeur == '') ? true : false; |
return $vide; |
} |
private function verifierTypeBio(){ |
if (preg_match("/(.+)\((.+)\)$/", $this->colonne_valeur, $retour) == 1) { |
$this->verifierTypeEtSsType($retour[1]); |
$this->verifierTypeEtSsType($retour[2]); |
} else { |
$this->verifierTypeEtSsType($this->colonne_valeur); |
} |
} |
private function verifierTypeEtSsType($chaine_a_verif){ |
if (preg_match("/^([a-zA-Zé]+)\-(.+)$|^([a-zA-Zé]+[^\-])$/", $chaine_a_verif, $retour) == 1) { |
$type = (isset($retour[3])) ? $retour[3] : $retour[1]; |
$this->verifierType($type); |
$sousType = $retour[2]; |
$this->verifierSousType($sousType); |
} |
} |
private function verifierType($type) { |
if (in_array($type, $this->type_bio) == false) { |
$this->erreurs_ligne[$this->colonne_num] = $this->colonne_valeur; |
} |
} |
private function verifierSousType($sousType) { |
if ($sousType != ''){ |
$ss_type = explode('-', $sousType); |
foreach ($ss_type as $sst) { |
if (in_array($sst, $this->ss_type_bio) == false) { |
$this->erreurs_ligne[$this->colonne_num] = $this->colonne_valeur; |
} |
} |
} |
} |
private function verifierIntervalles($valeur){ |
if ($valeur != '') { |
list($min, $max) = explode('-', $this->intervalles[$this->colonne_num]); |
if ($valeur < $min || $valeur > $max){ |
$this->erreurs_ligne[$this->colonne_num] = $this->colonne_valeur; |
} |
} |
} |
private function verifierValeursIndic(){ |
if (preg_match("/^([^0-9])*([0-9]+)([^0-9])*$/", $this->colonne_valeur, $retour) == 1){ |
$this->verifierIntervalles($retour[2]); |
if (isset($retour[3]) && in_array($retour[3], $this->signes_nn_seuls) == false){ |
$this->erreurs_ligne[$this->colonne_num] = $this->colonne_valeur; |
} |
if ($retour[1] != '-' && $retour[1] != ''){ |
$this->erreurs_ligne[$this->colonne_num] = $this->colonne_valeur; |
} |
} elseif (in_array( $this->colonne_valeur, $this->signes_seuls) == false && $this->verifierSiVide() == false) { |
$this->erreurs_ligne[$this->colonne_num] = $this->colonne_valeur; |
} |
} |
/*--------------------------------------------OUtils-------------------------------------------*/ |
private function getParametreTableau($cle) { |
$tableau = array(); |
$parametre = Config::get($cle); |
if (empty($parametre) === false) { |
$tableauPartiel = explode(',', $parametre); |
$tableauPartiel = array_map('trim', $tableauPartiel); |
foreach ($tableauPartiel as $champ) { |
if (strpos($champ, '=') !== false && strlen($champ) >= 3) { |
list($cle, $val) = explode('=', $champ); |
$tableau[trim($cle)] = trim($val); |
} else { |
$tableau[] = trim($champ); |
} |
} |
} |
return $tableau; |
} |
private function inverserTableau($tableau) { |
$inverse = array(); |
foreach ($tableau as $cle => $valeurs) { |
$valeurs = explode(';', $valeurs); |
foreach ($valeurs as $valeur) { |
$inverse[$valeur] = $cle; |
} |
} |
return $inverse; |
} |
} |
?> |
/branches/v5.9-aulnaie/scripts/modules/baseflor/log |
---|
New file |
Property changes: |
Added: svn:ignore |
+test |
/branches/v5.9-aulnaie/scripts/modules/baseflor/Baseflor.php |
---|
New file |
0,0 → 1,313 |
<?php |
/** Exemple lancement: |
* /opt/lampp/bin/php -d memory_limit=3500M ~/web/eflore-projets/scripts/cli.php baseflor -a chargerTous |
*/ |
class Baseflor extends EfloreScript { |
private $table = null; |
public function executer() { |
try { |
$this->initialiserProjet('baseflor'); |
$cmd = $this->getParametre('a'); |
switch ($cmd) { |
case 'chargerStructureSql' : |
$this->chargerStructureSql(); |
break; |
case 'chargerMetadonnees': |
$this->chargerMetadonnees(); |
break; |
case 'chargerOntologies' : |
$this->chargerOntologies(); |
break; |
case 'verifierFichier' : |
$this->verifierFichier(); |
break; |
case 'chargerDonnees' : |
$this->chargerDonnees(); |
break; |
case 'genererChamps' : |
$this->genererChamps(); |
break; |
case 'chargerTous': |
$this->chargerStructureSql(); |
$this->chargerMetadonnees(); |
$this->chargerOntologies(); |
$this->chargerDonnees(); |
$this->genererChamps(); |
$this->insererDonneesBaseflorRangSupEcolo(); |
$this->insererDonneesIndex(); |
break; |
case 'insererDonneesRangSup' : |
$this->insererDonneesBaseflorRangSupEcolo(); |
break; |
case 'supprimerTous' : |
$this->supprimerTous(); |
break; |
case 'voirRangSup' : |
$this->voirRangSup(); |
break; |
case 'voirRangSupEcologie' : |
$this->voirRangSupEcologie(); |
break; |
case 'insererDonneesIndex' : |
$this->insererDonneesIndex(); |
break; |
default : |
throw new Exception("Erreur : la commande '$cmd' n'existe pas!"); |
} |
} catch (Exception $e) { |
$this->traiterErreur($e->getMessage()); |
} |
} |
//-- traitement de la table baseflorRangSupInsertion --// |
private function getClasseBaseflorRangSupInsertion() { |
$conteneur = new Conteneur(); |
require_once dirname(__FILE__)."/BaseflorRangSupInsertion.php"; |
$rangSupInsert = new BaseflorRangSupInsertion($conteneur, $this->getBdd()); |
return $rangSupInsert; |
} |
private function insererDonneesBaseflorRangSupEcolo(){ |
$rangSupInsert = $this->getClasseBaseflorRangSupInsertion(); |
$rangSupInsert->insererDonnees(); |
} |
private function voirRangSup(){ |
$rangSupInsert = $this->getClasseBaseflorRangSupInsertion(); |
$rangSupInsert->testAscendantsDeBaseflor(); |
} |
private function voirRangSupEcologie(){ |
$rangSupInsert = $this->getClasseBaseflorRangSupInsertion(); |
$rangSupInsert->testEcologieAscendantsDeBaseflor(); |
} |
//-- traitement de la table baseflorIndex --// |
private function getClasseBaseflorIndex() { |
$conteneur = new Conteneur(); |
require_once dirname(__FILE__)."/BaseflorIndex.php"; |
$Index = new BaseflorIndex($conteneur, $this->getBdd()); |
return $Index; |
} |
private function insererDonneesIndex(){ |
$Index= $this->getClasseBaseflorIndex(); |
$Index->insererDonnees(); |
} |
//-- traitement de la table generer champs --// |
private function genererChamps(){ |
$this->initialiserGenerationChamps(); |
$this->ajouterChamps(); |
$this->analyserChampsExistant(); |
} |
private function initialiserGenerationChamps() { |
$this->table = Config::get('tables.donnees'); |
} |
private function ajouterChamps() { |
$this->preparerTablePrChpsBDNT(); |
$this->preparerTablePrChpsNumTaxon(); |
$this->preparerTablePrChpsNumNomen(); |
} |
private function preparerTablePrChpsBDNT() { |
$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'BDNT' "; |
$resultat = $this->getBdd()->recuperer($requete); |
if ($resultat === false) { |
$requete = "ALTER TABLE {$this->table} ". |
'ADD BDNT VARCHAR( 6 ) '. |
'CHARACTER SET utf8 COLLATE utf8_general_ci '. |
'NOT NULL AFTER catminat_code '; |
$this->getBdd()->requeter($requete); |
} |
} |
private function preparerTablePrChpsNumTaxon() { |
$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'num_taxon' "; |
$resultat = $this->getBdd()->recuperer($requete); |
if ($resultat === false) { |
$requete = "ALTER TABLE {$this->table} ". |
'ADD num_taxon INT( 10 ) NOT NULL '. |
'AFTER catminat_code'; |
$this->getBdd()->requeter($requete); |
} |
} |
private function preparerTablePrChpsNumNomen() { |
$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'num_nomen' "; |
$resultat = $this->getBdd()->recuperer($requete); |
if ($resultat === false) { |
$requete = "ALTER TABLE {$this->table} ". |
'ADD num_nomen INT( 10 ) NOT NULL '. |
'AFTER catminat_code'; |
$this->getBdd()->requeter($requete); |
} |
} |
private function analyserChampsExistant() { |
$resultats = $this->recupererTuplesNumsOriginels(); |
foreach ($resultats as $chps) { |
$cle = $chps['cle']; |
$nno = $chps['num_nomen_originel']; |
$nto = $chps['num_taxon_originel']; |
$valeurs = array(); |
$valeurs["BDNT"] = $this->genererChpsBDNT($nno, $nto); |
$valeurs["num_taxon"] = $this->genererChpsNumTaxon($nto); |
$valeurs["num_nomen"] = $this->genererChpsNumNomen($nno); |
$this->remplirChamps($cle, $valeurs); |
$this->afficherAvancement("Insertion des valeurs dans la base en cours"); |
} |
echo "\n"; |
} |
private function recupererTuplesNumsOriginels(){ |
$requete = "SELECT cle, num_taxon_originel, num_nomen_originel FROM {$this->table} "; |
$resultat = $this->getBdd()->recupererTous($requete); |
return $resultat; |
} |
private function genererChpsBDNT($nno, $nto) { |
$bdnt = ''; |
if (preg_match("/^([AB])[0-9]+$/", $nno, $retour) || preg_match("/^([AB])[0-9]+$/", $nto, $retour)){ |
if ($retour[1]=='A') { |
$bdnt = "BDAFX"; |
} else { |
$bdnt = "BDBFX"; |
} |
} elseif (($nno == 'nc') && ($nto == 'nc')) { |
$bdnt = "nc"; |
} else { |
$bdnt = "BDTFX"; |
} |
return $bdnt; |
} |
private function genererChpsNumTaxon($nto){ |
$num_taxon = ''; |
if (preg_match("/^[AB]([0-9]+)$/", $nto, $retour)) { |
$num_taxon = intval($retour[1]); |
} elseif($nto == 'nc') { |
$num_taxon = 0; |
} else { |
$num_taxon = intval($nto); |
} |
return $num_taxon; |
} |
private function genererChpsNumNomen($nno) { |
$num_nomen = ''; |
if (preg_match("/^[AB]([0-9]+)$/", $nno, $retour)) { |
$num_nomen = intval($retour[1]); |
} elseif ($nno == 'nc') { |
$num_nomen = 0; |
} else { |
$num_nomen = intval($nno); |
} |
return $num_nomen; |
} |
private function remplirChamps($cle, $valeurs) { |
foreach ($valeurs as $nomChamp => $valeurChamp) { |
$valeurChamp = $this->getBdd()->proteger($valeurChamp); |
$requete = "UPDATE {$this->table} SET $nomChamp = $valeurChamp WHERE cle = $cle "; |
$resultat = $this->getBdd()->requeter($requete); |
if ($resultat === false) { |
throw new Exception("Erreur d'insertion pour le tuple clé = $cle"); |
} |
} |
} |
//+------------------------------------------------------------------------------------------------------+ |
// chargements, suppression, exécution |
protected function chargerMetadonnees() { |
$contenuSql = $this->recupererContenu(Config::get('chemins.metadonnees')); |
$this->executerScriptSql($contenuSql); |
} |
private function chargerOntologies() { |
$chemin = Config::get('chemins.ontologies'); |
$table = Config::get('tables.ontologies'); |
$requete = "LOAD DATA INFILE '$chemin' ". |
"REPLACE INTO TABLE $table ". |
'CHARACTER SET utf8 '. |
'FIELDS '. |
" TERMINATED BY '\t' ". |
" ENCLOSED BY '' ". |
" ESCAPED BY '\\\' " |
; |
$this->getBdd()->requeter($requete); |
} |
protected function chargerStructureSql() { |
$contenuSql = $this->recupererContenu(Config::get('chemins.structureSql')); |
$this->executerScriptSql($contenuSql); |
} |
protected function executerScriptSql($sql) { |
$requetes = Outils::extraireRequetes($sql); |
foreach ($requetes as $requete) { |
$this->getBdd()->requeter($requete); |
} |
} |
private function chargerDonnees() { |
$nb_err = $this->verifierFichier(); |
if ($nb_err > 0) { |
$e = "Je ne peux pas charger les données car le fichier comporte des erreurs.". |
"Voir le fichier baseflor_verif.txt\n"; |
throw new Exception($e); |
} |
$table = Config::get('tables.donnees'); |
$requete = "LOAD DATA INFILE '".Config::get('chemins.donnees')."' ". |
"REPLACE INTO TABLE $table ". |
'CHARACTER SET utf8 '. |
'FIELDS '. |
" TERMINATED BY '\t' ". |
" ENCLOSED BY '' ". |
" ESCAPED BY '\\\'"; |
$this->getBdd()->requeter($requete); |
} |
private function supprimerTous() { |
// TODO : rajouter une boucle utilisant un parametre de config stockant toutes les versions pour supprimer les tables |
$requete = "DROP TABLE IF EXISTS baseflor_meta, baseflor_ontologies, ". |
" baseflor_v2012_03_19, ". |
" baseflor_v2012_05_08, baseflor_rang_sup_ecologie_v2012_05_08, baseflor_index_v2012_05_08, ". |
" baseflor_v2012_12_31, baseflor_rang_sup_ecologie_v2012_12_31, baseflor_index_v2012_12_31, ". |
" baseflor_v2013_07_04, baseflor_rang_sup_ecologie_v2013_07_04, baseflor_index_v2013_07_04"; |
$this->getBdd()->requeter($requete); |
} |
//++------------------------------------verifierFichier------------------------------------------++// |
private function getClasseBaseflorVerif() { |
$conteneur = new Conteneur(); |
require_once dirname(__FILE__)."/BaseflorVerif.php"; |
$verif = new BaseflorVerif($conteneur,'baseflor'); |
return $verif; |
} |
private function verifierFichier() { |
$verif = $this->getClasseBaseflorVerif(); |
$nb_erreurs = $verif->verifierFichier(Config::get('chemins.donnees')); |
return $nb_erreurs; |
} |
} |
?> |