Subversion Repositories eFlore/Applications.cel

Rev

Rev 2172 | 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"),
2184 mathias 8
		'-util' => array(false, '1', "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' :
2184 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;
2184 mathias 58
				case 'reductionMotsClesImagesUtil' :
59
					// ex: cli.php maintenance -a reductionMotsClesImagesUtil -util 6865
60
					$idUtilisateur = $this->getParametre('util');
61
					$this->reductionMotsClesImagesUtilisateur($idUtilisateur);
62
					break;
2094 mathias 63
				default :
64
					$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
65
						"Commandes existantes : regenererMotsClesTexteImages, regenererMotsClesTexteObs";
66
					throw new Exception($msg);
67
			}
68
		} catch (Exception $e) {
69
			$this->traiterErreur($e->getMessage());
70
		}
71
	}
72
 
73
	// Régénère le champ "mots_cles_texte" pour toutes les images ayant des mots clés mais ayant ce champ
74
	// vide, suite à une erreur
2103 aurelien 75
	protected function regenererMotsClesTexteImages($tout = false) {
76
		$req = "SELECT id_image FROM cel_images WHERE ".
77
				"id_image IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
78
		if(!$tout) {
79
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
80
		}
2094 mathias 81
		$res = $this->bdd->recupererTous($req);
82
		echo count($res) . " images trouvées\n";
83
		foreach ($res as $image) {
84
			$req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm "
85
				. "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'] . "') "
86
				. "WHERE id_image = '" . $image['id_image'] . "'";
87
			$this->bdd->requeter($req);
88
		}
89
	}
90
 
91
	// Régénère le champ "mots_cles_texte" pour toutes les observations ayant des mots clés mais ayant ce champ
92
	// vide, suite à une erreur
2103 aurelien 93
	protected function regenererMotsClesTexteObs($tout = false) {
94
		$req = "SELECT id_observation FROM cel_obs WHERE ".
95
				"id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_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) . " observations trouvées\n";
101
		foreach ($res as $image) {
102
			$req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm "
103
			. "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'] . "') "
104
				. "WHERE id_observation = '" . $image['id_observation'] . "'";
105
			$this->bdd->requeter($req);
106
		}
107
	}
2095 mathias 108
 
109
	// Vide le champ "mots_cles_texte" pour toutes les images n'ayant aucun mot clé
110
	protected function viderMotsClesTexteImagesSansMotsCles() {
111
		$req = "UPDATE cel_images SET mots_cles_texte = NULL WHERE id_image NOT IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
112
		$res = $this->bdd->requeter($req);
113
		echo "$res images mises à jour\n";
114
	}
115
 
116
	// Vide le champ "mots_cles_texte" pour toutes les obs n'ayant aucun mot clé
117
	protected function viderMotsClesTexteObsSansMotsCles() {
118
		$req = "UPDATE cel_obs SET mots_cles_texte = NULL WHERE id_observation NOT IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
119
		$res = $this->bdd->requeter($req);
120
		echo "$res observations mises à jour\n";
121
	}
2100 aurelien 122
 
123
	protected function regenererChampsTailleImage() {
124
		$req = "SELECT id_image FROM cel_images WHERE hauteur = 0 OR largeur = 0";
125
		$res = $this->bdd->recupererTous($req);
126
 
127
		echo count($res)." images concernees \n";
128
		echo "Début du traitement \n";
129
		$images_maj = 0;
130
		$image_meta_ratees = 0;
131
		$images_inexistantes = 0;
132
 
133
		foreach($res as $image) {
134
			$chemin = $this->getCheminImage($image['id_image']);
135
			if(file_exists($chemin)) {
136
				list($largeur, $hauteur) = @getimagesize($chemin);
137
				if(is_numeric($largeur) && is_numeric($hauteur)) {
138
					$req_maj = "UPDATE cel_images SET hauteur = '".$hauteur."', largeur = '".$largeur."' ".
139
					           "WHERE id_image = '".$image['id_image']."'";
140
					$maj_taille_image = $this->bdd->requeter($req_maj);
141
					if($maj_taille_image) {
142
						$images_maj++;
143
					}
144
				} else {
145
					$image_meta_ratees++;
146
				}
147
			} else {
148
				$images_inexistantes++;
149
			}
150
			$this->afficherAvancement("\tImages traitées : ", 1);
151
		}
152
		echo "\n";
153
		echo "Fin de la régénération des tailles des images à partir des metadonnées \n";
154
		echo $images_maj." images ont vu leur infos de taille régénérées \n";
155
		echo $image_meta_ratees." images ont raté l'extraction de metadonnées \n";
156
		echo $images_inexistantes." images n'existent pas en tant que fichier \n";
157
	}
