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