Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 960 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 960 Rev 1302
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
require_once(dirname(__FILE__) . '/../../baseflor/Informations.php');
18
require_once(dirname(__FILE__) . '/../../baseflor/Informations.php');
19
 
19
 
20
class SyntaxonsCommun  extends Commun {
20
class SyntaxonsCommun  extends Commun {
21
	
21
	
22
	
22
	
23
	protected $table = "";
23
	protected $table = "";
24
	protected $format_reponse = 'syntaxons';
24
	protected $format_reponse = 'syntaxons';
25
	protected $serviceNom = 'syntaxons';
25
	protected $serviceNom = 'syntaxons';
26
	protected $Bdd;
26
	protected $Bdd;
27
	protected $syn;
27
	protected $syn;
28
	protected $niv;
28
	protected $niv;
29
	protected $limite_requete = array('depart' => 0, 'limite' => 100);
29
	protected $limite_requete = array('depart' => 0, 'limite' => 100);
30
	protected $requete_condition = array();
30
	protected $requete_condition = array();
31
	protected $total_resultat;
31
	protected $total_resultat;
32
	protected $champs_recherches = ' * ';
32
	protected $champs_recherches = ' * ';
33
	protected $table_version;
33
	protected $table_version;
34
	protected $version_projet = '+' ;
34
	protected $version_projet = '+' ;
35
	static $cache = array();	
35
	static $cache = array();	
36
	
36
	
37
	
37
	
38
	public function __construct(Conteneur $conteneur) {
38
	public function __construct(Conteneur $conteneur) {
39
		$this->Bdd = $conteneur->getBdd();
39
		$this->Bdd = $conteneur->getBdd();
40
		$this->syn = $this->getParametreTableauSpe('Paramètres.synonymes');
40
		$this->syn = $this->getParametreTableauSpe('Paramètres.synonymes');
41
		$this->niv = $this->getParametreTableauSpe('Paramètres.niveaux');
41
		$this->niv = $this->getParametreTableauSpe('Paramètres.niveaux');
42
	}
42
	}
43
	
43
	
44
 
44
 
45
	
45
	
46
 
46
 
47
	
47
	
48
	//+---------------------------------------------------outils------------------------------------------------//
48
	//+---------------------------------------------------outils------------------------------------------------//
49
	protected function getParametreTableauSpe($cle) {
49
	protected function getParametreTableauSpe($cle) {
50
		$tableau = array();
50
		$tableau = array();
51
		$parametre = Config::get($cle);
51
		$parametre = Config::get($cle);
52
		if (empty($parametre) === false) {
52
		if (empty($parametre) === false) {
53
			$tableauPartiel = explode(',', $parametre);
53
			$tableauPartiel = explode(',', $parametre);
54
			$tableauPartiel = array_map('trim', $tableauPartiel);
54
			$tableauPartiel = array_map('trim', $tableauPartiel);
55
			foreach ($tableauPartiel as $champ) {
55
			foreach ($tableauPartiel as $champ) {
56
				$tableau[] = trim($champ,"'");// spécificité pour le = ? des synonymes
56
				$tableau[] = trim($champ,"'");// spécificité pour le = ? des synonymes
57
			}
57
			}
58
		}
58
		}
59
		return $tableau;
59
		return $tableau;
60
	}
60
	}
61
	
61
	
62
	//la fonction php array_filters ne marche pas sur le serveur
62
	//la fonction php array_filters ne marche pas sur le serveur
63
	protected function enleverValeursVides($tableau) {
63
	protected function enleverValeursVides($tableau) {
64
		$tab = array();
64
		$tab = array();
65
		foreach ($tableau as $cle => $valeur) {
65
		foreach ($tableau as $cle => $valeur) {
66
			if ($valeur != '' && is_int($cle)) {
66
			if ($valeur != '' && is_int($cle)) {
67
				$tab[] = $valeur;
67
				$tab[] = $valeur;
68
			} elseif ($valeur != '' && is_string($cle)) {
68
			} elseif ($valeur != '' && is_string($cle)) {
69
				$tab[$cle] = $valeur;
69
				$tab[$cle] = $valeur;
70
			}
70
			}
71
		}
71
		}
72
		return $tab;
72
		return $tab;
73
	}
73
	}
74
	
74
	
75
	//+++------------------------------traitement des versions----------------------------------------++
75
	//+++------------------------------traitement des versions----------------------------------------++
76
	
76
	
77
	protected function traiterVersion($valeur) {
77
	protected function traiterVersion($valeur) {
78
		if (preg_match('/^[0-9]+(?:[._][0-9]+)*$/', $valeur) || $valeur == '+' || $valeur == '*') {
78
		if (preg_match('/^[0-9]+(?:[._][0-9]+)*$/', $valeur) || $valeur == '+' || $valeur == '*') {
79
			$this->version_projet = $valeur;
79
			$this->version_projet = $valeur;
80
		} else {
80
		} else {
81
			$e = "Erreur : La version est inconnue.";
81
			$e = "Erreur : La version est inconnue.";
82
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
82
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
83
		}
83
		}
84
	}
84
	}
85
	
85
	
86
	protected function definirTables() {
86
	protected function definirTables() {
87
		$table_num_version = $this->recupererVersionDisponible();
87
		$table_num_version = $this->recupererVersionDisponible();
88
		$prefixe_table = config::get('bdd_table');
88
		$prefixe_table = config::get('bdd_table');
89
		if ( in_array($this->version_projet,$table_num_version) ) {
89
		if ( in_array($this->version_projet,$table_num_version) ) {
90
			$this->table_version[] = $prefixe_table.'_v'.$this->version_projet;
90
			$this->table_version[] = $prefixe_table.'_v'.$this->version_projet;
91
		} elseif ($this->version_projet == '+') {
91
		} elseif ($this->version_projet == '+') {
92
			$derniere_version = $table_num_version[count($table_num_version) - 1];
92
			$derniere_version = $table_num_version[count($table_num_version) - 1];
93
			$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $derniere_version);
93
			$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $derniere_version);
94
		} elseif ($this->version_projet == '*') {
94
		} elseif ($this->version_projet == '*') {
95
			foreach ($table_num_version as $num_version) {
95
			foreach ($table_num_version as $num_version) {
96
				$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $num_version);
96
				$this->table_version[] = $prefixe_table.'_v'.str_replace('.', '_', $num_version);
97
			}
97
			}
98
		} else {
98
		} else {
99
			$e = "Erreur : La version est inconnue.";
99
			$e = "Erreur : La version est inconnue.";
100
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
100
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
101
		}
101
		}
102
	}
