Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 901 | Rev 950 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 901 Rev 902
1
<?php
1
<?php
2
/**
2
/**
3
*
3
*
4
*  fonctions et paramètres communs aux traitement des syntaxons
4
*  fonctions et paramètres communs aux traitement des syntaxons
5
*   - traitement de l'ontologie
5
*   - traitement de l'ontologie
6
*   - fonction utiles pour les paramètres de configuration entre autres
6
*   - fonction utiles pour les paramètres de configuration entre autres
7
*   - traitement des tables et de leur version
7
*   - traitement des tables et de leur version
8
*   - traitement de la requête
8
*   - traitement de la requête
9
*
9
*
10
* @package eflore-projets
10
* @package eflore-projets
11
* @author mathilde Salthun-Lassalle
11
* @author mathilde Salthun-Lassalle
12
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
12
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
13
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
* @version 1.0
14
* @version 1.0
15
* @copyright 1999-2012 Tela Botanica (accueil@tela-botanica.org)
15
* @copyright 1999-2012 Tela Botanica (accueil@tela-botanica.org)
16
*/
16
*/
17
 
17
 
18
class SyntaxonsCommun  extends Commun {
18
class SyntaxonsCommun  extends Commun {
19
	
19
	
20
	
20
	
21
	protected $table = "";
21
	protected $table = "";
22
	protected $format_reponse = 'syntaxons';
22
	protected $format_reponse = 'syntaxons';
23
	protected $serviceNom = 'syntaxons';
23
	protected $serviceNom = 'syntaxons';
24
	protected $Bdd;
24
	protected $Bdd;
25
	protected $syn;
25
	protected $syn;
26
	protected $niv;
26
	protected $niv;
27
	protected $limite_requete = array('depart' => 0, 'limite' => 100);
27
	protected $limite_requete = array('depart' => 0, 'limite' => 100);
28
	protected $requete_condition = '';
28
	protected $requete_condition = '';
29
	protected $total_resultat;
29
	protected $total_resultat;
30
	protected $champs_recherches = ' * ';
30
	protected $champs_recherches = ' * ';
31
	protected $table_version;
31
	protected $table_version;
32
	protected $version_projet = '+' ;
32
	protected $version_projet = '+' ;
33
	protected $cache = array();	
33
	protected $cache = array();	
34
	
34
	
35
	
35
	
36
	public function __construct(Conteneur $conteneur) {
36
	public function __construct(Conteneur $conteneur) {
37
		$this->Bdd = $conteneur->getBdd();
37
		$this->Bdd = $conteneur->getBdd();
38
		$this->syn = $this->getParametreTableauSpe('synonymes');
38
		$this->syn = $this->getParametreTableauSpe('synonymes');
39
		$this->niv = $this->getParametreTableauSpe('niveaux');
39
		$this->niv = $this->getParametreTableauSpe('niveaux');
40
	}
40
	}
41
	
41
	
42
 
42
 
43
	
43
	
44
 
44
 
45
	
45
	
46
	//+---------------------------------------------------outils------------------------------------------------//
46
	//+---------------------------------------------------outils------------------------------------------------//
47
	protected function getParametreTableauSpe($cle) {
47
	protected function getParametreTableauSpe($cle) {
48
		$tableau = array();
48
		$tableau = array();
49
		$parametre = Config::get($cle);
49
		$parametre = Config::get($cle);
50
		if (empty($parametre) === false) {
50
		if (empty($parametre) === false) {
51
			$tableauPartiel = explode(',', $parametre);
51
			$tableauPartiel = explode(',', $parametre);
52
			$tableauPartiel = array_map('trim', $tableauPartiel);
52
			$tableauPartiel = array_map('trim', $tableauPartiel);
53
			foreach ($tableauPartiel as $champ) {
53
			foreach ($tableauPartiel as $champ) {
54
				$tableau[] = trim($champ,"'");// spécificité pour le = ? des synonymes
54
				$tableau[] = trim($champ,"'");// spécificité pour le = ? des synonymes
55
			}
55
			}
56
		}
56
		}
57
		return $tableau;
57
		return $tableau;
58
	}
58
	}
59
	
59
	
60
	//la fonction php array_filters ne marche pas sur le serveur
60
	//la fonction php array_filters ne marche pas sur le serveur
61
	protected function enleverValeursVides($tableau) {
61
	protected function enleverValeursVides($tableau) {
62
		$tab = array();
62
		$tab = array();
63
		foreach ($tableau as $cle => $valeur) {
63
		foreach ($tableau as $cle => $valeur) {
64
			if ($valeur != '' && is_int($cle)) {
64
			if ($valeur != '' && is_int($cle)) {
65
				$tab[] = $valeur;
65
				$tab[] = $valeur;
66
			} elseif ($valeur != '' && is_string($cle)) {
66
			} elseif ($valeur != '' && is_string($cle)) {
67
				$tab[$cle] = $valeur;
67
				$tab[$cle] = $valeur;
68
			}
68
			}
69
		}
69
		}
70
		return $tab;
70
		return $tab;
71
	}
71
	}
72
	
72
	
73
	//+++------------------------------traitement des versions----------------------------------------++
73
	//+++------------------------------traitement des versions----------------------------------------++
74
	
74
	
75
	protected function traiterVersion($valeur) {
75
	protected function traiterVersion($valeur) {
76
		if (preg_match('/^[0-9]+(?:[._][0-9]+)*$/', $valeur) || $valeur == '+' || $valeur == '*') {
76
		if (preg_match('/^[0-9]+(?:[._][0-9]+)*$/', $valeur) || $valeur == '+' || $valeur == '*') {
77
			$this->version_projet = $valeur;
77
			$this->version_projet = $valeur;
78
		} else {
78
		} else {
79
			$e = "Erreur : La version est inconnue.";
79
			$e = "Erreur : La version est inconnue.";
80
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
80
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
81
		}
81
		}
82
	}
82
	}
83
	
83
	
84
	protected function definirTables() {
84
	protected function definirTables() {
85
		$table_num_version = $this->recupererVersionDisponible();
85
		$table_num_version = $this->recupererVersionDisponible();
86
		$prefixe_table = config::get('bdd_table');
86
		$prefixe_table = config::get('bdd_table');
87
		if ( in_array($this->version_projet,$table_num_version) ) {
87
		if ( in_array($this->version_projet,$table_num_version) ) {
88
			$this->table_version[] = $prefixe_table.'_v'.$this->version_projet;
88
			$this->table_version[] = $prefixe_table.'_v'.$this->version_projet;
89
		} elseif ($this->version_projet == '+') {
89
		} elseif ($this->version_projet == '+') {
90
			$derniere_version = $table_num_version[count($table_num_version) - 1];
90
			$derniere_version = $table_num_version[count($table_num_version) - 1];
91
			$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $derniere_version);
91
			$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $derniere_version);
92
		} elseif ($this->version_projet == '*') {
92
		} elseif ($this->version_projet == '*') {
93
			foreach ($table_num_version as $num_version) {
93
			foreach ($table_num_version as $num_version) {
94
				$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $num_version);
94
				$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $num_version);
95
			}
95
			}
96
		} else {
96
		} else {
97
			$e = "Erreur : La version est inconnue.";
97
			$e = "Erreur : La version est inconnue.";
98
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
98
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
99
		}
99
		}
