Subversion Repositories eFlore/Applications.cel

Rev

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