Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1840 Rev 1845
Line 300... Line 300...
300
			$communeMotif = $this->bdd->proteger("$commune%");
300
			$communeMotif = $this->bdd->proteger("$commune%");
301
			$this->addWhere('masque.commune', "vdi.zone_geo LIKE $communeMotif");
301
			$this->addWhere('masque.commune', "vdi.zone_geo LIKE $communeMotif");
302
		}
302
		}
303
	}
303
	}
Line -... Line 304...
-
 
304
 
-
 
305
	public function ajouterConstrainteAppliObs() {
-
 
306
		$this->ajouterContrainteTagCel();
-
 
307
		$this->ajouterContrainteType();
-
 
308
		// TODO : ATTENTION -> vue que l'on utilise une vue basée sur les images, nous devons grouper par obs
-
 
309
		$this->addGroupBy('vdi.id_observation');
-
 
310
	}
-
 
311
 
-
 
312
		/**
-
 
313
	 * @param $req: la représentation de la requête MySQL complète, à amender.
-
 
314
	 */
-
 
315
	private function ajouterContrainteType() {
-
 
316
		if (array_key_exists('adeterminer', $this->parametres['masque.type'])) {
-
 
317
			// Récupèration de toutes les observations qui on le tag "aDeterminer" *ou* qui n'ont pas de nom d'espèce
-
 
318
			// *ou* qui ont la "certitude" à ("aDeterminer" *ou* "douteux")
-
 
319
			$this->addWhere('masque.type', '('.
-
 
320
				'vdi.certitude = "aDeterminer" '.
-
 
321
				'OR vdi.certitude = "douteux" '.
-
 
322
				'OR vdi.mots_cles_texte LIKE "%aDeterminer%" '.
-
 
323
				'OR vdi.nom_sel_nn IS NULL '.
-
 
324
				'OR vdi.nom_sel_nn = 0 '.// il ne DEVRAIT pas y avoir d'entrées à 0, mais il y en a quand-même !!
-
 
325
				')');
-
 
326
		}
-
 
327
		if (array_key_exists('validees', $this->parametres['masque.type'])) {
-
 
328
			// Récupèration de toutes les observations ayant un commentaire doté de proposition_retenue = 1
-
 
329
			$this->addJoin('INNER JOIN del_commentaire AS dc '.
-
 
330
				'ON (vdi.id_observation = dc.ce_observation AND dc.proposition_retenue = 1) ');
-
 
331
		}
-
 
332
 
-
 
333
		if (array_key_exists('endiscussion', $this->parametres['masque.type'])) {
-
 
334
			$nbreCommentaire =(int) ($this->conteneur->getParametre('observations.nb_commentaires_discussion'));
-
 
335
			$this->addWhere('masque.type', '(SELECT COUNT(id_commentaire) FROM del_commentaire AS dc '.
-
 
336
				"WHERE ce_observation = id_observation) > $nbreCommentaire ");
-
 
337
		}
-
 
338
	}
304
 
339
 
305
	/**
340
	/**
306
	 * in $p: un tableau de paramètres, dont:
341
	 * in $p: un tableau de paramètres, dont:
307
	 * - 'masque.tag_cel': *tableau* de mots-clefs à chercher parmi cel_image.mots_clefs_texte
342
	 * - 'masque.tag_cel': *tableau* de mots-clefs à chercher parmi cel_image.mots_clefs_texte
308
	 * - 'masque.tag_del': *tableau* de mots-clefs à chercher parmi del_image_tag.tag_normalise
343
	 * - 'masque.tag_del': *tableau* de mots-clefs à chercher parmi del_image_tag.tag_normalise
Line 375... Line 410...
375
	 * Car il ne sont pas traités par la générique requestFilterParams() les clefs "masque.tag_*"
410
	 * Car il ne sont pas traités par la générique requestFilterParams() les clefs "masque.tag_*"
376
	 * sont toujours présentes; bien que parfois NULL.
411
	 * sont toujours présentes; bien que parfois NULL.
377
	 */
412
	 */
378
	// TODO: utiliser les tables de mots clefs normaliées dans tb_cel ? et auquel cas laisser au client le choix du couteux "%" ?
413
	// TODO: utiliser les tables de mots clefs normaliées dans tb_cel ? et auquel cas laisser au client le choix du couteux "%" ?
