Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2415 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Mise à jour de la base de données afin de l'optimiser :
5
 * - suppression de la table cel_obs_images
6
 * - remplacement du champ "eflore_publiable" de la table "cel_images" par un champ "transmission" (correspondant au champ tansmission des obs)
7
 * - ajout du champ "date_liaison" dans la table "cel_images"
8
 *
9
 * Utilisation :
10
 * - mise à jour de la bdd : <code>/opt/lamp/bin/php cli.php migration_optimisation -a migrer</code>
11
 *
12
 * @category   CEL
13
 * @package    Scripts
14
 * @subpackage Migration : Optimisation
15
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
16
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
17
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
18
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
21
 */
22
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
23
 
24
class MigrationOptimisation extends Script {
25
 
26
	public function executer() {
27
		$cmd = $this->getParametre('a');
28
		$this->mode_verbeux = $this->getParametre('v');
29
 
30
		switch($cmd) {
31
			case 'celObsImages':
32
				$this->migrerCelObsImages();
33
			break;
34
 
35
			case 'images':
36
				$this->mode = $cmd;
37
				$this->migrerMotsClesImages();
38
			break;
39
 
40
			default:
41
				echo 'Méthode inconnue, les méthodes possibles sont obs et images'."\n";
42
		}
43
	}
44
 
45
	private function migrerCelObsImages() {
46
		$this->dao = new Dao('obs');
47
		$this->convertirNestedSetVersPathEnum();
48
	}
49
 
50
	private function migrerMotsClesImages() {
51
		$this->dao = new Dao('images');
52
		$this->convertirNestedSetVersPathEnum();
53
	}
54
 
55
	private function convertirNestedSetVersPathEnum() {
56
 
57
		$debut = microtime();
58
 
59
		$this->dao->viderTables();
60
 
61
		$mots_cles_hierarchiques = $this->dao->obtenirMotsClesOriginaux($this->mode);
62
		$mots_cles_hierarchiques = $this->formaterChemin($mots_cles_hierarchiques);
63
 
64
		$liaisons = $this->dao->obtenirLiaisonsMotsClesOriginaux($this->mode);
65
 
66
		if($this->mode_verbeux) {
67
			echo "-------------------------------------------------------------------\n";
68
			echo " Début de la migration des mots clés ".$this->mode." \n";
69
			echo " ".count($mots_cles_hierarchiques)." mots clés et ".count($liaisons)." liaisons à migrer \n";
70
			echo "-------------------------------------------------------------------\n";
71
		}
72
 
73
		$nb_mots_cles = 0;
74
		$nb_liaisons = 0;
75
 
76
		$mots_cles_slice = array_chunk($mots_cles_hierarchiques, 800, true);
77
		echo " Insertion des mots clés par paquet de 800 \n";
78
		foreach($mots_cles_slice as &$mots_cles_tranche) {
79
			$this->dao->insererMotsCles($mots_cles_tranche);
80
			$nb_mots_cles += 800;
81
			if($this->mode_verbeux) {
82
				$this->afficherAvancement(' mots clés insérés ', $nb_mots_cles);
83
			}
84
		}
85
		echo "\n Insertion des mots clés ".$this->mode." terminée \n";
86
 
87
		$infos_nouveaux_mots_cles = $this->dao->obtenirInfosNouveauxMotsCles();
88
		$correspondances = $this->formaterCorrespondanceCheminId($infos_nouveaux_mots_cles);
89
 
90
		$liaisons_slice = array_chunk($liaisons, 800, true);
91
		echo " Insertion des mots liaisons par paquet de 800 \n";
92
		foreach($liaisons_slice as &$liaison_tranche) {
93
			$this->dao->insererLiaisonsMotsCles($mots_cles_hierarchiques, $liaison_tranche, $correspondances);
94
			$nb_liaisons += 800;
95
			if($this->mode_verbeux) {
96
				$this->afficherAvancement(' liaisons insérées ', $nb_liaisons);
97
			}
98
		}
99
		echo "\n Insertion des liaisons ".$this->mode." terminée \n";
100
 
101
		$fin = microtime(true);
102
		if($this->mode_verbeux) {
103
			echo "\n";
104
			echo "-------------------------------------------------------------------\n";
105
			echo "  Fin de la migration des mots clés ".$this->mode.", \n";
106
			echo "  ".($fin - $debut)." secondes écoulées \n";
107
			echo "  ".count($mots_cles_hierarchiques)." mots clés insérés \n";
108
			echo "  ".count($liaisons)." liaisons insérées \n";
109
			echo "-------------------------------------------------------------------\n";
110
			echo "\n";
111
		}
112
	}
113
 
114
	private function formaterCorrespondanceCheminId($infos_nouveaux_mots_cles) {
115
		$mots_cles_correspondances = array();
116
		foreach($infos_nouveaux_mots_cles as &$mot) {
117
			$cle = $mot['chemin'].'-'.$mot['id_utilisateur'];
118
			$mots_cles_correspondances[$cle] = $mot;
119
		}
120
		return $mots_cles_correspondances;
121
	}
122
 
123
	private function formaterChemin($mots_cles) {
124
		$mots_cles_hierarchiques = array();
125
		$chemin_traites = array();
126
		$pbs = array('doublons' => array(), 'vides' => array());
127
 
128
		foreach($mots_cles as &$mot) {
129
 
130
			if(trim($mot['mot_cle']) != "") {
131
				$chemin = '/';
132
				$cle_parent = $mot['parent'].'-'.$mot['id_utilisateur'];
133
				if(isset($mots_cles_hierarchiques[$cle_parent])) {
134
					$chemin = $mots_cles_hierarchiques[$cle_parent]['chemin'];
135
				}
136
				$chemin .= self::simplifier($mot['mot_cle']).'/';
137
				$chemin = str_replace("//", "/", $chemin);
138
 
139
				if(!isset($chemin_traites[self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']])) {
140
					$cle = $mot['id_mot_cle'].'-'.$mot['id_utilisateur'];
141
 
142
					$mots_cles_hierarchiques[$cle] = array(
143
												'id_utilisateur' => $mot['id_utilisateur'],
144
												'chemin' => $chemin,
145
												'mot_cle' => $mot['mot_cle']
146
					);
147
					$chemin_traites[self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']] = 1;
148
				} else {
149
					$pbs['doublons'][self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']] = $mot;
150
				}
151
			} else {
152
				$pbs['vides'][] = $mot;
153
			}
154
		}
155
 
156
		//echo '<pre>'.print_r($mots_cles_hierarchiques,true).'</pre>';exit;
157
		return $mots_cles_hierarchiques;
158
	}
159
 
160
	static public function harmoniserPourDoublon($texte) {
161
		$texte = htmlentities($texte, ENT_NOQUOTES, 'utf-8');
162
		$texte = preg_replace('/&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);/', '\1', $texte);
163
		$texte = preg_replace('/&([A-za-z]{2})(?:lig);/', '\1', $texte); // pour les ligatures e.g. '&oelig;'
164
		$texte = preg_replace('/&[^;]+;/', '', $texte); // supprime les autres caractères
165
 
166
		return strtolower($texte);
167
	}
168
 
169
	static public function simplifier($text) {
170
		// le slash est le seul caractère interdit dans les mots clés
171
		return trim(str_replace(array('\\','/'), '', $text));
172
	}
173
}