Line 1... |
Line 1... |
1 |
<?php
|
1 |
<?php
|
2 |
// declare(encoding='UTF-8');
|
2 |
// declare(encoding='UTF-8');
|
3 |
/**
|
3 |
/**
|
4 |
* Classe contenant des méthodes permettant de construire les requêtes SQL complexe concernant les images et obs.
|
4 |
* Classe contenant des méthodes permettant de construire les requêtes SQL complexe concernant les images et obs.
|
- |
|
5 |
* Rempli un tableau des clauses "join", "where", "group by" et "oder by" nécessaire à la *recherche* des ids des
|
- |
|
6 |
* observations/images correspondantes aux filtres passés dans l'url du web service de recherche
|
- |
|
7 |
* (ListeImages et ListeObservations).
|
- |
|
8 |
*
|
- |
|
9 |
* Attention, cela signifie que toutes les tables ne sont pas *forcément* jointées, par exemple si aucune
|
- |
|
10 |
* contrainte ne le nécessite.
|
- |
|
11 |
* La requête construite ici est utile pour récupérer la liste des ids d'observations/images qui match.
|
- |
|
12 |
* Pour la récupération effective de "toutes" les données nécessaire au retour du web service en json, c'est une autre
|
- |
|
13 |
* requête directement dans le web service qui s'en charge. Cette technique en deux étapes est la plus rapide !
|
- |
|
14 |
*
|
- |
|
15 |
* Note: toujours rajouter les préfixes de table (di, do ou du), en fonction de ce que défini
|
- |
|
16 |
* les JOIN qui sont utilisés :
|
- |
|
17 |
* - le préfix de del_image est "di"
|
- |
|
18 |
* - le préfix de del_observation est "do"
|
- |
|
19 |
* - le préfix de del_utilisateur est "du"
|
5 |
*
|
20 |
*
|
6 |
* @category DEL
|
21 |
* @category DEL
|
7 |
* @package Services
|
22 |
* @package Services
|
8 |
* @package Bibliotheque
|
23 |
* @package Bibliotheque
|
9 |
* @version 0.1
|
24 |
* @version 0.1
|
Line 22... |
Line 37... |
22 |
private $conteneur;
|
37 |
private $conteneur;
|
23 |
private $bdd;
|
38 |
private $bdd;
|
24 |
private $parametres = array();
|
39 |
private $parametres = array();
|
25 |
private $appli;
|
40 |
private $appli;
|
26 |
private $requete = array(
|
41 |
private $requete = array(
|
27 |
'select' => array(),
|
- |
|
28 |
'join' => array(),
|
42 |
'join' => array(),
|
29 |
'where' => array(),
|
43 |
'where' => array(),
|
30 |
'groupby' => array(),
|
44 |
'groupby' => array(),
|
31 |
'orderby' => array());
|
45 |
'orderby' => array());
|
Line 128... |
Line 142... |
128 |
public function getLimit() {
|
142 |
public function getLimit() {
|
129 |
return 'LIMIT '.$this->parametres['navigation.depart'].','.$this->parametres['navigation.limite'].' ';
|
143 |
return 'LIMIT '.$this->parametres['navigation.depart'].','.$this->parametres['navigation.limite'].' ';
|
130 |
}
|
144 |
}
|
Line 131... |
Line 145... |
131 |
|
145 |
|
132 |
/**
|
- |
|
133 |
* - Rempli le tableau des contraintes "where" et "join" nécessaire
|
- |
|
134 |
* à la *recherche* des observations demandées ($req) utilisées par self::getIdObs()
|
146 |
/**
|
135 |
*
|
- |
|
136 |
* Attention, cela signifie que toutes les tables ne sont pas *forcément*
|
- |
|
137 |
* join'ées, par exemple si aucune contrainte ne le nécessite.
|
- |
|
138 |
* $req tel qu'il est rempli ici est utile pour récupéré la seule liste des
|
- |
|
139 |
* id d'observation qui match.
|
- |
|
140 |
* Pour la récupération effective de "toutes" les données correspondante, il faut
|
- |
|
141 |
* réinitialiser $req["join"] afin d'y ajouter toutes les autres tables.
|
- |
|
142 |
*
|
- |
|
143 |
* Note: toujours rajouter les préfixes de table (vdi,du,doi ou di), en fonction de ce que défini
|
- |
|
144 |
* les JOIN qui sont utilisés.
|
- |
|
145 |
* le préfix de v_del_image est "vdi" (cf: "FROM" de self::getIdObs())
|
- |
|
146 |
* le préfix de del_utilisateur sur id_utilisateur = vdi.ce_utilisateur est "du"
|
147 |
|
147 |
*
|
148 |
*
|
148 |
* @param $p les paramètres (notamment de masque) passés par l'URL et déjà traités/filtrés (sauf quotes)
|
149 |
* @param $p les paramètres (notamment de masque) passés par l'URL et déjà traités/filtrés (sauf quotes)
|
149 |
* @param $req le tableau, passé par référence représentant les composants de la requête à bâtir
|
150 |
* @param $req le tableau, passé par référence représentant les composants de la requête à bâtir
|
150 |
*/
|
151 |
*/
|
Line 196... |
Line 197... |
196 |
}
|
197 |
}
|
Line 197... |
Line 198... |
197 |
|
198 |
|
198 |
/**
|
199 |
/**
|
199 |
* Retourne une clause where du style:
|
200 |
* Retourne une clause where du style:
|
200 |
* CONCAT(IF(du.prenom IS NULL, "", du.prenom), [...] vdi.i_nomutilisateur) REGEXP 'xxx'
|
- |
|
201 |
* Note; i_(nom|prenom_utilisateur), alias pour cel_images.(nom|prenom), n'est pas traité
|
- |
|
202 |
* car cette information est redondante dans cel_image et devrait être supprimée.
|
201 |
* CONCAT(IF(du.prenom IS NULL, "", du.prenom), [...] vdi.i_nomutilisateur) REGEXP 'xxx'
|
203 |
*/
|
202 |
*/
|
204 |
private function ajouterContrainteAuteurIntitule() {
|
203 |
private function ajouterContrainteAuteurIntitule() {
|
205 |
$auteurExplode = explode(' ', $this->parametres['masque.auteur']);
|
204 |
$auteurExplode = explode(' ', $this->parametres['masque.auteur']);
|
Line 238... |
Line 237... |
238 |
$auteurWhere = sprintf($sqlTpl, $champsPrenomSql, $champsNomSql, $prenomMotif, $nomMotif);
|
237 |
$auteurWhere = sprintf($sqlTpl, $champsPrenomSql, $champsNomSql, $prenomMotif, $nomMotif);
|
239 |
$this->addWhere('masque.auteur', $auteurWhere);
|
238 |
$this->addWhere('masque.auteur', $auteurWhere);
|
240 |
}
|
239 |
}
|
Line 241... |
Line 240... |
241 |
|
240 |
|
242 |
/**
|
241 |
/**
|
243 |
* Lorsque l'on concatène des champs, un seul NULL prend le dessus,
|
242 |
* Lorsque l'on concatène des champs, un seul NULL prend le dessus.
|
244 |
* Il faut donc utiliser la syntaxe IFNULL(%s, "").
|
243 |
* Il faut donc utiliser la syntaxe IFNULL(%s, "").
|
245 |
* (Cette fonction effectue aussi l'implode() "final"
|
244 |
* Cette fonction effectue aussi l'implode() "final".
|
246 |
*/
|
245 |
*/
|
247 |
private static function ajouterIfNullPourConcat($champs, $prefixe) {
|
246 |
private static function ajouterIfNullPourConcat($champs, $prefixe) {
|
248 |
$champsProteges = array();
|
247 |
$champsProteges = array();
|
249 |
foreach ($champs as $champ) {
|
248 |
foreach ($champs as $champ) {
|
Line 374... |
Line 373... |
374 |
$this->ajouterContrainteType();
|
373 |
$this->ajouterContrainteType();
|
375 |
// TODO : ATTENTION -> vue que l'on utilise une vue basée sur les images, nous devons grouper par obs
|
374 |
// TODO : ATTENTION -> vue que l'on utilise une vue basée sur les images, nous devons grouper par obs
|
376 |
$this->addGroupBy('do.id_observation');
|
375 |
$this->addGroupBy('do.id_observation');
|
377 |
}
|
376 |
}
|
Line 378... |
Line -... |
378 |
|
- |
|
379 |
/**
|
- |
|
380 |
* @param $req: la représentation de la requête MySQL complète, à amender.
|
- |
|
381 |
*/
|
377 |
|
382 |
private function ajouterContrainteType() {
|
378 |
private function ajouterContrainteType() {
|
383 |
if (isset($this->parametres['masque.type'])) {
|
379 |
if (isset($this->parametres['masque.type'])) {
|
384 |
if (array_key_exists('adeterminer', $this->parametres['masque.type'])) {
|
380 |
if (array_key_exists('adeterminer', $this->parametres['masque.type'])) {
|
385 |
// Récupèration de toutes les observations qui on le tag "aDeterminer" *ou* qui n'ont pas de nom d'espèce
|
381 |
// Récupèration de toutes les observations qui on le tag "aDeterminer" *ou* qui n'ont pas de nom d'espèce
|
Line 408... |
Line 404... |
408 |
$this->addJoin('LEFT JOIN del_observation AS do ON (di.ce_observation = do.id_observation) ');
|
404 |
$this->addJoin('LEFT JOIN del_observation AS do ON (di.ce_observation = do.id_observation) ');
|
409 |
}
|
405 |
}
|
410 |
}
|
406 |
}
|
411 |
}
|
407 |
}
|
Line 412... |
Line -... |
412 |
|
- |
|
413 |
/**
|
- |
|
414 |
* in $p: un tableau de paramètres, dont:
|
- |
|
415 |
* - 'masque.tag_cel': *tableau* de mots-clefs à chercher parmi cel_image.mots_clefs_texte
|
- |
|
416 |
* - 'masque.tag_del': *tableau* de mots-clefs à chercher parmi del_image_tag.tag_normalise
|
- |
|
417 |
* - 'tag_explode_semantic': défini si les éléments sont tous recherchés ou NON
|
- |
|
418 |
*
|
- |
|
419 |
* in/ou: $req: un tableau de structure de requête MySQL
|
- |
|
420 |
*
|
- |
|
421 |
* Attention, le fait que nous cherchions masque.tag_cel OU/ET masque.tag_cel
|
- |
|
422 |
* ne dépend pas de nous, mais du niveau supérieur de construction de la requête:
|
- |
|
423 |
* Soit directement $this->consulter() si des masque.tag* sont passés
|
- |
|
424 |
* (split sur ",", "AND" entre chaque condition, "OR" pour chaque valeur de tag)
|
- |
|
425 |
* Soit via sqlAddMasqueConstraint():
|
- |
|
426 |
* (pas de split, "OR" entre chaque condition) [ comportement historique ]
|
- |
|
427 |
* équivalent à:
|
- |
|
428 |
* (split sur " ", "OR" entre chaque condition, "AND" pour chaque valeur de tag)
|
- |
|
429 |
*
|
- |
|
430 |
*/
|
408 |
|
431 |
public function ajouterConstrainteAppliImg() {
|
409 |
public function ajouterConstrainteAppliImg() {
|
432 |
$this->ajouterContrainteMilieu();
|
410 |
$this->ajouterContrainteMilieu();
|
433 |
$this->ajouterContrainteTri();
|
411 |
$this->ajouterContrainteTri();
|
434 |
$this->ajouterContrainteTagCel();
|
412 |
$this->ajouterContrainteTagCel();
|
Line 465... |
Line 443... |
465 |
$this->addGroupBy('di.ce_observation');
|
443 |
$this->addGroupBy('di.ce_observation');
|
466 |
}
|
444 |
}
|
467 |
}
|
445 |
}
|
468 |
}
|
446 |
}
|
Line 469... |
Line -... |
469 |
|
- |
|
470 |
/**
|
- |
|
471 |
* Car il ne sont pas traités par la générique requestFilterParams() les clefs "masque.tag_*"
|
- |
|
472 |
* sont toujours présentes; bien que parfois NULL.
|
- |
|
473 |
*/
|
- |
|
474 |
// TODO: utiliser les tables de mots clefs normaliées dans tb_cel ? et auquel cas laisser au client le choix du couteux "%" ?
|
447 |
|
475 |
private function ajouterContrainteTagCel() {
|
448 |
private function ajouterContrainteTagCel() {
|
476 |
if (isset($this->parametres['masque.tag_cel'])) {
|
449 |
if (isset($this->parametres['masque.tag_cel'])) {
|
477 |
if (isset($this->parametres['masque.tag_cel']['AND'])) {
|
450 |
if (isset($this->parametres['masque.tag_cel']['AND'])) {
|
478 |
$tags = $this->parametres['masque.tag_cel']['AND'];
|
451 |
$tags = $this->parametres['masque.tag_cel']['AND'];
|
Line 499... |
Line 472... |
499 |
}
|
472 |
}
|
500 |
}
|
473 |
}
|
501 |
}
|
474 |
}
|
Line 502... |
Line 475... |
502 |
|
475 |
|
503 |
/**
|
476 |
/**
|
504 |
* Plusieurs solutions sont disponibles dans les anciennes versions (voir DelTk).
|
477 |
* Plusieurs solutions sont disponibles dans les anciennes versions (voir DelTk et l'historique SVN de ce fichier).
|
505 |
*/
|
478 |
*/
|
506 |
private function ajouterContrainteTagDel() {
|
479 |
private function ajouterContrainteTagDel() {
|
507 |
if (isset($this->parametres['masque.tag_del'])) {
|
480 |
if (isset($this->parametres['masque.tag_del'])) {
|
508 |
if (isset($this->parametres['masque.tag_del']['AND'])) {
|
481 |
if (isset($this->parametres['masque.tag_del']['AND'])) {
|
Line 602... |
Line 575... |
602 |
}
|
575 |
}
|
Line 603... |
Line 576... |
603 |
|
576 |
|
604 |
return implode(', ', array_map(create_function('$v, $k', 'return sprintf("%s AS `%s`", $k, $v);'), $arr, $keys));
|
577 |
return implode(', ', array_map(create_function('$v, $k', 'return sprintf("%s AS `%s`", $k, $v);'), $arr, $keys));
|
Line 605... |
Line -... |
605 |
}
|
- |
|
606 |
|
578 |
}
|
607 |
// Charger les images et leurs votes associés
|
579 |
|
Line 608... |
Line 580... |
608 |
public function getVotesDesImages($idsImages, $protocole = null) {
|
580 |
public function getVotesDesImages($idsImages, $protocole = null) {
|
609 |
if (!$idsImages) return;
|
581 |
if (!$idsImages) return;
|
Line 621... |
Line 593... |
621 |
' INNER JOIN del_image_protocole AS p ON (v.ce_protocole = p.id_protocole) '.
|
593 |
' INNER JOIN del_image_protocole AS p ON (v.ce_protocole = p.id_protocole) '.
|
622 |
"WHERE v.ce_image IN ($idImgsConcat) ".
|
594 |
"WHERE v.ce_image IN ($idImgsConcat) ".
|
623 |
($protocole ? " AND v.ce_protocole = $protocole " : '').
|
595 |
($protocole ? " AND v.ce_protocole = $protocole " : '').
|
624 |
"ORDER BY FIELD(v.ce_image, $idImgsConcat) ".
|
596 |
"ORDER BY FIELD(v.ce_image, $idImgsConcat) ".
|
625 |
'-- '.__FILE__.':'.__LINE__;
|
597 |
'-- '.__FILE__.':'.__LINE__;
|
626 |
|
- |
|
627 |
return $this->bdd->recupererTous($requete);
|
598 |
return $this->bdd->recupererTous($requete);
|
628 |
}
|
599 |
}
|
Line 629... |
Line 600... |
629 |
|
600 |
|
630 |
/**
|
601 |
/**
|
Line 634... |
Line 605... |
634 |
* plus pratique pour associer les vote à un tableau, puisque nous ne connaissons pas les id d'observation.
|
605 |
* plus pratique pour associer les vote à un tableau, puisque nous ne connaissons pas les id d'observation.
|
635 |
* Mais magiquement (par référence), cela va remplir notre tableau indexé par couple d'id (id_image, id_observation)
|
606 |
* Mais magiquement (par référence), cela va remplir notre tableau indexé par couple d'id (id_image, id_observation)
|
636 |
* cf ListeImages::reformateImagesDoubleIndex() à qui revient la tâche de créer ces deux versions
|
607 |
* cf ListeImages::reformateImagesDoubleIndex() à qui revient la tâche de créer ces deux versions
|
637 |
* simultanément lorsque c'est encore possible.
|
608 |
* simultanément lorsque c'est encore possible.
|
638 |
*/
|
609 |
*/
|
- |
|
610 |
// TODO : supprimer cette "subtilité" source d'erreurs
|
639 |
public function ajouterInfosVotesProtocoles($votes, &$images) {
|
611 |
public function ajouterInfosVotesProtocoles($votes, &$images) {
|
640 |
if (!$votes) return;
|
612 |
if (!$votes) return;
|
Line 641... |
Line 613... |
641 |
|
613 |
|
642 |
$mappingVotes = $this->conteneur->getParametreTableau('votes.mapping');
|
614 |
$mappingVotes = $this->conteneur->getParametreTableau('votes.mapping');
|