Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1873 → Rev 1881

/trunk/services/bibliotheque/Sql.php
2,7 → 2,22
// declare(encoding='UTF-8');
/**
* Classe contenant des méthodes permettant de construire les requêtes SQL complexe concernant les images et obs.
* Rempli un tableau des clauses "join", "where", "group by" et "oder by" nécessaire à la *recherche* des ids des
* observations/images correspondantes aux filtres passés dans l'url du web service de recherche
* (ListeImages et ListeObservations).
*
* Attention, cela signifie que toutes les tables ne sont pas *forcément* jointées, par exemple si aucune
* contrainte ne le nécessite.
* La requête construite ici est utile pour récupérer la liste des ids d'observations/images qui match.
* Pour la récupération effective de "toutes" les données nécessaire au retour du web service en json, c'est une autre
* requête directement dans le web service qui s'en charge. Cette technique en deux étapes est la plus rapide !
*
* Note: toujours rajouter les préfixes de table (di, do ou du), en fonction de ce que défini
* les JOIN qui sont utilisés :
* - le préfix de del_image est "di"
* - le préfix de del_observation est "do"
* - le préfix de del_utilisateur est "du"
*
* @category DEL
* @package Services
* @package Bibliotheque
24,7 → 39,6
private $parametres = array();
private $appli;
private $requete = array(
'select' => array(),
'join' => array(),
'where' => array(),
'groupby' => array(),
130,21 → 144,8
}
 
/**
* - Rempli le tableau des contraintes "where" et "join" nécessaire
* à la *recherche* des observations demandées ($req) utilisées par self::getIdObs()
 
*
* Attention, cela signifie que toutes les tables ne sont pas *forcément*
* join'ées, par exemple si aucune contrainte ne le nécessite.
* $req tel qu'il est rempli ici est utile pour récupéré la seule liste des
* id d'observation qui match.
* Pour la récupération effective de "toutes" les données correspondante, il faut
* réinitialiser $req["join"] afin d'y ajouter toutes les autres tables.
*
* Note: toujours rajouter les préfixes de table (vdi,du,doi ou di), en fonction de ce que défini
* les JOIN qui sont utilisés.
* le préfix de v_del_image est "vdi" (cf: "FROM" de self::getIdObs())
* le préfix de del_utilisateur sur id_utilisateur = vdi.ce_utilisateur est "du"
*
* @param $p les paramètres (notamment de masque) passés par l'URL et déjà traités/filtrés (sauf quotes)
* @param $req le tableau, passé par référence représentant les composants de la requête à bâtir
*/
198,8 → 199,6
/**
* Retourne une clause where du style:
* CONCAT(IF(du.prenom IS NULL, "", du.prenom), [...] vdi.i_nomutilisateur) REGEXP 'xxx'
* Note; i_(nom|prenom_utilisateur), alias pour cel_images.(nom|prenom), n'est pas traité
* car cette information est redondante dans cel_image et devrait être supprimée.
*/
private function ajouterContrainteAuteurIntitule() {
$auteurExplode = explode(' ', $this->parametres['masque.auteur']);
239,10 → 238,10
$this->addWhere('masque.auteur', $auteurWhere);
}
 
/**
* Lorsque l'on concatène des champs, un seul NULL prend le dessus,
/**
* Lorsque l'on concatène des champs, un seul NULL prend le dessus.
* Il faut donc utiliser la syntaxe IFNULL(%s, "").
* (Cette fonction effectue aussi l'implode() "final"
* Cette fonction effectue aussi l'implode() "final".
*/
private static function ajouterIfNullPourConcat($champs, $prefixe) {
$champsProteges = array();
376,9 → 375,6
$this->addGroupBy('do.id_observation');
}
 
/**
* @param $req: la représentation de la requête MySQL complète, à amender.
*/
private function ajouterContrainteType() {
if (isset($this->parametres['masque.type'])) {
if (array_key_exists('adeterminer', $this->parametres['masque.type'])) {
410,24 → 406,6
}
}
 
/**
* in $p: un tableau de paramètres, dont:
* - 'masque.tag_cel': *tableau* de mots-clefs à chercher parmi cel_image.mots_clefs_texte
* - 'masque.tag_del': *tableau* de mots-clefs à chercher parmi del_image_tag.tag_normalise
* - 'tag_explode_semantic': défini si les éléments sont tous recherchés ou NON
*
* in/ou: $req: un tableau de structure de requête MySQL
*
* Attention, le fait que nous cherchions masque.tag_cel OU/ET masque.tag_cel
* ne dépend pas de nous, mais du niveau supérieur de construction de la requête:
* Soit directement $this->consulter() si des masque.tag* sont passés
* (split sur ",", "AND" entre chaque condition, "OR" pour chaque valeur de tag)
* Soit via sqlAddMasqueConstraint():
* (pas de split, "OR" entre chaque condition) [ comportement historique ]
* équivalent à:
* (split sur " ", "OR" entre chaque condition, "AND" pour chaque valeur de tag)
*
*/
public function ajouterConstrainteAppliImg() {
$this->ajouterContrainteMilieu();
$this->ajouterContrainteTri();
467,11 → 445,6
}
}
 
/**
* Car il ne sont pas traités par la générique requestFilterParams() les clefs "masque.tag_*"
* sont toujours présentes; bien que parfois NULL.
*/
// TODO: utiliser les tables de mots clefs normaliées dans tb_cel ? et auquel cas laisser au client le choix du couteux "%" ?
private function ajouterContrainteTagCel() {
if (isset($this->parametres['masque.tag_cel'])) {
if (isset($this->parametres['masque.tag_cel']['AND'])) {
501,7 → 474,7
}
 
/**
* Plusieurs solutions sont disponibles dans les anciennes versions (voir DelTk).
* Plusieurs solutions sont disponibles dans les anciennes versions (voir DelTk et l'historique SVN de ce fichier).
*/
private function ajouterContrainteTagDel() {
if (isset($this->parametres['masque.tag_del'])) {
604,7 → 577,6
return implode(', ', array_map(create_function('$v, $k', 'return sprintf("%s AS `%s`", $k, $v);'), $arr, $keys));
}
 
// Charger les images et leurs votes associés
public function getVotesDesImages($idsImages, $protocole = null) {
if (!$idsImages) return;
 
623,7 → 595,6
($protocole ? " AND v.ce_protocole = $protocole " : '').
"ORDER BY FIELD(v.ce_image, $idImgsConcat) ".
'-- '.__FILE__.':'.__LINE__;
 
return $this->bdd->recupererTous($requete);
}
 
636,6 → 607,7
* cf ListeImages::reformateImagesDoubleIndex() à qui revient la tâche de créer ces deux versions
* simultanément lorsque c'est encore possible.
*/
// TODO : supprimer cette "subtilité" source d'erreurs
public function ajouterInfosVotesProtocoles($votes, &$images) {
if (!$votes) return;