Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
2094 mathias 1
<?php
2
class Maintenance extends Script {
3
 
4
	protected $bdd;
2139 mathias 5
	protected $parametres_autorises = array(
2142 mathias 6
		'-mc' => array(false, '1', 'Mot clef à chercher pour régénérer les machins'),
7
		'-doublon' => array(false, '1', "Id du mot clé qu'on veut réduire à un autre"),
2192 mathias 8
		'-util' => array(false, null, "Id de l'utilisateur"),
2142 mathias 9
		'-cible' => array(false, '1', "Id de l'autre mot clé")
2139 mathias 10
	);
2094 mathias 11
 
12
	public function __construct($script_nom, $parametres_cli) {
13
		parent::__construct($script_nom, $parametres_cli);
14
		$this->bdd = new Bdd();
15
	}
16
 
17
	public function executer() {
18
		$cmd = $this->getParametre('a');
19
		try {
20
			switch ($cmd) {
21
				case 'regenererMotsClesTexteObs' :
22
					$this->regenererMotsClesTexteObs();
23
					break;
24
				case 'regenererMotsClesTexteImages' :
25
					$this->regenererMotsClesTexteImages();
26
					break;
2103 aurelien 27
				case 'regenererMotsClesTexteObsTout' :
28
					$this->regenererMotsClesTexteObs(true);
29
					break;
30
				case 'regenererMotsClesTexteImagesTout' :
31
					$this->regenererMotsClesTexteImages(true);
32
					break;
2095 mathias 33
				case 'viderMotsClesTexteImagesSansMotsCles' :
34
					$this->viderMotsClesTexteImagesSansMotsCles();
35
					break;
36
				case 'viderMotsClesTexteObsSansMotsCles' :
37
					$this->viderMotsClesTexteObsSansMotsCles();
38
					break;
2100 aurelien 39
				case 'regenererChampsTailleImage' :
40
					$this->regenererChampsTailleImage();
41
					break;
2102 aurelien 42
				case 'reparerLiaisonsOublieesObs' :
43
					$this->reparerLiaisonsOublieesObs();
44
					break;
45
				case 'reparerLiaisonsOublieesImages' :
46
					$this->reparerLiaisonsOublieesImages();
47
					break;
2139 mathias 48
				case 'reparerLiaisonsObsParMotsClesTexte' :
49
					$mot_clef = $this->getParametre('mc');
50
					$this->reparerLiaisonsObsParMotsClesTexte($mot_clef);
51
					break;
2142 mathias 52
				case 'reductionMotsClesImages' :
2183 mathias 53
					// ex: cli.php maintenance -a reductionMotsClesImages -doublon 1234 -cible 5678
2142 mathias 54
					$idDoublon = $this->getParametre('doublon');
55
					$idCible = $this->getParametre('cible');
56
					$this->reductionMotsClesImages($idDoublon, $idCible);
57
					break;
2183 mathias 58
				case 'reductionMotsClesImagesUtil' :
59
					// ex: cli.php maintenance -a reductionMotsClesImagesUtil -util 6865
2192 mathias 60
					$idUtilisateur = $this->obtenirParametreIntObligatoirePourMethode('util');
2183 mathias 61
					$this->reductionMotsClesImagesUtilisateur($idUtilisateur);
62
					break;
2192 mathias 63
				case 'reduireEtNormaliserMotsClesImagesUtil' :
64
					// ex: cli.php maintenance -a reduireEtNormaliserMotsClesImages -util 6865
65
					$idUtilisateur = $this->obtenirParametreIntObligatoirePourMethode('util');
66
					$this->reduireEtNormaliserMotsClesImages($idUtilisateur);
67
					break;
2191 mathias 68
				case 'reduireEtNormaliserMotsClesImages' :
69
					// ex: cli.php maintenance -a reduireEtNormaliserMotsClesImages
70
					$this->reduireEtNormaliserMotsClesImages();
71
					break;
2229 mathias 72
				case 'reductionMotsClesObs' :
73
					// ex: cli.php maintenance -a reductionMotsClesObs -doublon 1234 -cible 5678
74
					$idDoublon = $this->getParametre('doublon');
75
					$idCible = $this->getParametre('cible');
76
					$this->reductionMotsClesObs($idDoublon, $idCible);
77
					break;
78
				case 'reductionMotsClesObsUtil' :
79
					// ex: cli.php maintenance -a reductionMotsClesObsUtil -util 6865
80
					$idUtilisateur = $this->obtenirParametreIntObligatoirePourMethode('util');
81
					$this->reductionMotsClesObsUtilisateur($idUtilisateur);
82
					break;
83
				case 'reduireEtNormaliserMotsClesObsUtil' :
84
					// ex: cli.php maintenance -a reduireEtNormaliserMotsClesObs -util 6865
85
					$idUtilisateur = $this->obtenirParametreIntObligatoirePourMethode('util');
86
					$this->reduireEtNormaliserMotsClesObs($idUtilisateur);
87
					break;
88
				case 'reduireEtNormaliserMotsClesObs' :
89
					// ex: cli.php maintenance -a reduireEtNormaliserMotsClesObs
90
					$this->reduireEtNormaliserMotsClesObs();
91
					break;
2094 mathias 92
				default :
93
					$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
2229 mathias 94
						"Commandes existantes : regenererMotsClesTexteObs, regenererMotsClesTexteImages"
95
							. ", regenererMotsClesTexteObsTout, regenererMotsClesTexteImagesTout"
96
							. ", viderMotsClesTexteImagesSansMotsCles, viderMotsClesTexteObsSansMotsCles"
97
							. ", regenererChampsTailleImage, reparerLiaisonsOublieesObs, reparerLiaisonsOublieesImages"
98
							. ", reparerLiaisonsObsParMotsClesTexte, reductionMotsClesImages, reductionMotsClesImagesUtil"
99
							. ", reduireEtNormaliserMotsClesImagesUtil, reduireEtNormaliserMotsClesImages"
100
							. ", reductionMotsClesObs, reductionMotsClesObsUtil, reduireEtNormaliserMotsClesObsUtil"
101
							. ", reduireEtNormaliserMotsClesObs";
2094 mathias 102
					throw new Exception($msg);
103
			}
104
		} catch (Exception $e) {
105
			$this->traiterErreur($e->getMessage());
106
		}
107
	}
2192 mathias 108
 
109
	private function obtenirParametreIntObligatoirePourMethode($param) {
110
		$param_val = $this->getParametre($param);
111
		if(!$param_val || !is_numeric($param_val)) {
112
			$msg = "Erreur : le paramètre $param est obligatoire pour cette méthode et doit être un entier \n";
113
			throw new Exception($msg);
114
		}
115
		return $param_val;
116
	}
2094 mathias 117
 
118
	// Régénère le champ "mots_cles_texte" pour toutes les images ayant des mots clés mais ayant ce champ
119
	// vide, suite à une erreur
2103 aurelien 120
	protected function regenererMotsClesTexteImages($tout = false) {
121
		$req = "SELECT id_image FROM cel_images WHERE ".
122
				"id_image IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
123
		if(!$tout) {
124
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
125
		}
2094 mathias 126
		$res = $this->bdd->recupererTous($req);
127
		echo count($res) . " images trouvées\n";
128
		foreach ($res as $image) {
129
			$req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm "
130
				. "INNER JOIN cel_mots_cles_images_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_image'] . "') "
131
				. "WHERE id_image = '" . $image['id_image'] . "'";
132
			$this->bdd->requeter($req);
133
		}
134
	}
135
 
136
	// Régénère le champ "mots_cles_texte" pour toutes les observations ayant des mots clés mais ayant ce champ
137
	// vide, suite à une erreur
2103 aurelien 138
	protected function regenererMotsClesTexteObs($tout = false) {
139
		$req = "SELECT id_observation FROM cel_obs WHERE ".
140
				"id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
141
		if(!$tout) {
142
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
143
		}
2094 mathias 144
		$res = $this->bdd->recupererTous($req);
145
		echo count($res) . " observations trouvées\n";
146
		foreach ($res as $image) {
147
			$req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm "
148
			. "INNER JOIN cel_mots_cles_obs_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_observation'] . "') "
149
				. "WHERE id_observation = '" . $image['id_observation'] . "'";
150
			$this->bdd->requeter($req);
151
		}
152
	}
2095 mathias 153
 
154
	// Vide le champ "mots_cles_texte" pour toutes les images n'ayant aucun mot clé
155
	protected function viderMotsClesTexteImagesSansMotsCles() {
156
		$req = "UPDATE cel_images SET mots_cles_texte = NULL WHERE id_image NOT IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
157
		$res = $this->bdd->requeter($req);
158
		echo "$res images mises à jour\n";
159
	}
160
 
161
	// Vide le champ "mots_cles_texte" pour toutes les obs n'ayant aucun mot clé
162
	protected function viderMotsClesTexteObsSansMotsCles() {
163
		$req = "UPDATE cel_obs SET mots_cles_texte = NULL WHERE id_observation NOT IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
164
		$res = $this->bdd->requeter($req);
165
		echo "$res observations mises à jour\n";
166
	}
2100 aurelien 167
 
168
	protected function regenererChampsTailleImage() {
169
		$req = "SELECT id_image FROM cel_images WHERE hauteur = 0 OR largeur = 0";
170
		$res = $this->bdd->recupererTous($req);
171
 
172
		echo count($res)." images concernees \n";
173
		echo "Début du traitement \n";
174
		$images_maj = 0;
175
		$image_meta_ratees = 0;
176
		$images_inexistantes = 0;
177
 
178
		foreach($res as $image) {
179
			$chemin = $this->getCheminImage($image['id_image']);
180
			if(file_exists($chemin)) {
181
				list($largeur, $hauteur) = @getimagesize($chemin);
182
				if(is_numeric($largeur) && is_numeric($hauteur)) {
183
					$req_maj = "UPDATE cel_images SET hauteur = '".$hauteur."', largeur = '".$largeur."' ".
184
					           "WHERE id_image = '".$image['id_image']."'";
185
					$maj_taille_image = $this->bdd->requeter($req_maj);
186
					if($maj_taille_image) {
187
						$images_maj++;
188
					}
189
				} else {
190
					$image_meta_ratees++;
191
				}
192
			} else {
193
				$images_inexistantes++;
194
			}
195
			$this->afficherAvancement("\tImages traitées : ", 1);
196
		}
197
		echo "\n";
198
		echo "Fin de la régénération des tailles des images à partir des metadonnées \n";
199
		echo $images_maj." images ont vu leur infos de taille régénérées \n";
200
		echo $image_meta_ratees." images ont raté l'extraction de metadonnées \n";
201
		echo $images_inexistantes." images n'existent pas en tant que fichier \n";
202
	}
203
 
204
	private function getCheminImage($id) {
205
		$chemin_base = Config::get('dossierImages');
206
 
207
		$id = sprintf('%09s', $id);
208
		$id = wordwrap($id, 3 , '_', true);
209
 
210
		list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
211
 
2119 aurelien 212
		$chemin = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/O/'.$id.'_O.jpg';
2100 aurelien 213
 
214
		return $chemin;
215
	}
2102 aurelien 216
 
217
	protected function reparerLiaisonsOublieesObs() {
218
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
219
		// dans la table de liaison il est souvent vide
220
		$requete_liaisons = "SELECT com.id_observation, com.id_mot_cle_obs, co.ce_utilisateur ".
221
					"FROM `cel_obs_mots_cles` com INNER JOIN cel_obs co ON co.id_observation = com.id_observation ";
222
 
223
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
224
		$nb_liaisons_originales = count($liaisons);
225
 
226
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
227
		$requete_mots_cles = "SELECT id_mot_cle_obs, id_utilisateur, mot_cle FROM cel_mots_cles_obs ";
228
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
229
 
230
		$anciens_mots_cles_fmt = array();
231
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
232
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
233
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
234
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
235
			}
236
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_obs']] = $ancien_mot_cle;
237
		}
