Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1857 → Rev 1858

/trunk/jrest/services/CoelRecherche.php
11,6 → 11,9
* @copyright 2009, 2013 Tela-Botanica
*/
class CoelRecherche extends Coel {
protected $fromClause = array();
protected $whereClause = array();
protected $joinClause = array();
 
/**
* Méthode principale appelée avec une requête de type GET.
51,45 → 54,18
* Retourne les collections correspondant aux critères de recherche
*/
public function getElementCollections($param) {
// Initialisation des variables
$info = array();
$fromClause = $whereClause = $joinClause = array();
 
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlCollections($param, $_GET);
 
// Construction des clauses
self::construireFromEtWhereCollections($p, $fromClause, $joinClause, $whereClause);
self::construireFromEtWhereCollections($p);
 
// Construction de la requête
$requete = sprintf(
'SELECT %s cs_id_structure, cs_ville, cs_nom, cs_code_postal, cs_latitude, cs_longitude, cc_id_collection, cc_nom'
. ' FROM %s %s'
. ' WHERE %s ORDER BY %s %s -- %s:%d',
$champs = "cs_id_structure, cs_ville, cs_nom, cs_code_postal, cs_latitude, cs_longitude, cc_id_collection, cc_nom";
$this->orderby = is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby;
$requete = $this->assemblerRequete($champs);
 
$this->distinct ? 'DISTINCT' : '',
implode(',', $fromClause),
implode(' ', $joinClause),
$whereClause ? implode(" AND ", $whereClause) : TRUE,
is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby,
$this->limit != -1 ? "LIMIT {$this->start}, {$this->limit}" : "",
__FILE__,
__LINE__
);
//echo "REQUETE: " . $requete;
//exit;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête n'a retourné aucun résultat.";
} else {
$info = $donnees;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
$info =$this->lancerRequete($requete);
return $info;
}
 
97,15 → 73,12
* Retourne le nombre de collections correspondant aux critères de recherche
*/
public function getElementNombreCollections($param) {
// Initialisation des variables
$info = array();
$fromClause = $whereClause = $joinClause = array();
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlCollections($param, $_GET);
 
// Construction des clauses
self::construireFromEtWhereCollections($p, $fromClause, $joinClause, $whereClause);
self::construireFromEtWhereCollections($p);
// Construction de la requête
// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre
113,32 → 86,12
// si on compte(cs_id_structure) on a le nombre d'associations structure-collection dont la structure n'est pas null
// en aucun cas on n'a le nombre d'association structure-collection DIFFERENTES, à moins de faire un distinct, ce qui n'est pas le cas ici
// @AMHA on devrait compter(*) car la recherche de collections renvoie même celles qui ont une structure null
$requete = sprintf(
'SELECT COUNT(%s *) AS nbre, cc_id_collection '
. ' FROM %s %s'
. ' WHERE %s -- %s:%d',
$this->distinct ? 'DISTINCT' : '',
implode(',', $fromClause),
implode(' ', $joinClause),
$whereClause ? implode(" AND ", $whereClause) : TRUE,
__FILE__,
__LINE__
);
// echo "REQUETE: " . $requete;
// exit;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête n'a retourné aucun résultat.";
} else {
$info = $donnees['nbre'];
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
$champs = 'COUNT(*) AS nbre, cc_id_collection ';
$this->orderby = is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby;
$requete = $this->assemblerRequete($champs);
 
$info = $this->lancerRequeteNombre($requete);
 
return $info;
}
 
146,27 → 99,83
* Retourne les personnes correspondant aux critères de recherche
*/
public function getElementPersonnes($param) {
// Initialisation des variables
$info = array();
$fromClause = $whereClause = $joinClause = array();
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
 
// Construction des clauses
self::construireFromEtWherePersonnes($p);
$champs = 'cp_id_personne, cp_fmt_nom_complet, cp_prenom, cp_nom, cp_truk_nom_autre, cp_adresse_01, cp_ville, cp_naissance_date, cp_deces_date';
$this->orderby = is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby;
$requete = $this->assemblerRequete($champs);
$info = $this->lancerRequete($requete);
return $info;
}
 
/**
* Retourne le nombre de personnes correspondant aux critères de recherche
*/
public function getElementNombrePersonnes($param) {
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
 
// Construction des clauses
self::construireFromEtWherePersonnes($p, $fromClause, $joinClause, $whereClause);
self::construireFromEtWherePersonnes($p);
$this->orderby = is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby;
$champs = 'count(*) as nbre';
// Construction de la requête
$requete = $this->assemblerRequete($champs);
$info = $this->lancerRequeteNombre($requete);
return $info;
}
/**
* Retourne les publications correspondant aux critères de recherche
*/
public function getElementPublications($param) {
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlPublications($param, $_GET);
// Construction des clauses
self::construireFromEtWherePublications($p);
$champs = '*';
$this->orderby = is_null($this->orderby) ? 'cpu_fmt_auteur ASC' : $this->orderby;
$requete = $this->assemblerRequete($champs);
$info = $this->lancerRequete($requete);
return $info;
}
/**
* Retourne le nombre de personnes correspondant aux critères de recherche
*/
public function getElementNombrePublications($param) {
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlPublications($param, $_GET);
// Construction des clauses
self::construireFromEtWherePublications($p);
$this->orderby = is_null($this->orderby) ? 'cpu_fmt_auteur ASC' : $this->orderby;
$champs = 'count(*) as nbre';
// Construction de la requête
$requete = $this->assemblerRequete($champs);
$info = $this->lancerRequeteNombre($requete);
return $info;
}
private function assemblerRequete($champs) {
// Construction de la requête
$requete = sprintf(
'SELECT %s cp_id_personne, cp_fmt_nom_complet, cp_prenom, cp_nom, cp_truk_nom_autre, cp_adresse_01, cp_ville, cp_naissance_date, cp_deces_date'
'SELECT %s %s'
. ' FROM %s %s'
. ' WHERE %s ORDER BY %s %s -- %s:%d',
 
$this->distinct ? 'DISTINCT' : '',
implode(',', $fromClause),
implode(' ', $joinClause),
$whereClause ? implode(" AND ", $whereClause) : TRUE,
is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby,
$champs,
implode(',', $this->fromClause),
implode(' ', $this->joinClause),
$this->whereClause ? implode(" AND ", $this->whereClause) : TRUE,
$this->orderby,
$this->limit != -1 ? "LIMIT {$this->start}, {$this->limit}" : "",
__FILE__,
__LINE__
173,6 → 182,11
);
//echo "REQUETE: " . $requete;
//exit;
return $requete;
}
private function lancerRequete($requete) {
$info = array();
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
186,36 → 200,9
}
return $info;
}
 
