Subversion Repositories eFlore/Applications.del

Rev

Rev 1357 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1357 Rev 1363
Line 82... Line 82...
82
		$this->verifierParametresTri();
82
		$this->verifierParametresTri();
83
		$this->initialiserTri();
83
		$this->initialiserTri();
Line 84... Line 84...
84
 
84
 
85
		$resultat = new ResultatService();
85
		$resultat = new ResultatService();
86
		if ($this->requeteSansParametres($ressources, $parametres)) {
86
		if ($this->requeteSansParametres($ressources, $parametres)) {
87
			$liaisons = $this->chargerLiaisonsSimple($total);
87
			$liaisons = $this->chargerLiaisonsSimple();
-
 
88
			$observations = $this->chargerObservations($liaisons);
88
			$observations = $this->chargerObservations($liaisons);
89
			$total = $this->compterObservations();
89
			$this->navigation->setTotal($total);
90
			$this->navigation->setTotal($total);
90
			// modifie $observations
91
			// modifie $observations
91
			$this->chargerImages($observations);
92
			$this->chargerImages($observations);
92
			// modifie $observations
93
			// modifie $observations
Line 100... Line 101...
100
			}
101
			}
Line 101... Line 102...
101
 
102
 
102
			// Mettre en forme le résultat et l'envoyer pour affichage
103
			// Mettre en forme le résultat et l'envoyer pour affichage
103
			$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $resultats);
104
			$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $resultats);
104
		} else {
105
		} else {
-
 
106
			$liaisons = $this->chargerLiaisons();
105
			$liaisons = $this->chargerLiaisons($total);
107
			$total = $this->compterObservations();
106
			$this->navigation->setTotal($total);
108
			$this->navigation->setTotal($total);
107
			$observations = $this->chargerObservations($liaisons);
109
			$observations = $this->chargerObservations($liaisons);
108
			// modifie $observations
110
			// modifie $observations
109
			$this->chargerImages($observations);
111
			$this->chargerImages($observations);
Line 468... Line 470...
468
 
470
 
469
	/*-------------------------------------------------------------------------------
471
	/*-------------------------------------------------------------------------------
470
								CHARGEMENT DES OBSERVATIONS
472
								CHARGEMENT DES OBSERVATIONS
471
	--------------------------------------------------------------------------------*/
473
	--------------------------------------------------------------------------------*/
472
	/**
474
	/**
473
	 * Chargement depuis la bdd de toutes les liaisons entre images et observations
-
 
474
	 *
-
 
475
	 * Cette triple jointure pose divers problèmes d'efficacité.
-
 
476
	 * - le SQL_CALC_FOUND_ROWS en premier lieu est (était) inefficace
-
 
477
	 * (cf http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/)
-
 
478
	 * - les INDEX ne sont peut-être pas non-plus bien réglés (certains manquent cruellement, notamment
-
 
479
	 * pour les champs présents dans le ORDER BY)
-
 
480
	 * - enfin id_utilisateur à un typage très aléatoire selon les tables/vues d'origine
475
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
481
	 */
476
	* */
482
	private function chargerLiaisons(&$count) {
-
 
483
		$where = $this->chargerClauseWhere();
-
 
484
 
-
 
485
		// on effectue d'abord la sélection des observations et leur comptage
-
 
486
		// sur une table simple et restreinte (en fait, une vue) sans jointures ...
-
 
487
		$r = sprintf('SELECT id_observation FROM del_observation %s ORDER BY %s %s %s',
-
 
488
					 $where,
-
 
489
					 $this->tri,
-
 
490
					 $this->directionTri,
-
 
491
					 $this->gestionBdd->getLimitSql());
-
 
492
		$idObs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'),
-
 
493
										$this->bdd->recupererTous($r)));
-
 
494
 
-
 
495
 
-
 
496
		$c = $this->bdd->recupererTous(sprintf('SELECT count(1) AS c FROM del_observation AS dob %s', $where));
-
 
497
		$count = $c[0]['c'];
-
 
498
 
-
 
499
		// puis seulement après l'obtention des données complètes, mais cette fois-ci avec
-
 
500
		// l'ensemble prédéterminé d'id d'observations obtenus ci-dessus