238
 
239
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
240
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_obs";
241
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
242
 
243
		$nouveau_mots_cles_fmt = array();
244
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
245
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
246
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
247
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
248
			}
2137 mathias 249
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][strtolower($nouveau_mot_cle['mot_cle'])] = $nouveau_mot_cle;
2102 aurelien 250
		}
251
 
252
		$anciens_mot_cles_pas_trouves = 0;
253
		$nouveaux_mot_cles_pas_trouves = 0;
254
		$utilisateurs_pas_trouves = 0;
255
		$valeurs_a_inserer = array();
256
 
257
		$ids_obs = array();
258
 
259
		foreach($liaisons as &$liaison) {
260
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
261
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_obs'];
262
 
263
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
264
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
265
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
2137 mathias 266
					$texte_ancien_mot_cle = strtolower($texte_ancien_mot_cle); // l'astuce de ouf !
2102 aurelien 267
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
268
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
269
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
270
 
271
							$valeurs_a_inserer[] = array(
272
													'id_element_lie' => $liaison['id_observation'],
273
													'id_mot_cle' => $nouvel_id_mot_cle,
274
													'ancienne_liaison' => $liaison
275
							);
276
							$ids_obs[] = $liaison['id_observation'];
277
						} else {
278
							$nouveaux_mot_cles_pas_trouves++;
279
						}
