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; |
|