Subversion Repositories eFlore/Applications.cel

Rev

Rev 2098 | Rev 2105 | 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;
5
 
6
	public function __construct($script_nom, $parametres_cli) {
7
		parent::__construct($script_nom, $parametres_cli);
8
		$this->bdd = new Bdd();
9
	}
10
 
11
	public function executer() {
12
		$cmd = $this->getParametre('a');
13
		try {
14
			switch ($cmd) {
15
				case 'regenererMotsClesTexteObs' :
16
					$this->regenererMotsClesTexteObs();
17
					break;
18
				case 'regenererMotsClesTexteImages' :
19
					$this->regenererMotsClesTexteImages();
20
					break;
2104 mathias 21
				case 'regenererMotsClesTexteObsTout' :
22
					$this->regenererMotsClesTexteObs(true);
23
					break;
24
				case 'regenererMotsClesTexteImagesTout' :
25
					$this->regenererMotsClesTexteImages(true);
26
					break;
2095 mathias 27
				case 'viderMotsClesTexteImagesSansMotsCles' :
28
					$this->viderMotsClesTexteImagesSansMotsCles();
29
					break;
30
				case 'viderMotsClesTexteObsSansMotsCles' :
31
					$this->viderMotsClesTexteObsSansMotsCles();
32
					break;
2104 mathias 33
				case 'reparerLiaisonsOublieesObs' :
34
					$this->reparerLiaisonsOublieesObs();
35
					break;
36
				case 'reparerLiaisonsOublieesImages' :
37
					$this->reparerLiaisonsOublieesImages();
38
					break;
2094 mathias 39
				default :
40
					$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
41
						"Commandes existantes : regenererMotsClesTexteImages, regenererMotsClesTexteObs";
42
					throw new Exception($msg);
43
			}
44
		} catch (Exception $e) {
45
			$this->traiterErreur($e->getMessage());
46
		}
47
	}
48
 
49
	// Régénère le champ "mots_cles_texte" pour toutes les images ayant des mots clés mais ayant ce champ
50
	// vide, suite à une erreur
2104 mathias 51
	protected function regenererMotsClesTexteImages($tout = false) {
52
		$req = "SELECT id_image FROM cel_images WHERE ".
53
				"id_image IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
54
		if(!$tout) {
55
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
56
		}
2094 mathias 57
		$res = $this->bdd->recupererTous($req);
58
		echo count($res) . " images trouvées\n";
59
		foreach ($res as $image) {
60
			$req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm "
61
				. "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'] . "') "
62
				. "WHERE id_image = '" . $image['id_image'] . "'";
63
			$this->bdd->requeter($req);
64
		}
65
	}
66
 
67
	// Régénère le champ "mots_cles_texte" pour toutes les observations ayant des mots clés mais ayant ce champ
68
	// vide, suite à une erreur
2104 mathias 69
	protected function regenererMotsClesTexteObs($tout = false) {
70
		$req = "SELECT id_observation FROM cel_obs WHERE ".
71
				"id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
72
		if(!$tout) {
73
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
74
		}
2094 mathias 75
		$res = $this->bdd->recupererTous($req);
76
		echo count($res) . " observations trouvées\n";
77
		foreach ($res as $image) {
78
			$req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm "
79
			. "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'] . "') "
80
				. "WHERE id_observation = '" . $image['id_observation'] . "'";
81
			$this->bdd->requeter($req);
82
		}
83
	}
2095 mathias 84
 
85
	// Vide le champ "mots_cles_texte" pour toutes les images n'ayant aucun mot clé
86
	protected function viderMotsClesTexteImagesSansMotsCles() {
87
		$req = "UPDATE cel_images SET mots_cles_texte = NULL WHERE id_image NOT IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
88
		$res = $this->bdd->requeter($req);
89
		echo "$res images mises à jour\n";
90
	}
91
 
92
	// Vide le champ "mots_cles_texte" pour toutes les obs n'ayant aucun mot clé
93
	protected function viderMotsClesTexteObsSansMotsCles() {
94
		$req = "UPDATE cel_obs SET mots_cles_texte = NULL WHERE id_observation NOT IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
95
		$res = $this->bdd->requeter($req);
96
		echo "$res observations mises à jour\n";
97
	}
2104 mathias 98
 
99
	protected function reparerLiaisonsOublieesObs() {
100
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
101
		// dans la table de liaison il est souvent vide
102
		$requete_liaisons = "SELECT com.id_observation, com.id_mot_cle_obs, co.ce_utilisateur ".
103
					"FROM `cel_obs_mots_cles` com INNER JOIN cel_obs co ON co.id_observation = com.id_observation ";
104
 
105
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
106
		$nb_liaisons_originales = count($liaisons);
107
 
108
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
109
		$requete_mots_cles = "SELECT id_mot_cle_obs, id_utilisateur, mot_cle FROM cel_mots_cles_obs ";
110
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
111
 
112
		$anciens_mots_cles_fmt = array();
113
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
114
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
115
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
116
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
117
			}