280
					} else {
281
 
282
					}
283
 
284
				} else {
285
					$anciens_mot_cles_pas_trouves++;
286
				}
287
			} else {
288
				$utilisateurs_pas_trouves++;
289
			}
290
		}
291
 
292
		echo "Anciennes liaisons ".$nb_liaisons_originales." \n";
293
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
294
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
295
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
296
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
297
 
298
		$tranches = array_chunk($valeurs_a_inserer, 800);
299
 
300
		foreach($tranches as $tranche) {
301
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ".
302
					                      "VALUES ";
303
			foreach($tranche as $l) {
304
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
305
			}
306
			$requete_insertion = rtrim($requete_insertion, ',');
307
			$insertion = $this->bdd->requeter($requete_insertion);
308
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
309
		}
310
		echo "\n";
311
	}
312
 
313
	private function reparerLiaisonsOublieesImages() {
314
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
315
		// dans la table de liaison il est souvent vide
316
		$requete_liaisons = "SELECT cim.id_image, cim.id_mot_cle_image, ci.ce_utilisateur ".
317
							"FROM cel_images_mots_cles cim INNER JOIN cel_images ci ON ci.id_image = cim.id_image ";
318
 
319
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
320
 
321
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
322
		$requete_mots_cles = "SELECT id_mot_cle_image, id_utilisateur, mot_cle FROM cel_mots_cles_images ";
323
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
324
 
325
		$anciens_mots_cles_fmt = array();
326
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
327
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
328
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
329
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
330
			}