379
	private function ajouterContrainteTagCel() {
414
	private function ajouterContrainteTagCel() {
380
		if ($this->parametres['masque.tag_cel']) {
415
		if (isset($this->parametres['masque.tag_cel'])) {
381
			if (isset($this->parametres['masque.tag_cel']['AND'])) {
416
			if (isset($this->parametres['masque.tag_cel']['AND'])) {
382
				$tags = $this->parametres['masque.tag_cel']['AND'];
417
				$tags = $this->parametres['masque.tag_cel']['AND'];
383
				$clausesWhere = array();
418
				$clausesWhere = array();
384
				foreach ($tags as $tag) {
419
				foreach ($tags as $tag) {
385
					$tagMotif = $this->bdd->proteger("%$tag%");
420
					$tagMotif = $this->bdd->proteger("%$tag%");
Line 397... Line 432...
397
			}
432
			}
398
		}
433
		}
399
	}
434
	}
Line 400... Line 435...
400
 
435
 
401
	/**
436
	/**
402
	 * Plusieurs solutions disponibles pour la gestion des contraintes des tags DEL :
-
 
403
	 * - inutilisable pour l'instant : ajouterContrainteTagDelSolution1();
-
 
404
	 * - intéressante, mais problème d'optimiseur MySQL 5.5 (dependant subquery) : ajouterContrainteTagDelSolution2();
-
 
405
	 * - approche fiable mais sous-optimale : ajouterContrainteTagDelSolution3();
437
	 * Plusieurs solutions sont disponibles dans les anciennes versions (voir DelTk).
406
	 */
438
	 */
407
	private function ajouterContrainteTagDel() {
439
	private function ajouterContrainteTagDel() {
408
		if (isset($this->parametres['masque.tag_del'])) {
440
		if (isset($this->parametres['masque.tag_del'])) {
409
			$this->ajouterContrainteTagDelSolution3();
-
 
410
		}
-
 
411
	}
-
 
412
 
441
			if (isset($this->parametres['masque.tag_del']['AND'])) {
413
	/** Approche intéressante si les deux problèmes suivants peuvent être résolu:
442
				$tags = $this->parametres['masque.tag_del']['AND'];
414
	 * - LEFT JOIN => dup => *gestion de multiples GROUP BY* (car in-fine un LIMIT est utilisé)
443
				// optimisation: en cas de "AND" on sort() l'input et le GROUP_CONCAT()
415
	 * - dans le cas d'un ET logique, comment chercher les observations correspondantes ?
444
				// donc nous utilisons des ".*" plutôt que de multiples conditions et "|"
416
	 */
445
				sort($tags);
417
	private function ajouterContrainteTagDelSolution1() {
446
				$tagsMotif = $this->bdd->proteger(implode('.*', $tags));
418
		// XXX: utiliser tag plutôt que tag_normalise ?
447
				$requete = 'SELECT ce_image '.
419
		$req['join'][] = 'LEFT JOIN del_image_tag dit ON dit.ce_image = vdi.id_image';
448
					'FROM del_image_tag '.
-
 
449
					'WHERE actif = 1 '.
420
		$req['where'][] = 'dit.actif = 1';
450
					'GROUP BY ce_image '.
-
 
451
					"HAVING GROUP_CONCAT(tag_normalise ORDER BY tag_normalise) REGEXP $tagsMotif ".
-
 
452
					' -- '.__FILE__.' : '.__LINE__;
-
 
453
				$sql = $this->recupererSqlContrainteTag($requete);
-
 
454
				$this->addWhere('masque.tag_del', $sql);
421
		$req['groupby'][] = 'vdi.id_image'; // TODO: nécessaire (car dup') mais risque de conflict en cas de tri (multiple GROUP BY)
455
 
422
		// XXX: en cas de ET, possibilité du GROUP_CONCAT(), mais probablement sans grand intérêt, d'où une boucle
456
			} else if (isset($this->parametres['masque.tag_del']['OR'])) {
423
		if (isset($p['masque.tag_del']['AND'])) {
457
				$tags = $this->parametres['masque.tag_del']['OR'];
424
			// TODO/XXX : comment matcher les observations ayant tous les mots-clef passés ?
458
				$tagsMotif = $this->bdd->proteger(implode('|', $tags));
425
			// ... le LEFT-JOIN n'y semble pas adapté
459
				$requete = 'SELECT ce_image '.
426
		} else {
460
					'FROM del_image_tag '.
-
 
461
					'WHERE actif = 1 '.
427
			$protected_tags = array();
462
					'GROUP BY ce_image '.
-
 
463
					"HAVING GROUP_CONCAT(tag_normalise) REGEXP $tagsMotif ".
428
			foreach ($p['masque.tag_del']['OR'] as $tag) {
464
					' -- '.__FILE__.' : '.__LINE__;
-
 
465
				$sql = $this->recupererSqlContrainteTag($requete);
429
				$protected_tags[] = $db->proteger(strtolower($tag));
466
				$this->addWhere('masque.tag_del', $sql);
430
			}
-
 
431
			$req['where'][] = sprintf('tag_normalise IN (%s)', implode(',', $protected_tags));
-
 
432
		}
-
 
433
	}
-
 
434
 
-
 
435
	/**
-
 
436
	 * Inutilisé pour l'instant pour cause de soucis d'optimiseur MySQL (cf commentaire en intro)
-
 
437
	 */
-
 
438
	private function ajouterContrainteTagDelSolution2() {
-
 
439
		// Note à propos des 4 "@ instruction" ci-dessous (notamment sur recupererTous())
-
 
440
		// REGEXP permet un puissant mécanisme de sélection des obs/image à qui sait
-
 
441
		// l'utiliser, mais peut sortir une erreur en cas de REGEXP invalide
-
 
442
		// ex: REGEX "^(".
-
 
443
		// Pour l'heure nous ignorons ce type d'erreur car aucun de nos champ de recherche
-
 
444
		// ne peuvent (ou ne devrait) comporter des meta-caractères
-
 
445
		// ([])?*+\\
-
 
446
		if (isset($p['masque.tag_del']['AND'])) {
-
 
447
			// optimsation: en cas de "AND" on sort() l'input et le GROUP_CONCAT()
-
 
448
			// donc nous utilisons des ".*" plutôt que de multiples conditions et "|"
-
 
449
			sort($p['masque.tag_del']['AND']);
-
 
450
			$req['where'][] = sprintf("vdi.id_image IN (SELECT ce_image FROM del_image_tag WHERE actif = 1".
-
 
451
				" GROUP BY ce_image".
-
 
452
				" HAVING GROUP_CONCAT(tag_normalise ORDER BY tag_normalise) REGEXP %s)",
-
 
453
				$db->proteger(implode('.*', $p['masque.tag_del']['AND'])));
-
 
454
		} else {
-
 
455
			$req['where'][] = sprintf("vdi.id_image IN (SELECT ce_image FROM del_image_tag WHERE actif = 1".
-
 
456
				" GROUP BY ce_image".
-
 
457
				" HAVING GROUP_CONCAT(tag_normalise) REGEXP %s)",
-
 
458
				$db->proteger(implode('|', $p['masque.tag_del']['OR'])));
-
 
459
		}
-
 
460
	}
-
 
461
 
-
 
462
	/**
-
 
463
	 * Si l'on est bassiné par les "DEPENDENT SUBQUERY", nous la faisons donc indépendemment via cette fonction
-
 
464
	 */
-
 
465
	private function ajouterContrainteTagDelSolution3() {
-
 
466
		if (isset($this->parametres['masque.tag_del']['AND'])) {
-
 
467
			$tags = $this->parametres['masque.tag_del']['AND'];
-
 
468
			// optimisation: en cas de "AND" on sort() l'input et le GROUP_CONCAT()
-
 
469
			// donc nous utilisons des ".*" plutôt que de multiples conditions et "|"
-
 
470
			sort($tags);
-
 
471
			$tagsMotif = $this->bdd->proteger(implode('.*', $tags));
-
 
472
			$requete = 'SELECT ce_image '.
-
 
473
				'FROM del_image_tag '.
-
 
474
				'WHERE actif = 1 '.
-
 
475
				'GROUP BY ce_image '.
-
 
476
				"HAVING GROUP_CONCAT(tag_normalise ORDER BY tag_normalise) REGEXP $tagsMotif ".
-
 
477
				' -- '.__FILE__.' : '.__LINE__;
-
 
478
			$sql = $this->recupererSqlContrainteTag($requete);
-
 
479
			$this->addWhere('masque.tag_del', $sql);
-
 
480
 
-
 
481
		} else if (isset($this->parametres['masque.tag_del']['OR'])) {
-
 
482
			$tags = $this->parametres['masque.tag_del']['OR'];
-
 
483
			$tagsMotif = $this->bdd->proteger(implode('|', $tags));
-
 
484
			$requete = 'SELECT ce_image '.
-
 
485
				'FROM del_image_tag '.
-
 
486
				'WHERE actif = 1 '.
-
 
487
				'GROUP BY ce_image '.
-
 
488
				"HAVING GROUP_CONCAT(tag_normalise) REGEXP $tagsMotif ".
-
 
489
				' -- '.__FILE__.' : '.__LINE__;
-
 
490
			$sql = $this->recupererSqlContrainteTag($requete);
-
 
491
			$this->addWhere('masque.tag_del', $sql);
467
			}
492
		}
468
		}
Line 493... Line 469...
493
	}
469
	}
494
 
470
 
Line 535... Line 511...
535
			default:
511
			default:
536
				$this->addOrderBy("date_transmission $ordre, id_observation $ordre");
512
				$this->addOrderBy("date_transmission $ordre, id_observation $ordre");
537
		}
513
		}
