Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev Author Line No. Line
440 mathilde 1
<?php
2
/**
3
 *
522 mathilde 4
 *
440 mathilde 5
 * @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org>
6
 *
7
 *
8
 */
9
class BaseflorRangSupInsertion {
10
 
11
	private $table = null;
12
	private $donnees_initiales = array();
13
	private $valeurs_insertion;
14
	private $infos_taxon = array();
15
	private $conteneur;
16
	private $efloreCommun;
17
	private $message;
18
	private $outils;
19
	private $nn_courant;
20
	private $nn_superieur;
21
	private $champs_ecologiques = array();
522 mathilde 22
	private $Bdd;
440 mathilde 23
 
24
 
522 mathilde 25
	public function __construct(Conteneur $conteneur, Bdd $bdd) {
440 mathilde 26
		$this->conteneur = $conteneur;
522 mathilde 27
		$this->Bdd = $bdd;
440 mathilde 28
		$this->efloreCommun = $conteneur->getEfloreCommun();
29
		$this->message = $conteneur->getMessages();
30
		$this->outils = $conteneur->getOutils();
31
		$this->dossierBase = dirname(__FILE__).'/';
32
	}
33
 
34
	public function insererDonnees(){
35
		echo "Chargement de la structure en cours \n" ;
522 mathilde 36
		$this->efloreCommun->chargerFichierSql('chemins.rang_sup_sql');
440 mathilde 37
		echo "Récupération des données de baseflor  en cours \n";
38
		$this->recupererDonneesInitiales();
39
		echo "Calcul des valeurs pour les rangs supérieurs  en  cours \n";
40
		$this->consulterInfosTaxons();
41
		$this->recupererValeursInsertion();
42
		$this->insererDonneesRangSup();
43
	}
44
 
45
 
46
	private function insererDonneesRangSup() {
47
		$table = Config::get('tables.rang_sup');
48
		$requete_truncate = 'TRUNCATE TABLE '.$table;
522 mathilde 49
		$this->Bdd->requeter($requete_truncate);
891 delphine 50
		$i = 0;
440 mathilde 51
		foreach ($this->valeurs_insertion as $nn => $valeurs){
891 delphine 52
			$requete = "INSERT INTO $table VALUES({$i},$nn, 'bdtfx', '{$valeurs['ve_lumiere']['min']}', ".
440 mathilde 53
				"'{$valeurs['ve_lumiere']['max']}','{$valeurs['ve_temperature']['min']}',".
54
				"'{$valeurs['ve_temperature']['max']}','{$valeurs['ve_continentalite']['min']}',".
55
				"'{$valeurs['ve_continentalite']['max']}','{$valeurs['ve_humidite_atmos']['min']}',".
56
				"'{$valeurs['ve_humidite_atmos']['max']}','{$valeurs['ve_humidite_edaph']['min']}',".
57
				"'{$valeurs['ve_humidite_edaph']['max']}','{$valeurs['ve_reaction_sol']['min']}',".
58
				"'{$valeurs['ve_reaction_sol']['max']}','{$valeurs['ve_nutriments_sol']['min']}',".
59
				"'{$valeurs['ve_nutriments_sol']['max']}','{$valeurs['ve_salinite']['min']}',".
60
				"'{$valeurs['ve_salinite']['max']}','{$valeurs['ve_texture_sol']['min']}',".
61
				"'{$valeurs['ve_texture_sol']['max']}','{$valeurs['ve_mat_org_sol']['min']}',".
62
				"'{$valeurs['ve_mat_org_sol']['max']}');";
522 mathilde 63
			$this->Bdd->requeter($requete);
891 delphine 64
			$i++;
440 mathilde 65
			$this->message->afficherAvancement('Insertion des valeurs pour les rangs supérieurs en cours');
66
		}
67
	}
68
 
69
 
70
 
71
 
72
	// dans cette solution je parcours les donnees de baseflor
73
	// je teste une donnée (si min max)  pour récuperer les valeurs pour chaque rang superieur
74
	// jusqu'à famille (180) puis je passe à la suivante jusqu'à avoir parcouru tout baseflor
75
	private function recupererValeursInsertion(){
76
		$this->champs_ecologiques = $this->outils->recupererTableauConfig(Config::get('Parametres.champsEcologiques'));
77
		$this->valeurs_insertion = array();
78
		if (empty($this->donnees_initiales)) {
79
			throw new Exception("Erreur : pas de données à traiter.");
80
		} else {
81
			foreach  ($this->donnees_initiales as $nn => $ecologie) {
82
				$this->nn_courant = $nn;
83
				$this->nn_superieur = isset($this->infos_taxon[$this->nn_courant]) ? $this->infos_taxon[$this->nn_courant]['nn_sup'] : null;
84
				$rang = isset($this->infos_taxon[$this->nn_superieur]) ? $this->infos_taxon[$this->nn_superieur]['rang'] : 179 ;
85
						while ($rang >= 180){
86
							if (!isset($donnees_initiales[$this->nn_superieur])) {
87
								foreach ($this->champs_ecologiques as $nom) {
88
 
89
 
90
										$this->testerSiMinMax($nom, $ecologie[$nom]);
91
 
92
								}
93
							}
94
							$this->nn_superieur = isset($this->infos_taxon[$this->nn_superieur]) ? $this->infos_taxon[$this->nn_superieur]['nn_sup'] : null;
95
							$rang = !empty($this->nn_superieur) ? $this->infos_taxon[$this->nn_superieur]['rang'] : 179 ;
96
						}
97
			}
98
		}
99
	}
100
 
101
	// ici je parcours toutes les données de baseflor et je teste et récupère les valeurs pour le rang superieur
102
	//direct puis je récupère les données obtenues et je recommence jusqu'à que tous les rangs obtenus soient des familles
103
	private function recupererValeursInsertion2(){
104
		$this->champs_ecologiques = $this->outils->recupererTableauConfig(Config::get('Parametres.champsEcologiques'));
105
		$this->valeurs_insertion = array();
106
		if (empty($this->donnees_initiales)) {
107
			throw new Exception("Erreur : pas de données à traiter.");
108
		} else {
109
			$donnees_traitees = $this->donnees_initiales;
110
			$donnees_deja_traitees = array();
111
			$condition_fin = true;
112
			$tab_num_nom = array_keys($donnees_traitees);
113
			while (!empty($donnees_traitees)) {
114
				reset($donnees_traitees);
115
				$this->nn_courant = array_shift($tab_num_nom);
116
				$data = array_shift($donnees_traitees);
117
				if (isset($this->infos_taxon[$this->nn_courant])) {
118
					$this->nn_superieur = $this->infos_taxon[$this->nn_courant]['nn_sup'];
119
					if (!isset($donnees_deja_traitees[$this->nn_courant])) {
120
						if ($this->infos_taxon[$this->nn_superieur]['rang'] >= 180){
121
							$condition_fin = false;
122
							foreach ($this->champs_ecologiques as $nom) {
123
 
124
									$this->testerSiMinMax($nom, $data[$nom]);
125
 
126
 
127
							}
128
						}
129
					}
130
					$donnees_deja_traitees[$this->nn_courant] = 1;
131
				}
132
				if ($condition_fin == false && empty($donnees_traitees)) {
133
					$donnees_traitees = $this->valeurs_insertion;
134
					$tab_num_nom = array_keys($donnees_traitees);
135
					$condition_fin = true;
136
				}
137
			}
138
		}
139
	}
140
 
141
	// je stocke des valeurs à insérer sous la forme : $insertion [{nn_tax_sup}][{nom_de_chps}][{max ou min}] = {valeur}
142
	private function testerSiMinMax($nom, $valeur) {
143
		$nn = $this->nn_superieur;
144
		if ( !isset($this->valeurs_insertion[$nn][$nom]['min'])
145
			|| empty($valeur['min'])
146
			|| empty($this->valeurs_insertion[$nn][$nom]['min'])
147
			|| $this->valeurs_insertion[$nn][$nom]['min'] > $valeur['min'] ){
148
				$this->valeurs_insertion[$nn][$nom]['min'] = $valeur['min'];
149
 
150
		}
151
 
152
		if ( !isset($this->valeurs_insertion[$nn][$nom]['max'])
153
			|| empty($this->valeurs_insertion[$nn][$nom]['max'])
154
			|| empty($valeur['max'])
155
			|| $this->valeurs_insertion[$nn][$nom]['max'] < $valeur['max'] ) {
156
				$this->valeurs_insertion[$nn][$nom]['max'] = $valeur['max'];
157
		}
158
	}
159
 
160
	// je stocke les infos taxons sous la forme : $info_taxon[{num_nomem}][{num_nomen_sup ou rang}] = {valeur}
161
	private function consulterInfosTaxons() {
162
		$table = Config::get('tables.taxons');
163
		$requete = 'SELECT A.num_nom AS nn, B.num_tax_sup AS nn_sup, A.rang '.
164
			"FROM $table A JOIN $table B ON (A.num_nom_retenu = B.num_nom) ".
165
			'WHERE B.num_nom = B.num_nom_retenu ';
522 mathilde 166
		$resultat = $this->Bdd->recupererTous($requete);
440 mathilde 167
		foreach ($resultat as $res) {
168
			$this->infos_taxon[$res['nn']] = array('nn_sup' => $res['nn_sup'], 'rang' => $res['rang'] );
169
		}
170
	}
171
 
172
	// je stocke les valeurs initiales sous la forme : $initiales[{nn_nomem}][{champs ecologique}][{'min' ou 'max'}]
173
	private function recupererDonneesInitiales() {
174
		$table = Config::get('tables.donnees');
175
		$requete = "SELECT num_nomen, ve_lumiere, ve_temperature, ve_continentalite, ve_humidite_atmos, ".
176
			"ve_humidite_edaph, ve_reaction_sol, ve_nutriments_sol, ve_salinite, ve_texture_sol, ve_mat_org_sol ".
177
			"FROM $table WHERE BDNT = 'BDTFX' ".
178
			"	AND num_nomen != 0 ".
179
			"	AND (ve_lumiere != '' OR ve_mat_org_sol != '' OR ve_temperature != '' ".
180
			"	OR ve_continentalite != '' OR ve_humidite_atmos != ''  OR ve_humidite_edaph != '' ".
181
			"	OR ve_nutriments_sol != '' OR ve_salinite != '' OR ve_texture_sol != '' OR ve_reaction_sol != '' )";
522 mathilde 182
		$resultat = $this->Bdd->recupererTous($requete);
440 mathilde 183
		foreach ($resultat as $res) {
184
		 	$this->donnees_initiales[$res['num_nomen']] = array(
185
			 	've_lumiere' => array('min' => $res['ve_lumiere'], 'max' => $res['ve_lumiere']),
186
			 	've_temperature' => array('min' => $res['ve_temperature'], 'max' => $res['ve_temperature']),
187
			 	've_continentalite' => array('min' => $res['ve_continentalite'], 'max' => $res['ve_continentalite']),
188
			 	've_humidite_atmos' => array('min' => $res['ve_humidite_atmos'], 'max' => $res['ve_humidite_atmos']),
189
			 	've_humidite_edaph' => array('min' => $res['ve_humidite_edaph'], 'max' => $res['ve_humidite_edaph']),
190
			 	've_reaction_sol' => array('min' => $res['ve_reaction_sol'], 'max' => $res['ve_reaction_sol']),
191
			 	've_nutriments_sol' => array('min' => $res['ve_nutriments_sol'], 'max' => $res['ve_nutriments_sol']),
192
			 	've_salinite' => array('min' => $res['ve_salinite'], 'max' => $res['ve_salinite']),
193
			 	've_texture_sol' => array('min' => $res['ve_texture_sol'], 'max' => $res['ve_texture_sol']),
194
		 		've_mat_org_sol' => array('min' => $res['ve_mat_org_sol'], 'max' => $res['ve_mat_org_sol']));
195
		 }
196
	}
197
 
198
 
199
	// +++ Fonctions de vérification des donnée obtenues ++++//
200
 
201
	public function testAscendantsDeBaseflor(){
202
		$this->recupererDonneesInitiales();
203
		$this->consulterInfosTaxons();
204
		$fichier = dirname(__FILE__).'/log/verifTaxonsSup.log';
205
		$liste = array();
206
		foreach ($this->donnees_initiales as $nn => $data) {
207
			$nn_sup = isset($this->infos_taxon[$nn]) ? $this->infos_taxon[$nn]['nn_sup'] : '' ;
208
			if (!empty($nn_sup) && !isset($donnees_initiales[$nn_sup])){
209
				$rang = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['rang'] : 179 ;
210
				while ($rang >= 180) {
211
					if (!empty($nn_sup)) {
212
						if (isset($liste["$nn_sup($rang)"])){
213
							$liste["$nn_sup($rang)"] .= ", $nn";
214
						}else {
215
							$liste["$nn_sup($rang)"] = "$nn";
216
						}
217
						$nn_sup = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['nn_sup'] : '' ;
218
						$rang = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['rang'] : 179 ;
219
					}else {
220
						break;
221
					}
222
				}
223
			}
224
		}
225
		$log = "un ascendant (pas forcement l'ascendant directement au dessus) : les descendants contenus dans baseflor  \n";
226
		foreach ($liste as $cle => $inferieur){
227
			$log .= "$cle : $inferieur \n";
228
		}
229
		file_put_contents($fichier, $log);
230
	}
231
 
232
	public function testEcologieAscendantsDeBaseflor(){
233
		$this->recupererDonneesInitiales();
234
		$this->consulterInfosTaxons();
235
		$fichier = dirname(__FILE__).'/log/verifTaxonsSupEcolo.log';
236
		$liste = array();
237
		foreach ($this->donnees_initiales as $nn => $data) {
238
			$nn_sup = isset($this->infos_taxon[$nn]) ? $this->infos_taxon[$nn]['nn_sup'] : '' ;
239
			if (!empty($nn_sup) && !isset($donnees_initiales[$nn_sup])){
240
				$rang = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['rang'] : 179 ;
241
				while ($rang >= 180) {
242
					if (!empty($nn_sup)) {
243
						$ecolo = array_values($data);
244
						list($l,$t,$c,$ha,$he,$r,$n,$s,$tx,$mo) = $ecolo;
245
						if (isset($liste["$nn_sup($rang)"])){
246
							$liste["$nn_sup($rang)"] .= ",[{$l['min']}, {$t['min']}, {$c['min']},"
247
							."{$ha['min']}, {$he['min']}, {$r['min']}, {$n['min']}, {$s['min']},"
248
							."{$tx['min']}, {$mo['min']}]";
249
						}else {
250
						$liste["$nn_sup($rang)"] = "[{$l['min']}, {$t['min']}, {$c['min']},"
251
						."{$ha['min']}, {$he['min']}, {$r['min']}, {$n['min']}, {$s['min']},"
252
									."{$tx['min']}, {$mo['min']}]";
253
							}
254
						$nn_sup = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['nn_sup'] : '' ;
255
							$rang = isset($this->infos_taxon[$nn_sup]) ? $this->infos_taxon[$nn_sup]['rang'] : 179 ;
256
					}else {
257
						break;
258
						}
259
						}
260
						}
261
				}
262
				$log = "nn ascendant (pas forcement l'ascendant directement au dessus) :"
263
				   ." valeurs descendants contenus dans baseflor  \n"
264
					."Pour le calcul des valeurs min et max de gauche, les valeurs de droite sont utilisées. \n";
265
			foreach ($liste as $cle => $inferieurs){
266
				$log .= "$cle : $inferieurs \n";
267
			}
268
				file_put_contents($fichier, $log);
269
	}
270
 
271
 
272
}