331
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_image']] = $ancien_mot_cle;
332
		}
333
 
334
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
335
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_images";
336
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
337
 
338
		$nouveau_mots_cles_fmt = array();
339
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
340
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
341
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
342
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
343
			}
344
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
345
		}
346
 
347
		$anciens_mot_cles_pas_trouves = 0;
348
		$nouveaux_mot_cles_pas_trouves = 0;
349
		$utilisateurs_pas_trouves = 0;
350
		$valeurs_a_inserer = array();
351
 
352
		foreach($liaisons as &$liaison) {
353
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
354
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_image'];
355
 
356
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
357
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
358
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
359
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
360
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
361
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
362
 
363
							$valeurs_a_inserer[] = array(
364
															'id_element_lie' => $liaison['id_image'],
365
															'id_mot_cle' => $nouvel_id_mot_cle,
366
															'ancienne_liaison' => $liaison
367
							);
368
							$ids_imgs[] = $liaison['id_image'];
369
						} else {
370
							$nouveaux_mot_cles_pas_trouves++;
371
						}
372
					} else {
373
 
374
					}
375
 
376
				} else {
377
					$anciens_mot_cles_pas_trouves++;
378
				}
379
			} else {
380
				$utilisateurs_pas_trouves++;
381
			}
382
		}