100
	}
100
	}
101
	
101
	
102
	//+------------------------------------ontologies----------------------------------------------------+
102
	//+------------------------------------ontologies----------------------------------------------------+
103
	
103
	
104
	protected function recupererOntologiesNiveau($valeur, $code){
104
	protected function recupererOntologiesNiveau($valeur, $code){
105
		$ontologie = array();
105
		$ontologie = array();
106
		$url = Config::get('url_service_base').Config::get('nom_projet').
106
		$url = Config::get('url_service_base').Config::get('nom_projet').
107
							'/ontologies/'.$code.':'.urlencode(urlencode($valeur));
107
							'/ontologies/'.$code.':'.urlencode(urlencode($valeur));
108
		if(array_key_exists($url, $this->cache)) {
108
		if(array_key_exists($url, $this->cache)) {
109
			$val = $this->cache[$url];
109
			$val = $this->cache[$url];
110
			error_log("from cache");
-
 
111
		} else {
110
		} else {
112
			$val = $this->consulterHref($url);
111
			$val = $this->consulterHref($url);
113
			$this->cache[$url] = $val;
112
			$this->cache[$url] = $val;
114
		}
113
		}
115
		$ontologie['niveau.code'] = $valeur;
114
		$ontologie['niveau.code'] = $valeur;
116
		$ontologie['niveau.libelle'] = $val->nom;
115
		$ontologie['niveau.libelle'] = $val->nom;
117
		$ontologie['niveau.href'] = $url;
116
		$ontologie['niveau.href'] = $url;
118
		return $ontologie;
117
		return $ontologie;
119
	}
118
	}
120
	
119
	
121
	protected  function recupererOntologiesNiveauSyn($niveau){
120
	protected  function recupererOntologiesNiveauSyn($niveau){
122
		$ontologie = array();
121
		$ontologie = array();
123
		$synonymes = explode(' ',$niveau[1]);
122
		$synonymes = explode(' ',$niveau[1]);
124
		$libelle = array();
123
		$libelle = array();
125
		$detail = array();
124
		$detail = array();
126
		foreach ($synonymes as $syn) {
125
		foreach ($synonymes as $syn) {
127
			if ($syn == '=') {
126
			if ($syn == '=') {
128
				$syn = 'equi';
127
				$syn = 'equi';
129
			} elseif ($syn == '= ?') {
128
			} elseif ($syn == '= ?') {
130
				$syn = 'prob';
129
				$syn = 'prob';
131
			}
130
			}
132
			if ($syn != '' && $syn != '?') {
131
			if ($syn != '' && $syn != '?') {
133
				$detail[] = $this->recupererOntologiesNiveau($syn, 'syn');
132
				$detail[] = $this->recupererOntologiesNiveau($syn, 'syn');
134
				$dernier = end($detail);
133
				$dernier = end($detail);
135
				$libelle[] = $dernier['niveau.libelle'].' ';
134
				$libelle[] = $dernier['niveau.libelle'].' ';
136
			}
135
			}
137
		}
136
		}
138
		$ontologie['niveau.code'] = $niveau[0];
137
		$ontologie['niveau.code'] = $niveau[0];
139
		$ontologie['niveau.libelle'] = 'synonyme '.implode(' - ',$libelle);
138
		$ontologie['niveau.libelle'] = 'synonyme '.implode(' - ',$libelle);
140
		if ($niveau[2]) {
139
		if ($niveau[2]) {
141
			$ontologie['niveau.libelle'] .= ' '.$niveau[2];
140
			$ontologie['niveau.libelle'] .= ' '.$niveau[2];
142
		}
141
		}
143
		$ontologie['niveau.detail'] = $detail;
142
		$ontologie['niveau.detail'] = $detail;
144
		return $ontologie;
143
		return $ontologie;
145
	}
144
	}
