Subversion Repositories eFlore/Applications.cel

Rev

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