383
 
384
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
385
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
386
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
387
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
388
 
389
		$tranches = array_chunk($valeurs_a_inserer, 800);
390
 
391
		foreach($tranches as $tranche) {
392
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_images_liaison (id_element_lie, id_mot_cle) ".
393
					                      "VALUES ";
394
			foreach($tranche as $l) {
395
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
396
			}
397
			$requete_insertion = rtrim($requete_insertion, ',');
398
			$insertion = $this->bdd->requeter($requete_insertion);
399
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
400
		}
401
		echo "\n";
402
	}
2139 mathias 403
 
404
	private function reparerLiaisonsObsParMotsClesTexte($mot_cle_texte_recherche) {
405
		$ancienne_table_obs = Config::get('table_obs_recup');
406
		$requete_anciens_mots_cles_texte = "SELECT ce_utilisateur, id_observation, mots_cles_texte ".
407
											"FROM ".$ancienne_table_obs." WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%'";
408
		$obs_a_mot_cle = $this->bdd->recupererTous($requete_anciens_mots_cles_texte);
409
 
410
		$requete_nouveaux_mots_cle = "SELECT * FROM cel_arbre_mots_cles_obs ".
411
									"WHERE id_utilisateur IN ".
412
									"(SELECT id_utilisateur FROM ".$ancienne_table_obs." ".
413
									"WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%')";
414
		$nouveaux_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cle);
415
 
416
		$mots_cles_indexes = array();
417
		foreach($nouveaux_mots_cles as $mot_cle) {
418
			$mots_cles_indexes[$mot_cle['id_utilisateur']][strtolower($mot_cle['mot_cle'])] = $mot_cle;
419
		}
420
 
421
		$liaisons_a_inserer = array();
422
		$utilFoirax = 0;
423
		$mcFoirax = 0;
424
		foreach($obs_a_mot_cle as $obs) {
425
			$mots_cles_texte_tab = explode(',', $obs['mots_cles_texte']);
426
			$id_observation = $obs['id_observation'];
427
			$id_utilisateur = $obs['ce_utilisateur'];
428
			foreach($mots_cles_texte_tab as $mot_cle_t) {
429
				if($mot_cle_t == $mot_cle_texte_recherche) {
430
					if (isset($mots_cles_indexes[$id_utilisateur])) {
431
						if (isset($mots_cles_indexes[$id_utilisateur][strtolower($mot_cle_t)])) {
432
							$id_nouveau_mot_cle = $mots_cles_indexes[$id_utilisateur][strtolower($mot_cle_t)]['id_mot_cle'];
433
						} else {
434
							$mcFoirax++;
435
						}
436
					} else {
437
						$utilFoirax++;
438
					}
439
					$liaisons_a_inserer[] = array('id_element_lie' => $id_observation, 'id_mot_cle' => $id_nouveau_mot_cle);
440
				}
441
			}
442
		}
443
		echo "Utilisateurs pas dans le tableau: $utilFoirax\n";
444
		echo "Motf-clefs pas dans le tableau: $mcFoirax\n";
2140 mathias 445
		//echo '<pre>'.print_r($liaisons_a_inserer, true).'</pre>';