/**
* Retourne le nombre de personnes correspondant aux critères de recherche
*/
public function getElementNombrePersonnes($param) {
// Initialisation des variables
private function lancerRequeteNombre($requete) {
$info = array();
$fromClause = $whereClause = $joinClause = array();
 
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
 
// Construction des clauses
self::construireFromEtWherePersonnes($p, $fromClause, $joinClause, $whereClause);
 
// Construction de la requête
$requete = sprintf(
'SELECT count(%s *) as nbre'
. ' FROM %s %s'
. ' WHERE %s -- %s:%d',
$this->distinct ? 'DISTINCT' : '',
implode(',', $fromClause),
implode(' ', $joinClause),
$whereClause ? implode(" AND ", $whereClause) : TRUE,
__FILE__,
__LINE__
);
//echo "REQUETE: " . $requete;
//exit;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
255,6 → 242,18
);
return $this->pretraiterParametresUrl($param, $qs, $params_passes);
}
// Voici les paramètres qu'il faut passer au service Personnes, tous et dans l'ordre (soit une valeur soit '*')
private function pretraiterParametresUrlPublications($param, $qs) {
$params_passes = array(
'titre' => 'str',
'auteur' => 'str',
'mot-cle' => 'str',
'revue' => 'str',
'date' => 'int'
);
return $this->pretraiterParametresUrl($param, $qs, $params_passes);
}
 
private function pretraiterParametresUrl($param, $qs, $params_passes) {
$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
318,20 → 317,20
}
 
