Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 888 | Rev 980 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 888 Rev 966
Line 213... Line 213...
213
		}
213
         }
214
	}
214
     }
Line 215... Line 215...
215
 
215
 
216
	//+------------------------------------------------------------------------------------------------------+
216
     //+------------------------------------------------------------------------------------------------------+
-
 
217
     public function assemblerLaRequete() {
217
	public function assemblerLaRequete() {
218
         $nolimit = in_array(
218
		$requete = ' SELECT '.$this->formerRequeteChamp().
219
             $this->format_reponse,
219
					', CASE num_statut WHEN "" THEN 1 ELSE 0 END AS is_null '.
220
             array($this->service.'/id', $this->service.'/id/champs'));
220
					' FROM '.$this->table
221
         if(!$nolimit) {
221
					.$this->formerRequeteCondition().
222
             $count = $this->recupererTotalResultat();
222
					' ORDER BY is_null ASC, num_statut ASC '
223
             $limiteClause = self::formerRequeteLimite( // LIMIT
223
					.$this->formerRequeteLimite();
224
                 $this->limite_requete['depart'],
-
 
225
                 $count,
224
		return $requete;
226
                 $this->limite_requete['limite']);
225
	}
227
         }
226
 
228
     
227
	public  function formerRequeteChamp() {
229
         return sprintf(
228
		if (in_array('*', $this->requete_champ)) {
-
 
229
			$champ = ' * ';
-
 
230
		} else {
230
             'SELECT %s, IF(num_statut="",1,0) AS is_null' .
231
			$champ = implode(', ', $this->requete_champ);
-
 
232
		}
-
 
233
		return $champ;
-
 
234
	}
231
             ' FROM %s WHERE %s ORDER BY is_null ASC, num_statut ASC %s -- %s:%d',
235
 
232
 
236
	public  function formerRequeteCondition() {
233
             in_array('*', $this->requete_champ) ? ' * ' : implode(', ', $this->requete_champ),
237
		$condition = '';
234
             $this->table,
238
		if ($this->requete_condition != null) {
235
             $this->requete_condition ? implode(' AND ', $this->requete_condition) : 'TRUE',
239
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
-
 
240
		}
236
             $nolimit ? '' : $limiteClause,
241
		return $condition;
237
             __FILE__, __LINE__);
Line 242... Line 238...
242
	}
238
     }
243
 
239
 
244
	//ajout d'une limite seulement pour les listes (pas plus de 100 resultats retournés pr les requetes
240
	//ajout d'une limite seulement pour les listes (pas plus de 100 resultats retournés pr les requetes
245
	// suivantes : /noms-vernaculaires et /noms-vernaculaires/#id/relations)
-
 
246
	public function formerRequeteLimite() {
241
	// suivantes : /noms-vernaculaires et /noms-vernaculaires/#id/relations)
247
		if (in_array($this->format_reponse , array($this->service.'/id', $this->service.'/id/champs'))) {
-
 
248
			$this->requete_limite = '';
-
 
249
		} elseif (($depart = $this->limite_requete['depart']) > ($this->total_resultat = $this->recupererTotalResultat())) {
242
	static function formerRequeteLimite(&$depart, $total, $limite) {
250
			$this->limite_requete['depart'] =
-
 
251
				(($this->total_resultat - $this->limite_requete['limite']) < 0) ? 0 : ($this->total_resultat - $this->limite_requete['limite']);
-
 
252
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
243
        if ($depart > $total) {
253
		} else {
244
			$depart = $total - $limite < 0 ? 0 : ($total - $limite);
254
			$this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];
245
			return ' LIMIT ' . $depart . ', ' . $limite;
255
		}
246
        }
Line 256... Line 247...
256
		return $this->requete_limite;
247
        return ' LIMIT ' . $depart . ', ' . $limite;
257
	}
248
	}
258
 
249
 
259
	//on récupère le nombre total de résultats de la requete (ex : le nombre d'id contenu dans la liste /noms-vernaculaires)
250
	//on récupère le nombre total de résultats de la requete (ex : le nombre d'id contenu dans la liste /noms-vernaculaires)