538
	}
514
	}
Line -... Line 515...
-
 
515
 
-
 
516
	public function definirOrdreSqlAppliObs() {
-
 
517
		$ordre = $this->parametres['ordre'];
-
 
518
 
-
 
519
		// parmi self::$tri_possible
-
 
520
		switch ($this->parametres['tri']) {
-
 
521
			case 'date_observation' :
-
 
522
				$this->addOrderBy("date_observation $ordre, id_observation $ordre");
-
 
523
				break;
-
 
524
			default:
-
 
525
				$this->addOrderBy("date_transmission $ordre, id_observation $ordre");
-
 
526
		}
-
 
527
	}
539
 
528
 
540
	public function getAliasDesChamps($champsEtAlias, $select = null, $prefix = null) {
529
	public function getAliasDesChamps($champsEtAlias, $select = null, $prefix = null) {
541
		$arr = ($select) ? array_intersect_key($champsEtAlias, array_flip($select)) :  $champsEtAlias;
530
		$arr = ($select) ? array_intersect_key($champsEtAlias, array_flip($select)) :  $champsEtAlias;
Line 542... Line 531...
542
		$keys = array_keys($arr);
531
		$keys = array_keys($arr);
Line 582... Line 571...
582
	 * cf ListeImages::reformateImagesDoubleIndex() à qui revient la tâche de créer ces deux versions
571
	 * cf ListeImages::reformateImagesDoubleIndex() à qui revient la tâche de créer ces deux versions
583
	 * simultanément lorsque c'est encore possible.
572
	 * simultanément lorsque c'est encore possible.
584
	 */
573
	 */
585
	public function ajouterInfosVotesProtocoles($votes, &$images) {
574
	public function ajouterInfosVotesProtocoles($votes, &$images) {
586
		if (!$votes) return;
575
		if (!$votes) return;
587
		
576
 
588
		$mappingVotes = $this->conteneur->getParametreTableau('votes.mapping');
577
		$mappingVotes = $this->conteneur->getParametreTableau('votes.mapping');
589
		$mappingProtocoles = $this->conteneur->getParametreTableau('protocoles.mapping');
578
		$mappingProtocoles = $this->conteneur->getParametreTableau('protocoles.mapping');
Line 590... Line 579...
590
 
579
 
591
		// pour chaque vote
580
		// pour chaque vote
Line 604... Line 593...
604
			$voteSelection = array_intersect_key($mappingVotes, array_flip($chpsVotes));
593
			$voteSelection = array_intersect_key($mappingVotes, array_flip($chpsVotes));
605
			$vote = array_intersect_key($vote, array_flip($voteSelection));
594
			$vote = array_intersect_key($vote, array_flip($voteSelection));
606
			$images[$imgId]['protocoles_votes'][$protoId]['votes'][$vote['vote.id']] = $vote;
595
			$images[$imgId]['protocoles_votes'][$protoId]['votes'][$vote['vote.id']] = $vote;
607
		}
596
		}
608
	}
597
	}
-
 
598
 
-
 
599
	public function getTotalLignesTrouvees() {
-
 
600
		$resultat = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre');
-
 
601
		return intval($resultat['nbre']);
-
 
602
	}
609
}
603
}
610
604