446
		echo "Liaisons à insérer: " . count($liaisons_a_inserer) . " \n";
447
 
448
		$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ".
449
				"VALUES ";
450
		foreach($liaisons_a_inserer as $l) {
451
			$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
452
		}
453
		$requete_insertion = rtrim($requete_insertion, ',');
454
		$insertion = $this->bdd->requeter($requete_insertion);
2139 mathias 455
	}
2142 mathias 456
 
457
	// Change toutes les associations images - mots_cles dont l'id mot_cle est $idDoublon, pour le remplacer par $idCible
2183 mathias 458
	private function reductionMotsClesImages($idDoublon, $idCible, $supprimerVieuxMotsCles=true) {
2229 mathias 459
		echo "Réduction de $idDoublon (images) à $idCible" . PHP_EOL;
2183 mathias 460
 
2142 mathias 461
		$q1 = "SELECT id_element_lie FROM cel_mots_cles_images_liaison WHERE id_mot_cle = $idCible;";
462
		$r1 = $this->bdd->requeter($q1);
463
		$idsImages = array();
464
		foreach ($r1 as $r) {
465
			$idsImages[] = $r['id_element_lie'];
466
		}
467
 
2183 mathias 468
		if (count($idsImages) > 0) {
469
			// On vire ceux qui ont le doublon mais qui ont aussi la cible
470
			$q2 = "DELETE FROM cel_mots_cles_images_liaison WHERE id_mot_cle = $idDoublon AND id_element_lie IN (" . implode(',', $idsImages) . ");";
471
			$r2 = $this->bdd->requeter($q2);
472
		}
473
 
2142 mathias 474
		// On convertit tous les doublons en cible
475
		$q3 = "UPDATE cel_mots_cles_images_liaison SET id_mot_cle = $idCible WHERE id_mot_cle = $idDoublon;";
476
		$r3 = $this->bdd->requeter($q3);
2183 mathias 477
 
478
		if ($supprimerVieuxMotsCles) {
479
			// On supprime le mot cle qui sert plus à rien
480
			$q4 = "DELETE FROM cel_arbre_mots_cles_images WHERE id_mot_cle = $idDoublon;";
481
			$r4 = $this->bdd->requeter($q4);
482
		}
2142 mathias 483
	}
2183 mathias 484
 
2229 mathias 485
	// @TODO factoriser avec reductionMotsClesImages
486
	// Change toutes les associations obs - mots_cles dont l'id mot_cle est $idDoublon, pour le remplacer par $idCible
487
	private function reductionMotsClesObs($idDoublon, $idCible, $supprimerVieuxMotsCles=true) {
488
		echo "Réduction de $idDoublon (obs) à $idCible" . PHP_EOL;
489
 
490
		$q1 = "SELECT id_element_lie FROM cel_mots_cles_obs_liaison WHERE id_mot_cle = $idCible;";
491
		$r1 = $this->bdd->requeter($q1);
492
		$idsObs = array();
493
		foreach ($r1 as $r) {
494
			$idsObs[] = $r['id_element_lie'];
495
		}
496
 
497
		if (count($idsObs) > 0) {
498
			// On vire ceux qui ont le doublon mais qui ont aussi la cible
499
			$q2 = "DELETE FROM cel_mots_cles_obs_liaison WHERE id_mot_cle = $idDoublon AND id_element_lie IN (" . implode(',', $idsObs) . ");";
500
			$r2 = $this->bdd->requeter($q2);
501
		}
502
 
503
		// On convertit tous les doublons en cible
504
		$q3 = "UPDATE cel_mots_cles_obs_liaison SET id_mot_cle = $idCible WHERE id_mot_cle = $idDoublon;";
505
		$r3 = $this->bdd->requeter($q3);
506
 
507
		if ($supprimerVieuxMotsCles) {
508
			// On supprime le mot cle qui sert plus à rien
509
			$q4 = "DELETE FROM cel_arbre_mots_cles_obs WHERE id_mot_cle = $idDoublon;";
510
			$r4 = $this->bdd->requeter($q4);
511
		}
512
	}