146
	
145
	
147
	protected function traiterOntologieNiveau($niveau) {
146
	protected function traiterOntologieNiveau($niveau) {
148
		$ontologie = array();
147
		$ontologie = array();
149
	
148
	
150
		if ( preg_match('/syn {0,1}(['.implode('',$this->syn).']*)( *\[.+\])*/',$niveau,$retour)) {
149
		if ( preg_match('/syn {0,1}(['.implode('',$this->syn).']*)( *\[.+\])*/',$niveau,$retour)) {
151
	
150
	
152
			$ontologie = $this->recupererOntologiesNiveauSyn($retour);
151
			$ontologie = $this->recupererOntologiesNiveauSyn($retour);
153
	
152
	
154
		} else {
153
		} else {
155
			$ontologie = $this->recupererOntologiesNiveau($niveau, 'UP');
154
			$ontologie = $this->recupererOntologiesNiveau($niveau, 'UP');
156
		}
155
		}
157
		return $ontologie;
156
		return $ontologie;
158
	}
157
	}
159
	
158
	
160
	//+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
159
	//+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
161
	
160
	
162
	protected function assemblerLaRequete() {
161
	protected function assemblerLaRequete() {
163
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
162
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
164
		.$this->retournerRequeteCondition().' '.$this->delimiterResultatsRequete();
163
		.$this->retournerRequeteCondition().' '.$this->delimiterResultatsRequete();
165
	
164
	
166
		return $requete;
165
		return $requete;
167
	}
166
	}
168
	
167
	
169
	protected function calculerTotalResultat() {
168
	protected function calculerTotalResultat() {
170
		$requete = 'SELECT count(*) as nombre FROM '.$this->table.' '.$this->retournerRequeteCondition();
169
		$requete = 'SELECT count(*) as nombre FROM '.$this->table.' '.$this->retournerRequeteCondition();
171
	
170
	
172
		$res = $this->getBdd()->recuperer($requete);
171
		$res = $this->getBdd()->recuperer($requete);
173
		if ($res) {
172
		if ($res) {
174
			$this->total_resultat = $res['nombre'];
173
			$this->total_resultat = $res['nombre'];
175
		} else {
174
		} else {
176
			$this->total_resultat = 0;
175
			$this->total_resultat = 0;
177
			$e = 'Données introuvables dans la base';
176
			$e = 'Données introuvables dans la base';
178
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
177
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
179
		}
178
		}
180
	}
179
	}
181
	
180
	
182
	protected function delimiterResultatsRequete() {
181
	protected function delimiterResultatsRequete() {
183
		$this->calculerTotalResultat();
182
		$this->calculerTotalResultat();
184
		$requete_limite = '';
183
		$requete_limite = '';
185
		if (($this->limite_requete['depart'] <=  $this->total_resultat) ){
184
		if (($this->limite_requete['depart'] <=  $this->total_resultat) ){
186
			if (($this->limite_requete['limite'] + $this->limite_requete['depart'] )
185
			if (($this->limite_requete['limite'] + $this->limite_requete['depart'] )
187
			< $this->total_resultat  ){
186
			< $this->total_resultat  ){
188
				$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
187
				$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
189
				.$this->limite_requete['limite'];
188
				.$this->limite_requete['limite'];
190
			}
189
			}
191
		} else {
190
		} else {
192
			$e = "Erreur : la valeur pour le paramètre navigation.départ est supérieure".
191
			$e = "Erreur : la valeur pour le paramètre navigation.départ est supérieure".
193
										" au nombre total de résultats.";
192
										" au nombre total de résultats.";
194
			throw new Exception($e, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
193
			throw new Exception($e, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
195
		}
194
		}
196
		return $requete_limite;
195
		return $requete_limite;
197
	}
196
	}
198
	
197
	
199
	
198
	
200
	
199
	
201
	protected  function retournerRequeteCondition() {
200
	protected  function retournerRequeteCondition() {
202
		$condition = '';
201
		$condition = '';
203
		if (empty($this->requete_condition) == false) {
202
		if (empty($this->requete_condition) == false) {
204
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
203
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
205
		}
204
		}
206
	
205
	
207
		return $condition;
206
		return $condition;
208
	}
207
	}
209
 
208
 
210
}
209
}
211
?>
210
?>