102
	}
103
	
103
	
104
	//+------------------------------------ontologies----------------------------------------------------+
104
	//+------------------------------------ontologies----------------------------------------------------+
105
	
105
	
106
	protected function recupererOntologiesNiveau($valeur, $code){
106
	protected function recupererOntologiesNiveau($valeur, $code){
107
		$ontologie = array();
107
		$ontologie = array();
108
		$url = Config::get('url_service_base').Config::get('nom_projet').
108
		$url = Config::get('url_service_base').Config::get('nom_projet').
109
							'/ontologies/'.$code.':'.urlencode(urlencode($valeur));
109
							'/ontologies/'.$code.':'.urlencode(urlencode($valeur));
110
		if(array_key_exists($url, self::$cache)) {
110
		if(array_key_exists($url, self::$cache)) {
111
			$val = self::$cache[$url];
111
			$val = self::$cache[$url];
112
		} else {
112
		} else {
113
			$val = $this->consulterHref($url);
113
			$val = $this->consulterHref($url);
114
			self::$cache[$url] = $val;
114
			self::$cache[$url] = $val;
115
		}
115
		}
116
		$ontologie['niveau.code'] = $valeur;
116
		$ontologie['niveau.code'] = $valeur;
117
		$ontologie['niveau.libelle'] = $val->nom;
117
		$ontologie['niveau.libelle'] = $val->nom ?? '';
118
		$ontologie['niveau.href'] = $url;
118
		$ontologie['niveau.href'] = $url;
119
		return $ontologie;
119
		return $ontologie;
120
	}
120
	}
121
	
121
	