260
	public function recupererTotalResultat() {
-
 
261
		$distinct = ($this->format_reponse == 'noms-vernaculaires/attributions') ? 'id' : 'distinct(id)';
-
 
262
		$requete = 'SELECT count('.$distinct.') as nombre FROM '
-
 
Line -... Line 251...
-
 
251
	public function recupererTotalResultat() {
-
 
252
        $res = $this->getBdd()->recuperer(sprintf(
-
 
253
            'SELECT COUNT(%s) AS nombre FROM %s WHERE %s -- %s:%d',
-
 
254
			
-
 
255
            $this->format_reponse == 'noms-vernaculaires/attributions' ? 'id' : 'distinct(id)',
263
			.$this->table
256
            $this->table,
-
 
257
            $this->requete_condition ? implode(' AND ', $this->requete_condition) : 'TRUE',
264
			.$this->formerRequeteCondition();
258
            __FILE__, __LINE__));
-
 
259
 
265
		$res = $this->getBdd()->recuperer($requete);
260
		if (! $res)
-
 
261
            throw new Exception('Données introuvables', RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
266
 
262
        if($res['nombre'] == 0) {
267
		if ($res) {
263
            print json_encode(
-
 
264
                array(
-
 
265
                    "entete" => array(
-
 
266
                        "depart" => $this->limite_requete['depart'],
-
 
267
                        "limite" => $this->limite_requete['limite'],
-
 
268
                        "masque" => $this->recupererMasque(),
-
 
269
                        "total" => 0
268
			$total = $res['nombre'];
270
                    ),
-
 
271
                    "resultat" => array()
269
		} else {
272
                ));
270
			$t = 'Fonction recupererTotalResultat() : <br/>Données introuvables dans la base '.$requete;
273
            die; // die() très dommage (pour phpunit), mais la stack d'imbrication ne nous permet pas de retourner proprement
Line 271... Line 274...
271
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $t);
274
            }
272
		}
275
 
273
		return $total;
276
        return $res['nombre'];
Line 331... Line 334...
331
	}
334
	}
Line 332... Line 335...
332
	
335
	
333
	public function hierarchiserResultat($resultat) {
336
	public function hierarchiserResultat($resultat) {
334
		//tri recherche floue
337
		//tri recherche floue
335
		if (isset($this->parametres['masque.nv'])) {
338
		if (isset($this->parametres['masque.nv'])) {
336
			$resultat = $this->trierRechercheFloue($this->parametres['masque.nv'], $resultat, 'nom_vernaculaire');
339
			return $this->trierRechercheFloue($this->parametres['masque.nv'], $resultat, 'nom_vernaculaire');
337
		}
340
		}
338
		if (isset($this->parametres['masque'])) {
341
		if (isset($this->parametres['masque'])) {
339
			$resultat = $this->trierRechercheFloue($this->parametres['masque'], $resultat, 'nom_vernaculaire');
342
			return $this->trierRechercheFloue($this->parametres['masque'], $resultat, 'nom_vernaculaire');
340
		}
343
		}
341
		return $resultat;
344
		return $resultat;
Line 342... Line 345...
342
	}
345
	}
Line 346... Line 349...
346
		foreach ($this->parametres as $param=>$valeur) {
349
		foreach ($this->parametres as $param=>$valeur) {
347
			if (strstr($param, 'masque') != false) {
350
			if (strstr($param, 'masque') != false) {
348
				$tab_masque[] = $param.'='.$valeur;
351
				$tab_masque[] = $param.'='.$valeur;
349
			}
352
			}
350
		}
353
		}
351
		$masque = implode('&', $tab_masque);
354
		return implode('&', $tab_masque);
352
		return $masque;
-
 
353
	}
355
	}
Line 354... Line 356...
354
	
356
	
355
	public function formaterEnOss($resultat) {
357
	public function formaterEnOss($resultat) {
356
		$table_nom = array();
358
		$table_nom = array();
Line 363... Line 365...
363
				}
365
				}
364
			}
366
			}
365
		}
367
		}
366
		if (isset($this->masque)) $masque = implode('&', $this->masque);
368
		if (isset($this->masque)) $masque = implode('&', $this->masque);
367
		else $masque = 'Pas de masque';
369
		else $masque = 'Pas de masque';
368
		$table_retour_oss = array($masque, $oss);
370
		return array($masque, $oss);
369
		return $table_retour_oss;
-
 
370
	}
371
	}
Line 371... Line 372...
371
	
372
	
372
	public function formaterNomsVernaculairesAttributions($resultat) {
373
	public function formaterNomsVernaculairesAttributions($resultat) {
373
		//on remplie la table $table_retour_json['entete']
374
		//on remplie la table $table_retour_json['entete']