513
 
2183 mathias 514
	private function reductionMotsClesImagesUtilisateur($idUtilisateur) {
2229 mathias 515
		$this->reductionMotsClesUtilisateur($idUtilisateur, "images");
516
	}
517
 
518
	private function reductionMotsClesObsUtilisateur($idUtilisateur) {
519
		$this->reductionMotsClesUtilisateur($idUtilisateur, "obs");
520
	}
521
 
522
	// Parcourt l'arbre des mots-cles (obs ou images) de l'utilisateur dont l'id est $idUtilisateur,
523
	// et réduit tous ceux dont le chemin n'est pas unique
524
	private function reductionMotsClesUtilisateur($idUtilisateur, $mode = "images") {
525
		$table = "cel_arbre_mots_cles_";
526
		if ($mode == "images" || $mode == "obs") {
527
			$table .= $mode;
528
		}
529
		$q1 = "SELECT id_mot_cle, chemin, mot_cle, (LOCATE(mot_cle, chemin) != 0) as valide FROM `$table`"
2191 mathias 530
			. " WHERE id_utilisateur = '$idUtilisateur'"
531
			. " ORDER BY chemin ASC, valide DESC;";
2183 mathias 532
		$r1 = $this->bdd->requeter($q1);
533
 
534
		$idsMotsCles = array();
535
		$nbVieux = 0;
536
		foreach ($r1 as $r) {
537
			$k = strtolower($r['chemin']);
538
			if (! isset($idsMotsCles[$k])) {
539
				$idsMotsCles[$k] = array();
540
			}
541
			$idsMotsCles[$k][] = $r['id_mot_cle'];
542
			$nbVieux++;
543
		}
544
		$nbNouveaux = count($idsMotsCles);
545
 
2229 mathias 546
		echo "Réduction de $nbVieux à $nbNouveaux mots-cles $mode" . PHP_EOL;
2183 mathias 547
		$aTraiter = 0;
548
		foreach ($idsMotsCles as $chemin => $ids) {
549
			if (count($ids) > 1) {
550
				$aTraiter ++;
551
				$idCible = array_shift($ids);
552
				foreach ($ids as $idDoublon) {
2229 mathias 553
					if ($mode == "images") {
554
						$this->reductionMotsClesImages($idDoublon, $idCible);
555
					} elseif ($mode == "obs") {
556
						$this->reductionMotsClesObs($idDoublon, $idCible);
557
					}
2183 mathias 558
				}
559
			}
560
		}
2229 mathias 561
		echo "$aTraiter groupes ($mode) ont été réduits" . PHP_EOL;
2183 mathias 562
	}
2191 mathias 563
 
2192 mathias 564
	private function reduireEtNormaliserMotsClesImages($util=null) {
565
		$this->reduireEtNormaliserMotsCles('cel_arbre_mots_cles_images', 'chemin', 'images', $util);
2191 mathias 566
	}
567
 
2229 mathias 568
	private function reduireEtNormaliserMotsClesObs($util=null) {
569
		$this->reduireEtNormaliserMotsCles('cel_arbre_mots_cles_obs', 'chemin', 'obs', $util);
570
	}
571
 