158
 
159
	private function getCheminImage($id) {
160
		$chemin_base = Config::get('dossierImages');
161
 
162
		$id = sprintf('%09s', $id);
163
		$id = wordwrap($id, 3 , '_', true);
164
 
165
		list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
166
 
2119 aurelien 167
		$chemin = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/O/'.$id.'_O.jpg';
2100 aurelien 168
 
169
		return $chemin;
170
	}
2102 aurelien 171
 
172
	protected function reparerLiaisonsOublieesObs() {
173
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
174
		// dans la table de liaison il est souvent vide
175
		$requete_liaisons = "SELECT com.id_observation, com.id_mot_cle_obs, co.ce_utilisateur ".
176
					"FROM `cel_obs_mots_cles` com INNER JOIN cel_obs co ON co.id_observation = com.id_observation ";
177
 
178
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
179
		$nb_liaisons_originales = count($liaisons);
180
 
181
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
182
		$requete_mots_cles = "SELECT id_mot_cle_obs, id_utilisateur, mot_cle FROM cel_mots_cles_obs ";
183
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
184
 
185
		$anciens_mots_cles_fmt = array();
186
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
187
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
188
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
189
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
190
			}
191
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_obs']] = $ancien_mot_cle;
192
		}
193
 
194
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
195
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_obs";
196
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
197
 
198
		$nouveau_mots_cles_fmt = array();
199
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
200
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
201
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
202
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
203
			}
2137 mathias 204
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][strtolower($nouveau_mot_cle['mot_cle'])] = $nouveau_mot_cle;
2102 aurelien 205
		}
206
 
207
		$anciens_mot_cles_pas_trouves = 0;
208
		$nouveaux_mot_cles_pas_trouves = 0;
209
		$utilisateurs_pas_trouves = 0;
210
		$valeurs_a_inserer = array();
211
 
212
		$ids_obs = array();
213
 
214
		foreach($liaisons as &$liaison) {
215
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
216
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_obs'];
217
 
218
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
219
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
220
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
2137 mathias 221
					$texte_ancien_mot_cle = strtolower($texte_ancien_mot_cle); // l'astuce de ouf !
2102 aurelien 222
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
223
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
224
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
225
 
226
							$valeurs_a_inserer[] = array(
227
													'id_element_lie' => $liaison['id_observation'],
228
													'id_mot_cle' => $nouvel_id_mot_cle,
229
													'ancienne_liaison' => $liaison
230
							);
231
							$ids_obs[] = $liaison['id_observation'];
232
						} else {
233
							$nouveaux_mot_cles_pas_trouves++;
234
						}
235
					} else {
236
 
237
					}
238
 
239
				} else {
240
					$anciens_mot_cles_pas_trouves++;
241
				}
242
			} else {
243
				$utilisateurs_pas_trouves++;
244
			}
245
		}
246
 
247
		echo "Anciennes liaisons ".$nb_liaisons_originales." \n";
248
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
249
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
250
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
251
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
252
 
253
		$tranches = array_chunk($valeurs_a_inserer, 800);
254
 
255
		foreach($tranches as $tranche) {
256
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ".
257
					                      "VALUES ";
258
			foreach($tranche as $l) {
259
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
260
			}
261
			$requete_insertion = rtrim($requete_insertion, ',');
262
			$insertion = $this->bdd->requeter($requete_insertion);
263
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
264
		}
265
		echo "\n";
266
	}
267
 
268
	private function reparerLiaisonsOublieesImages() {
269
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
270
		// dans la table de liaison il est souvent vide
271
		$requete_liaisons = "SELECT cim.id_image, cim.id_mot_cle_image, ci.ce_utilisateur ".
272
							"FROM cel_images_mots_cles cim INNER JOIN cel_images ci ON ci.id_image = cim.id_image ";
273
 
274
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
275
 
276
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
277
		$requete_mots_cles = "SELECT id_mot_cle_image, id_utilisateur, mot_cle FROM cel_mots_cles_images ";
278
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
279
 
280
		$anciens_mots_cles_fmt = array();
281
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
282
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
283
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
284
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
285
			}