// construit les clauses FROM et WHERE pour la recherche de collections (#CaptainObvious)
static function construireFromEtWhereCollections($p, &$from, &$join, &$where) {
$from = array('coel_collection');
$join = array('LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure)');
$where = array();
private function construireFromEtWhereCollections($p) {
$this->fromClause = array('coel_collection');
$this->joinClause = array('LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure)');
$this->whereClause = array();
 
// Gestion du from en fonction des paramêtres
if (isset($p['str-d'])) {// ATTENTION : Remplace $from, doit être situé en première position!
$from = array('coel_structure');
$join = array('LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure)');
if (isset($p['str-d'])) {// ATTENTION : Remplace $this->fromClause, doit être situé en première position!
$this->fromClause = array('coel_structure');
$this->joinClause = array('LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure)');
}
// Construire from et where en fonction des paramêtres
if (isset($p['mots'])) {
$where[] = '(' . implode(' OR ', array(
$this->whereClause[] = '(' . implode(' OR ', array(
"cc_nom LIKE {$p['mots']}",
"cc_truk_nom_alternatif LIKE {$p['mots']}",
"cc_truk_code LIKE {$p['mots']}",
353,17 → 352,17
 
if (isset($p['sci'])) {
if ($p['sci'] === true) {
$where[] = 'csv_mark_visite_avec_motif = 1';
$this->whereClause[] = 'csv_mark_visite_avec_motif = 1';
} else if ($p['sci'] === false) {
$where[] = 'csv_mark_acces_ss_motif = 1';
$this->whereClause[] = 'csv_mark_acces_ss_motif = 1';
}
}
if (isset($p['bot'])) {
$where[] = "ccb_ce_truk_type IN ({$p['bot']})";
$this->whereClause[] = "ccb_ce_truk_type IN ({$p['bot']})";
}
if (isset($p['lieu-stockage'])) {
$join[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cs_ce_truk_pays';
$where[] = '(' . implode(' OR ', array(
$this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cs_ce_truk_pays';
$this->whereClause[] = '(' . implode(' OR ', array(
"cs_adresse_01 LIKE {$p['lieu-stockage']}",
"cs_code_postal LIKE {$p['lieu-stockage']}",
"cs_ville LIKE {$p['lieu-stockage']}",
372,27 → 371,27
)) . ')';
}
if (isset($p['zg'])) {
$where[] = "cc_truk_couverture_lieu LIKE {$p['zg']}";
$this->whereClause[] = "cc_truk_couverture_lieu LIKE {$p['zg']}";
}
if (isset($p['p'])) {
$where[] = "cp_fmt_nom_complet LIKE {$p['p']}";
$this->whereClause[] = "cp_fmt_nom_complet LIKE {$p['p']}";
}
if (isset($p['pr'])) {
$where[] = "ccap_id_role IN ({$p['pr']})";
$this->whereClause[] = "ccap_id_role IN ({$p['pr']})";
}
 
// par défaut, spécifier un département restreint à la France
// TODO: INNER JOIN
if (isset($p['str-d'])) {
$join[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays';
$where[] = "cv.cmlv_abreviation IN ('FR', 'RE', 'YT', 'GP', 'MQ', 'GF', 'NC')";
$where[] = sprintf("cs_code_postal REGEXP '^(%s).*'", implode('|', $p['str-d']));
$this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays';
$this->whereClause[] = "cv.cmlv_abreviation IN ('FR', 'RE', 'YT', 'GP', 'MQ', 'GF', 'NC')";
$this->whereClause[] = sprintf("cs_code_postal REGEXP '^(%s).*'", implode('|', $p['str-d']));
}
 
if (isset($p['pays'])) {
if(array_search('FR', $p['pays']) !== FALSE) $p['pays'] = array_merge($p['pays'], array('RE','YT','GP','MQ','GF','NC'));
$join[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays';
$where[] = sprintf('cv.cmlv_abreviation IN ("%s")', implode('","', $p['pays']));
$this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays';
$this->whereClause[] = sprintf('cv.cmlv_abreviation IN ("%s")', implode('","', $p['pays']));
}
 
if (isset($p['veg'])) {
400,47 → 399,47
$veg_nbre = count($veg);
if ($veg_nbre == 1) {
$where[] = "ccb_truk_nature LIKE '%{$p['veg']}%'";
$this->whereClause[] = "ccb_truk_nature LIKE '%{$p['veg']}%'";
} else {
$recherche = array();
foreach ($veg as $id) {
$recherche[] = "ccb_truk_nature LIKE '%$id%'";
}
$where[] = '('.implode(' OR ', $recherche).') ';
$this->whereClause[] = '('.implode(' OR ', $recherche).') ';
}
}
 
if (isset($p['sci'])) {
$join[] = 'LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure)';
$this->joinClause[] = 'LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure)';
}
if (isset($p['bot']) || isset($p['veg'])) {
$join[] = 'LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection)';
$this->joinClause[] = 'LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection)';
}
if (isset($p['p']) || isset($p['pr'])) {
$join[] = 'LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection)';
$this->joinClause[] = 'LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection)';
}
if (isset($p['p'])) {
$join[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)';
$this->joinClause[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)';
}
 
$join = array_unique($join);
$this->joinClause = array_unique($this->joinClause);
}
 
// construit les clauses FROM et WHERE pour la recherche de personnes (#CaptainObvious)
static function construireFromEtWherePersonnes($p, &$from, &$join, &$where) {
$from = array('coel_personne');
$join = array();
$where = array();
private function construireFromEtWherePersonnes($p) {
$this->fromClause = array('coel_personne');
$this->joinClause = array();
$this->whereClause = array();
 
//"cp_truk_recolte LIKE {$p['adresse']}", // Inclure le lieu de récolte ?
 
if (isset($p['nom-famille'])) {
$where[] = "cp_nom LIKE {$p['nom-famille']}";
$this->whereClause[] = "cp_nom LIKE {$p['nom-famille']}";
}
if (isset($p['adresse'])) {
$join[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cp_ce_truk_pays';
$where[] = '(' . implode(' OR ', array(
$this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cp_ce_truk_pays';
$this->whereClause[] = '(' . implode(' OR ', array(
"cp_adresse_01 LIKE {$p['adresse']}",
"cp_code_postal LIKE {$p['adresse']}",
"cp_ville LIKE {$p['adresse']}",
451,18 → 450,42
)) . ')';
}
if (isset($p['date-vivant'])) {
$where[] = "cp_naissance_date <= {$p['date-vivant']}";
$where[] = "cp_deces_date >= {$p['date-vivant']}";
$where[] = "cp_naissance_date IS NOT NULL";
$where[] = "cp_deces_date IS NOT NULL";
//$where[] = "(cp_deces_date IS NULL OR cp_deces_date >= {$p['date-vivant']})";
$this->whereClause[] = "cp_naissance_date <= {$p['date-vivant']}";
$this->whereClause[] = "cp_deces_date >= {$p['date-vivant']}";
$this->whereClause[] = "cp_naissance_date IS NOT NULL";
$this->whereClause[] = "cp_deces_date IS NOT NULL";
//$this->whereClause[] = "(cp_deces_date IS NULL OR cp_deces_date >= {$p['date-vivant']})";
}
 
// pour inclure éventuellement les adresses de la structure
/*if (isset($p['adresse'])) {
$join[] = 'JOIN coel_structure_a_personne ON (cp_id_personne = csap_id_personne)';
$join[] = 'JOIN coel_structure ON (cs_id_structure = csap_id_structure)';
$this->joinClause[] = 'JOIN coel_structure_a_personne ON (cp_id_personne = csap_id_personne)';
$this->joinClause[] = 'JOIN coel_structure ON (cs_id_structure = csap_id_structure)';
}*/
$join = array_unique($join);
$this->joinClause = array_unique($this->joinClause);
}
// construit les clauses FROM et WHERE pour la recherche de publications (#CaptainObvious)
private function construireFromEtWherePublications($p) {
$this->fromClause = array('coel_publication');
$this->joinClause = array();
$this->whereClause = array();
if (isset($p['titre'])) {
$this->whereClause[] = "cpu_titre LIKE {$p['titre']}";
}
if (isset($p['auteur'])) {
$this->whereClause[] = "cpu_fmt_auteur LIKE {$p['auteur']}";
}
if (isset($p['mot-cle'])) {
$this->whereClause[] = "cpu_resume_mot_cle LIKE {$p['mot-cle']}";
}
if (isset($p['revue'])) {
$this->whereClause[] = "cpu_collection LIKE {$p['revue']}";
}
if (isset($p['date'])) {
$this->whereClause[] = "cpu_date_parution LIKE {$p['date']}";
}
}
}