Subversion Repositories eFlore/Applications.cel

Rev

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