Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1353 Rev 1355
Line 80... Line 80...
80
		$this->verifierParametresTri();
80
		$this->verifierParametresTri();
81
		$this->initialiserTri();
81
		$this->initialiserTri();
Line 82... Line 82...
82
 
82
 
83
		$resultat = new ResultatService();
83
		$resultat = new ResultatService();
84
		if ($this->requeteSansParametres($ressources, $parametres)) {
84
		if ($this->requeteSansParametres($ressources, $parametres)) {
85
			$liaisons = $this->chargerLiaisonsSimple();
85
			$liaisons = $this->chargerLiaisonsSimple($total);
86
			$observations = $this->chargerObservations($liaisons);
-
 
87
			$total = $this->compterObservations();
86
			$observations = $this->chargerObservations($liaisons);
88
			$this->navigation->setTotal($total);
87
			$this->navigation->setTotal($total);
89
			// modifie $observations
88
			// modifie $observations
90
			$this->chargerImages($observations);
89
			$this->chargerImages($observations);
91
			// modifie $observations
90
			// modifie $observations
Line 99... Line 98...
99
			}
98
			}
Line 100... Line 99...
100
 
99
 
101
			// Mettre en forme le résultat et l'envoyer pour affichage
100
			// Mettre en forme le résultat et l'envoyer pour affichage
102
			$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $resultats);
101
			$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $resultats);
103
		} else {
102
		} else {
104
			$liaisons = $this->chargerLiaisons();
-
 
105
			$total = $this->compterObservations();
103
			$liaisons = $this->chargerLiaisons($total);
106
			$this->navigation->setTotal($total);
104
			$this->navigation->setTotal($total);
107
			$observations = $this->chargerObservations($liaisons);
105
			$observations = $this->chargerObservations($liaisons);
108
			// modifie $observations
106
			// modifie $observations
109
			$this->chargerImages($observations);
107
			$this->chargerImages($observations);
Line 470... Line 468...
470
 
468
 
471
	/*-------------------------------------------------------------------------------
469
	/*-------------------------------------------------------------------------------
472
								CHARGEMENT DES OBSERVATIONS
470
								CHARGEMENT DES OBSERVATIONS
473
	--------------------------------------------------------------------------------*/
471
	--------------------------------------------------------------------------------*/
474
	/**
472
	/**
-
 
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)
475
	* Chargement depuis la bdd de toutes les liaisons entre images et observations
480
	 * - enfin id_utilisateur à un typage très aléatoire selon les tables/vues d'origine
476
	* */
481
	 */
-
 
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
477
	private function chargerLiaisons() {
500
		// l'ensemble prédéterminé d'id d'observations obtenus ci-dessus
478
		$requeteLiaisons = sprintf(
501
		$requeteLiaisons = sprintf(
479
			'SELECT SQL_CALC_FOUND_ROWS '.
502
			'SELECT '.
480
			' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
503
			' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
481
			' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, di.id_image, '.
504
			' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, di.id_image, '.
482
			' dob.ce_utilisateur, prenom, nom, courriel, '.
505
			' dob.ce_utilisateur, prenom, nom, courriel, '.
483
			' dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, '.
506
			' dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, '.
Line 488... Line 511...
488
			'  ON du.id_utilisateur = dob.ce_utilisateur '.
511
			'  ON du.id_utilisateur = dob.ce_utilisateur '.
489
			' LEFT JOIN del_obs_image AS doi '.
512
			' LEFT JOIN del_obs_image AS doi '.
490
			'  ON doi.id_observation = dob.id_observation '.
513
			'  ON doi.id_observation = dob.id_observation '.
491
			' LEFT JOIN del_image AS di '.
514
			' LEFT JOIN del_image AS di '.
492
			'  ON di.id_image = doi.id_image '.
515
			'  ON di.id_image = doi.id_image '.
493
			'%s'.
-
 
494
			' GROUP BY doi.id_observation'.
516
			' WHERE dob.id_observation IN (%s) -- %s',
495
			' ORDER BY %s %s %s -- %s',
-
 
496
			$this->chargerClauseWhere(),
-
 
497
			$this->tri,
-
 
498
			$this->directionTri,
517
			implode(',',$idObs),
499
			$this->gestionBdd->getLimitSql(),
-
 
500
			__FILE__ . ':' . __LINE__);
518
			__FILE__ . ':' . __LINE__);
501
 
-
 
502
		return $this->bdd->recupererTous($requeteLiaisons);
519
		return $this->bdd->recupererTous($requeteLiaisons);
503
	}
520
	}
Line 504... Line 521...
504
 
521
 
-
 
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'];
505
	private function chargerLiaisonsSimple() {
532
 
506
		$requeteObs = sprintf(
533
		$requeteLiaisons = sprintf(
507
			'SELECT SQL_CALC_FOUND_ROWS '.
534
			'SELECT '.
508
			' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
535
			' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
509
			' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, '.
536
			' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, '.
510
			' dob.ce_utilisateur, prenom, nom, courriel, '.
537
			' dob.ce_utilisateur, prenom, nom, courriel, '.
511
			' dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, '.
538
			' dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, '.
512
			' dob.commentaire as dob_commentaire, '.
539
			' dob.commentaire as dob_commentaire, '.
513
			' dob.nt, dob.nom_sel_nn '.
540
			' dob.nt, dob.nom_sel_nn '.
514
			'FROM del_observation AS dob '.
541
			'FROM del_observation AS dob '.
515
			' LEFT JOIN del_utilisateur AS du ON dob.ce_utilisateur = du.id_utilisateur '.
542
			' LEFT JOIN del_utilisateur AS du ON dob.ce_utilisateur = du.id_utilisateur '.
516
			' ORDER BY %s %s %s -- %s',
-
 
517
			$this->tri,
543
			' WHERE dob.id_observation IN (%s) -- %s',
518
			$this->directionTri,
-
 
519
			$this->gestionBdd->getLimitSql(),
544
			implode(',',$idObs),
520
			__FILE__ . ':' . __LINE__);
545
			__FILE__ . ':' . __LINE__);
521
		$liaisons = $this->bdd->recupererTous($requeteObs);
-
 
522
 
-
 
523
		return $liaisons;
546
		return $this->bdd->recupererTous($requeteLiaisons);
Line 524... Line 547...
524
	}
547
	}
525
 
548
 
526
	/**
549
	/**