118
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_obs']] = $ancien_mot_cle;
119
		}
120
 
121
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
122
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_obs";
123
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
124
 
125
		$nouveau_mots_cles_fmt = array();
126
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
127
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
128
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
129
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
130
			}
131
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
132
		}
133
 
134
		$anciens_mot_cles_pas_trouves = 0;
135
		$nouveaux_mot_cles_pas_trouves = 0;
136
		$utilisateurs_pas_trouves = 0;
137
		$valeurs_a_inserer = array();
138
 
139
		$ids_obs = array();
140
 
141
		foreach($liaisons as &$liaison) {
142
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
143
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_obs'];
144
 
145
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
146
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
147
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
148
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
149
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
150
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
151
 
152
							$valeurs_a_inserer[] = array(
153
													'id_element_lie' => $liaison['id_observation'],
154
													'id_mot_cle' => $nouvel_id_mot_cle,
155
													'ancienne_liaison' => $liaison
156
							);
157
							$ids_obs[] = $liaison['id_observation'];
158
						} else {
159
							$nouveaux_mot_cles_pas_trouves++;
160
						}
161
					} else {
162
 
163
					}
164
 
165
				} else {
166
					$anciens_mot_cles_pas_trouves++;
167
				}
168
			} else {
169
				$utilisateurs_pas_trouves++;
170
			}
171
		}
172
 
173
		echo "Anciennes liaisons ".$nb_liaisons_originales." \n";
174
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
175
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
176
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
177
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
178
 
179
		$tranches = array_chunk($valeurs_a_inserer, 800);
180
 
181
		foreach($tranches as $tranche) {
182
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ".
183
					                      "VALUES ";
184
			foreach($tranche as $l) {
185
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
186
			}
187
			$requete_insertion = rtrim($requete_insertion, ',');
188
			$insertion = $this->bdd->requeter($requete_insertion);
189
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
190
		}
191
		echo "\n";
192
	}
193
 
194
	private function reparerLiaisonsOublieesImages() {
195
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
196
		// dans la table de liaison il est souvent vide
197
		$requete_liaisons = "SELECT cim.id_image, cim.id_mot_cle_image, ci.ce_utilisateur ".
198
							"FROM cel_images_mots_cles cim INNER JOIN cel_images ci ON ci.id_image = cim.id_image ";
199
 
200
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
201
 
202
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
203
		$requete_mots_cles = "SELECT id_mot_cle_image, id_utilisateur, mot_cle FROM cel_mots_cles_images ";
204
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
205
 
206
		$anciens_mots_cles_fmt = array();
207
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
208
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
209
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
210
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
211
			}
212
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_image']] = $ancien_mot_cle;
213
		}
214
 
215
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
216
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_images";
217
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
218
 
219
		$nouveau_mots_cles_fmt = array();
220
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
221
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
222
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
223
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
224
			}
225
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
226
		}
227
 
228
		$anciens_mot_cles_pas_trouves = 0;
229
		$nouveaux_mot_cles_pas_trouves = 0;
230
		$utilisateurs_pas_trouves = 0;
231
		$valeurs_a_inserer = array();
232
 
233
		foreach($liaisons as &$liaison) {
234
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
235
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_image'];
236
 
237
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
238
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
239
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
240
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
241
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
242
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
243
 
244
							$valeurs_a_inserer[] = array(
245
															'id_element_lie' => $liaison['id_image'],
246
															'id_mot_cle' => $nouvel_id_mot_cle,
247
															'ancienne_liaison' => $liaison
248
							);
249
							$ids_imgs[] = $liaison['id_image'];
250
						} else {
251
							$nouveaux_mot_cles_pas_trouves++;
252
						}
253
					} else {
254
 
255
					}
256
 
257
				} else {
258
					$anciens_mot_cles_pas_trouves++;
259
				}
260
			} else {
261
				$utilisateurs_pas_trouves++;
262
			}
263
		}
264
 
265
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
266
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
267
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
268
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
269
 
270
		$tranches = array_chunk($valeurs_a_inserer, 800);
271
 
272
		foreach($tranches as $tranche) {
273
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_images_liaison (id_element_lie, id_mot_cle) ".
274
					                      "VALUES ";
275
			foreach($tranche as $l) {
276
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
277
			}
278
			$requete_insertion = rtrim($requete_insertion, ',');
279
			$insertion = $this->bdd->requeter($requete_insertion);
280
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
281
		}
282
		echo "\n";
283
	}
2094 mathias 284
}
285
?>