477
	private function chargerLiaisons() {
501
		$requeteLiaisons = sprintf(
478
		$requeteLiaisons = sprintf(
502
			'SELECT '.
479
			'SELECT SQL_CALC_FOUND_ROWS '.
503
			' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
480
			' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
504
			' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, di.id_image, '.
481
			' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, di.id_image, '.
505
			' dob.ce_utilisateur, prenom, nom, courriel, '.
482
			' dob.ce_utilisateur, prenom, nom, courriel, '.
506
			' dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, '.
483
			' dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, '.
Line 511... Line 488...
511
			'  ON du.id_utilisateur = dob.ce_utilisateur '.
488
			'  ON du.id_utilisateur = dob.ce_utilisateur '.
512
			' LEFT JOIN del_obs_image AS doi '.
489
			' LEFT JOIN del_obs_image AS doi '.
513
			'  ON doi.id_observation = dob.id_observation '.
490
			'  ON doi.id_observation = dob.id_observation '.
514
			' LEFT JOIN del_image AS di '.
491
			' LEFT JOIN del_image AS di '.
515
			'  ON di.id_image = doi.id_image '.
492
			'  ON di.id_image = doi.id_image '.
-
 
493
			'%s'.
516
			' WHERE dob.id_observation IN (%s) -- %s',
494
			' GROUP BY doi.id_observation'.
-
 
495
			' ORDER BY %s %s %s -- %s',
-
 
496
			$this->chargerClauseWhere(),
-
 
497
			$this->tri,
517
			implode(',',$idObs),
498
			$this->directionTri,
-
 
499
			$this->gestionBdd->getLimitSql(),
518
			__FILE__ . ':' . __LINE__);
500
			__FILE__ . ':' . __LINE__);
-
 
501
 
519
		return $this->bdd->recupererTous($requeteLiaisons);
502
		return $this->bdd->recupererTous($requeteLiaisons);
520
	}
503
	}
Line 521... Line 504...
521
 
504
 
522
	private function chargerLiaisonsSimple(&$count) {
-
 
523
		$r = sprintf('SELECT id_observation FROM del_observation ORDER BY %s %s %s',
-
 
524
					   $this->tri,
-
 
525
					   $this->directionTri,
-
 
526
					   $this->gestionBdd->getLimitSql());
-
 
527
		$idObs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'),
-
 
528
										$this->bdd->recupererTous($r)));
-
 
529
 
-
 
530
		$c = $this->bdd->recupererTous('SELECT count(1) AS c FROM del_observation');
-
 
531
		$count = $c[0]['c'];
-
 
532
 
505
	private function chargerLiaisonsSimple() {
533
		$requeteLiaisons = sprintf(
506
		$requeteObs = sprintf(
534
			'SELECT '.
507
			'SELECT SQL_CALC_FOUND_ROWS '.
535
			' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
508
			' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
536
			' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, '.
509
			' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, '.
537
			' dob.ce_utilisateur, prenom, nom, courriel, '.
510
			' dob.ce_utilisateur, prenom, nom, courriel, '.
538
			' dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, '.
511
			' dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, '.
539
			' dob.commentaire as dob_commentaire, '.
512
			' dob.commentaire as dob_commentaire, '.
540
			' dob.nt, dob.nom_sel_nn '.
513
			' dob.nt, dob.nom_sel_nn '.
541
			'FROM del_observation AS dob '.
514
			'FROM del_observation AS dob '.
542
			' LEFT JOIN del_utilisateur AS du ON dob.ce_utilisateur = du.id_utilisateur '.
515
			' LEFT JOIN del_utilisateur AS du ON dob.ce_utilisateur = du.id_utilisateur '.
-
 
516
			' ORDER BY %s %s %s -- %s',
543
			' WHERE dob.id_observation IN (%s) -- %s',
517
			$this->tri,
-
 
518
			$this->directionTri,
544
			implode(',',$idObs),
519
			$this->gestionBdd->getLimitSql(),
545
			__FILE__ . ':' . __LINE__);
520
			__FILE__ . ':' . __LINE__);
-
 
521
		$liaisons = $this->bdd->recupererTous($requeteObs);
-
 
522
 
546
		return $this->bdd->recupererTous($requeteLiaisons);
523
		return $liaisons;
Line 547... Line 524...
547
	}
524
	}
548
 
525
 
549
	/**
526
	/**