122
	protected  function recupererOntologiesNiveauSyn($niveau){
122
	protected  function recupererOntologiesNiveauSyn($niveau){
123
		$ontologie = array();
123
		$ontologie = array();
124
		$synonymes = explode(' ',$niveau[1]);
124
		$synonymes = explode(' ',$niveau[1]);
125
		$libelle = array();
125
		$libelle = array();
126
		$detail = array();
126
		$detail = array();
127
		foreach ($synonymes as $syn) {
127
		foreach ($synonymes as $syn) {
128
			if ($syn == '=') {
128
			if ($syn == '=') {
129
				$syn = 'equi';
129
				$syn = 'equi';
130
			} elseif ($syn == '= ?') {
130
			} elseif ($syn == '= ?') {
131
				$syn = 'prob';
131
				$syn = 'prob';
132
			}
132
			}
133
			if ($syn != '' && $syn != '?') {
133
			if ($syn != '' && $syn != '?') {
134
				$detail[] = $this->recupererOntologiesNiveau($syn, 'syn');
134
				$detail[] = $this->recupererOntologiesNiveau($syn, 'syn');
135
				$dernier = end($detail);
135
				$dernier = end($detail);
136
				$libelle[] = $dernier['niveau.libelle'].' ';
136
				$libelle[] = $dernier['niveau.libelle'].' ';
137
			}
137
			}
138
		}
138
		}
139
		$ontologie['niveau.code'] = $niveau[0];
139
		$ontologie['niveau.code'] = $niveau[0];
140
		$ontologie['niveau.libelle'] = 'synonyme '.implode(' - ',$libelle);
140
		$ontologie['niveau.libelle'] = 'synonyme '.implode(' - ',$libelle);
141
		if (isset($niveau[2])) {
141
		if (isset($niveau[2])) {
142
			$ontologie['niveau.libelle'] .= ' '.$niveau[2];
142
			$ontologie['niveau.libelle'] .= ' '.$niveau[2];
143
		}
143
		}
144
		$ontologie['niveau.detail'] = $detail;
144
		$ontologie['niveau.detail'] = $detail;
145
		return $ontologie;
145
		return $ontologie;
146
	}
146
	}
147
	
147
	
148
	protected function traiterOntologieNiveau($niveau) {
148
	protected function traiterOntologieNiveau($niveau) {
149
		$ontologie = array();
149
		$ontologie = array();
150
		if ( preg_match('/syn {0,1}(['.implode($this->syn).']*)( *\[.+\])*/',$niveau,$retour)) {
150
		if ( preg_match('/syn {0,1}(['.implode($this->syn).']*)( *\[.+\])*/',$niveau,$retour)) {
151
	
151
	
152
			$ontologie = $this->recupererOntologiesNiveauSyn($retour);
152
			$ontologie = $this->recupererOntologiesNiveauSyn($retour);
153
	
153
	
154
		} else {
154
		} else {
155
			$ontologie = $this->recupererOntologiesNiveau($niveau, 'UP');
155
			$ontologie = $this->recupererOntologiesNiveau($niveau, 'UP');
156
		}
156
		}
157
		return $ontologie;
157
		return $ontologie;
158
	}
158
	}
159
	
159
	
160
	//+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
160
	//+--------------------------FONCTIONS D'ASSEMBLAGE DE LA REQUETE-------------------------------------------+
161
	
161
	
162
	protected function assemblerLaRequete() {
162
	protected function assemblerLaRequete() {
163
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
163
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->table.' '
164
            .Informations::retournerRequeteCondition($this->requete_condition).' '.$this->delimiterResultatsRequete();
164
            .Informations::retournerRequeteCondition($this->requete_condition).' '.$this->delimiterResultatsRequete();
165
	
165
	
166
		return $requete;
166
		return $requete;
167
	}
167
	}
168
	
168
	
169
	protected function delimiterResultatsRequete() {
169
	protected function delimiterResultatsRequete() {
170
		$this->total_resultat = Informations::calculerTotalResultat(
170
		$this->total_resultat = Informations::calculerTotalResultat(
171
            $this->getBdd(),
171
            $this->getBdd(),
172
            $this->table,
172
            $this->table,
173
            Array(),
173
            Array(),
174
            $this->requete_condition);
174
            $this->requete_condition);
175
 
175
 
176
		$requete_limite = '';
176
		$requete_limite = '';
177
		if (($this->limite_requete['depart'] <=  $this->total_resultat) ){
177
		if (($this->limite_requete['depart'] <=  $this->total_resultat) ){
178
			if (($this->limite_requete['limite'] + $this->limite_requete['depart'] )
178
			if (($this->limite_requete['limite'] + $this->limite_requete['depart'] )
179
			< $this->total_resultat  ){
179
			< $this->total_resultat  ){
180
				$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
180
				$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
181
				.$this->limite_requete['limite'];
181
				.$this->limite_requete['limite'];
182
			}
182
			}
183
		} else {
183
		} else {
184
			$e = "Erreur : la valeur pour le paramètre navigation.départ est supérieure".
184
			$e = "Erreur : la valeur pour le paramètre navigation.départ est supérieure".
185
										" au nombre total de résultats.";
185
										" au nombre total de résultats.";
186
			throw new Exception($e, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
186
			throw new Exception($e, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
187
		}
187
		}
188
		return $requete_limite;
188
		return $requete_limite;
189
	}
189
	}
190
	
190
	
191
	
191
	
192
	
192
	
193
 
193
 
194
}
194
}
195
?>
195
?>