286
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_image']] = $ancien_mot_cle;
287
		}
288
 
289
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
290
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_images";
291
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
292
 
293
		$nouveau_mots_cles_fmt = array();
294
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
295
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
296
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
297
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
298
			}
299
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
300
		}
301
 
302
		$anciens_mot_cles_pas_trouves = 0;
303
		$nouveaux_mot_cles_pas_trouves = 0;
304
		$utilisateurs_pas_trouves = 0;
305
		$valeurs_a_inserer = array();
306
 
307
		foreach($liaisons as &$liaison) {
308
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
309
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_image'];
310
 
311
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
312
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
313
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
314
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
315
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
316
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
317
 
318
							$valeurs_a_inserer[] = array(
319
															'id_element_lie' => $liaison['id_image'],
320
															'id_mot_cle' => $nouvel_id_mot_cle,
321
															'ancienne_liaison' => $liaison
322
							);
323
							$ids_imgs[] = $liaison['id_image'];
324
						} else {
325
							$nouveaux_mot_cles_pas_trouves++;
326
						}
327
					} else {
328
 
329
					}
330
 
331
				} else {
332
					$anciens_mot_cles_pas_trouves++;
333
				}
334
			} else {
335
				$utilisateurs_pas_trouves++;
336
			}
337
		}
338
 
339
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
340
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
341
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
342
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
343
 
344
		$tranches = array_chunk($valeurs_a_inserer, 800);
345
 
346
		foreach($tranches as $tranche) {
347
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_images_liaison (id_element_lie, id_mot_cle) ".
348
					                      "VALUES ";
349
			foreach($tranche as $l) {
350
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
351
			}
352
			$requete_insertion = rtrim($requete_insertion, ',');
353
			$insertion = $this->bdd->requeter($requete_insertion);
354
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
355
		}
356
		echo "\n";
357
	}
2139 mathias 358
 
359
	private function reparerLiaisonsObsParMotsClesTexte($mot_cle_texte_recherche) {
360
		$ancienne_table_obs = Config::get('table_obs_recup');
361
		$requete_anciens_mots_cles_texte = "SELECT ce_utilisateur, id_observation, mots_cles_texte ".
362
											"FROM ".$ancienne_table_obs." WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%'";
363
		$obs_a_mot_cle = $this->bdd->recupererTous($requete_anciens_mots_cles_texte);
364
 
365
		$requete_nouveaux_mots_cle = "SELECT * FROM cel_arbre_mots_cles_obs ".
366
									"WHERE id_utilisateur IN ".
367
									"(SELECT id_utilisateur FROM ".$ancienne_table_obs." ".
368
									"WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%')";
369
		$nouveaux_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cle);
370
 
371
		$mots_cles_indexes = array();
372
		foreach($nouveaux_mots_cles as $mot_cle) {
373
			$mots_cles_indexes[$mot_cle['id_utilisateur']][strtolower($mot_cle['mot_cle'])] = $mot_cle;
374
		}
375
 
376
		$liaisons_a_inserer = array();
377
		$utilFoirax = 0;
378
		$mcFoirax = 0;
379
		foreach($obs_a_mot_cle as $obs) {
380
			$mots_cles_texte_tab = explode(',', $obs['mots_cles_texte']);
381
			$id_observation = $obs['id_observation'];
382
			$id_utilisateur = $obs['ce_utilisateur'];
383
			foreach($mots_cles_texte_tab as $mot_cle_t) {
384
				if($mot_cle_t == $mot_cle_texte_recherche) {
385
					if (isset($mots_cles_indexes[$id_utilisateur])) {
386
						if (isset($mots_cles_indexes[$id_utilisateur][strtolower($mot_cle_t)])) {
387
							$id_nouveau_mot_cle = $mots_cles_indexes[$id_utilisateur][strtolower($mot_cle_t)]['id_mot_cle'];
388
						} else {
389
							$mcFoirax++;
390
						}
391
					} else {
392
						$utilFoirax++;
393
					}
394
					$liaisons_a_inserer[] = array('id_element_lie' => $id_observation, 'id_mot_cle' => $id_nouveau_mot_cle);
395
				}
396
			}
397
		}
