Subversion Repositories eFlore/Applications.cel

Rev

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