2192 mathias 572
	private function reduireEtNormaliserMotsCles($table, $colonne, $mode = "images", $util=null) {
2191 mathias 573
		echo "Suppression des accents dans la table $table, colonne $colonne ...";
2192 mathias 574
		$this->supprimerAccents($table, $colonne, $util);
2191 mathias 575
		echo "effectuée \n";
576
		echo "Suppression des majuscules dans la table $table, colonne $colonne ...";
2192 mathias 577
		$this->supprimerMajuscules($table, $colonne, $util);
2191 mathias 578
		echo "effectuée \n";
579
		echo "\n";
2192 mathias 580
		if ($util !== null) {
581
			echo "Réduction de tous les mots clés $mode de l'utilisateur $util\n";
2229 mathias 582
			if($mode == "images") {
583
				$this->reductionMotsClesImagesUtilisateur($util);
584
			} elseif($mode == "obs") {
585
				$this->reductionMotsClesObsUtilisateur($util);
586
			}
2192 mathias 587
		} else {
588
			echo "Réduction de tous les mots clés $mode \n";
589
			$req_utilisateurs = "SELECT DISTINCT id_utilisateur FROM ".$table;
590
			$utilisateurs = $this->bdd->recupererTous($req_utilisateurs);
591
 
592
			foreach($utilisateurs as $utilisateur) {
593
				echo "Utilisateur en cours de traitement : ".$utilisateur['id_utilisateur']." \n";
594
				if($mode == "images") {
595
					$this->reductionMotsClesImagesUtilisateur($utilisateur['id_utilisateur']);
2229 mathias 596
				} elseif($mode == "obs") {
597
					$this->reductionMotsClesObsUtilisateur($utilisateur['id_utilisateur']);
2192 mathias 598
				}
2191 mathias 599
			}
600
		}
601
		echo "Fin de la réduction des mots clés $mode \n";
602
	}
603
 
2192 mathias 604
	private function supprimerMajuscules($table, $colonne, $util=null) {
2191 mathias 605
		$requete = "UPDATE ".$table." SET ".$colonne." = LOWER(".$colonne.")";
2192 mathias 606
		if ($util !== null) {
607
			$requete .= " WHERE id_utilisateur = $util";
608
		}
2191 mathias 609
		$this->bdd->requeter($requete);
610
	}
611
 
2192 mathias 612
	private function supprimerAccents($table, $colonne, $util=null) {
2191 mathias 613
 
614
		$requetes = array(
615
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Š','S')",
616
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'š','s')",
617
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ð','Dj')",
618
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ž','Z')",
619
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ž','z')",
620
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'À','A')",
621
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Á','A')",
622
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Â','A')",
623
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ã','A')",
624
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ä','A')",
625
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Å','A')",
626
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Æ','A')",
627
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ç','C')",
628
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'È','E')",
629
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'É','E')",
630
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ê','E')",
631
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ë','E')",
632
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ì','I')",
633
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Í','I')",
634
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Î','I')",
635
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ï','I')",
636
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ñ','N')",
637
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ò','O')",
638
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ó','O')",
639
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ô','O')",
640
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Õ','O')",
641
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ö','O')",
642
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ø','O')",
643
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ù','U')",
644
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ú','U')",
645
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Û','U')",
646
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ü','U')",
647
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Ý','Y')",
648
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Þ','B')",
649
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ß','Ss')",
650
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'à','a')",
651
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'á','a')",
652
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'â','a')",
653
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ã','a')",
654
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ä','a')",
655
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'å','a')",
656
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'æ','a')",
657
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ç','c')",
658
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'è','e')",
659
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'é','e')",
660
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ê','e')",
661
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ë','e')",
662
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ì','i')",
663
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'í','i')",
664
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'î','i')",
665
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ï','i')",
666
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ð','o')",
667
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ñ','n')",
668
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ò','o')",
669
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ó','o')",
670
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ô','o')",
671
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'õ','o')",
672
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ö','o')",
673
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ø','o')",
674
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ù','u')",
675
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ú','u')",
676
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'û','u')",
677
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ý','y')",
678
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ý','y')",
679
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'þ','b')",
680
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ÿ','y')",
681
			"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ƒ','f')",
682
		);
683
 
684
		foreach($requetes as $requete) {
2192 mathias 685
			if ($util !== null) {
686
				$requete .= " WHERE id_utilisateur = $util";
687
			}
2191 mathias 688
			$this->bdd->requeter($requete);
689
		}
690
	}
2094 mathias 691
}
692
?>