398
		echo "Utilisateurs pas dans le tableau: $utilFoirax\n";
399
		echo "Motf-clefs pas dans le tableau: $mcFoirax\n";
2140 mathias 400
		//echo '<pre>'.print_r($liaisons_a_inserer, true).'</pre>';
401
		echo "Liaisons à insérer: " . count($liaisons_a_inserer) . " \n";
402
 
403
		$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ".
404
				"VALUES ";
405
		foreach($liaisons_a_inserer as $l) {
406
			$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
407
		}
408
		$requete_insertion = rtrim($requete_insertion, ',');
409
		$insertion = $this->bdd->requeter($requete_insertion);
2139 mathias 410
	}
2142 mathias 411
 
412
	// Change toutes les associations images - mots_cles dont l'id mot_cle est $idDoublon, pour le remplacer par $idCible
2184 mathias 413
	private function reductionMotsClesImages($idDoublon, $idCible, $supprimerVieuxMotsCles=true) {
414
		echo "Réduction de $idDoublon à $idCible" . PHP_EOL;
415
 
2142 mathias 416
		$q1 = "SELECT id_element_lie FROM cel_mots_cles_images_liaison WHERE id_mot_cle = $idCible;";
417
		$r1 = $this->bdd->requeter($q1);
418
		$idsImages = array();
419
		foreach ($r1 as $r) {
420
			$idsImages[] = $r['id_element_lie'];
421
		}
422
 
2184 mathias 423
		if (count($idsImages) > 0) {
424
			// On vire ceux qui ont le doublon mais qui ont aussi la cible
425
			$q2 = "DELETE FROM cel_mots_cles_images_liaison WHERE id_mot_cle = $idDoublon AND id_element_lie IN (" . implode(',', $idsImages) . ");";
426
			$r2 = $this->bdd->requeter($q2);
427
		}
428
 
2142 mathias 429
		// On convertit tous les doublons en cible
430
		$q3 = "UPDATE cel_mots_cles_images_liaison SET id_mot_cle = $idCible WHERE id_mot_cle = $idDoublon;";
431
		$r3 = $this->bdd->requeter($q3);
2184 mathias 432
 
433
		if ($supprimerVieuxMotsCles) {
434
			// On supprime le mot cle qui sert plus à rien
435
			$q4 = "DELETE FROM cel_arbre_mots_cles_images WHERE id_mot_cle = $idDoublon;";
436
			$r4 = $this->bdd->requeter($q4);
437
		}
2142 mathias 438
	}
2184 mathias 439
 
440
	// Parcourt l'arbre des mots-cles images de l'utilisateur dont l'id est $idUtilisateur, et réduit tous ceux dont le chemin
441
	// n'est pas unique
442
	private function reductionMotsClesImagesUtilisateur($idUtilisateur) {
443
		$q1 = "SELECT id_mot_cle, chemin FROM cel_arbre_mots_cles_images WHERE id_utilisateur = $idUtilisateur;";
444
		$r1 = $this->bdd->requeter($q1);
445
 
446
		$idsMotsCles = array();
447
		$nbVieux = 0;
448
		foreach ($r1 as $r) {
449
			$k = strtolower($r['chemin']);
450
			if (! isset($idsMotsCles[$k])) {
451
				$idsMotsCles[$k] = array();
452
			}
453
			$idsMotsCles[$k][] = $r['id_mot_cle'];
454
			$nbVieux++;
455
		}
456
		$nbNouveaux = count($idsMotsCles);
457
 
458
		echo "Réduction de $nbVieux à $nbNouveaux mots-cles" . PHP_EOL;
459
		$aTraiter = 0;
460
		foreach ($idsMotsCles as $chemin => $ids) {
461
			if (count($ids) > 1) {
462
				$aTraiter ++;
463
				$idCible = array_shift($ids);
464
				foreach ($ids as $idDoublon) {
465
					$this->reductionMotsClesImages($idDoublon, $idCible);
466
				}
467
			}
468
		}
469
		echo "$aTraiter groupes ont été réduits" . PHP_EOL;
470
	}
2094 mathias 471
}
472
?>