Subversion Repositories eFlore/Applications.del

Rev

Rev 1873 | Rev 1888 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1873 Rev 1881
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 237... Line 236...
237
 
236
 
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);
Line 240... Line 239...
240
	}
239
	}
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();
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');