Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1362 → Rev 1363

/trunk/services/modules/0.1/observations/ListeObservations.php
84,8 → 84,9
 
$resultat = new ResultatService();
if ($this->requeteSansParametres($ressources, $parametres)) {
$liaisons = $this->chargerLiaisonsSimple($total);
$liaisons = $this->chargerLiaisonsSimple();
$observations = $this->chargerObservations($liaisons);
$total = $this->compterObservations();
$this->navigation->setTotal($total);
// modifie $observations
$this->chargerImages($observations);
102,7 → 103,8
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $resultats);
} else {
$liaisons = $this->chargerLiaisons($total);
$liaisons = $this->chargerLiaisons();
$total = $this->compterObservations();
$this->navigation->setTotal($total);
$observations = $this->chargerObservations($liaisons);
// modifie $observations
470,36 → 472,11
CHARGEMENT DES OBSERVATIONS
--------------------------------------------------------------------------------*/
/**
* Chargement depuis la bdd de toutes les liaisons entre images et observations
*
* Cette triple jointure pose divers problèmes d'efficacité.
* - le SQL_CALC_FOUND_ROWS en premier lieu est (était) inefficace
* (cf http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/)
* - les INDEX ne sont peut-être pas non-plus bien réglés (certains manquent cruellement, notamment
* pour les champs présents dans le ORDER BY)
* - enfin id_utilisateur à un typage très aléatoire selon les tables/vues d'origine
*/
private function chargerLiaisons(&$count) {
$where = $this->chargerClauseWhere();
 
// on effectue d'abord la sélection des observations et leur comptage
// sur une table simple et restreinte (en fait, une vue) sans jointures ...
$r = sprintf('SELECT id_observation FROM del_observation %s ORDER BY %s %s %s',
$where,
$this->tri,
$this->directionTri,
$this->gestionBdd->getLimitSql());
$idObs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'),
$this->bdd->recupererTous($r)));
 
 
$c = $this->bdd->recupererTous(sprintf('SELECT count(1) AS c FROM del_observation AS dob %s', $where));
$count = $c[0]['c'];
 
// puis seulement après l'obtention des données complètes, mais cette fois-ci avec
// l'ensemble prédéterminé d'id d'observations obtenus ci-dessus
* Chargement depuis la bdd de toutes les liaisons entre images et observations
* */
private function chargerLiaisons() {
$requeteLiaisons = sprintf(
'SELECT '.
'SELECT SQL_CALC_FOUND_ROWS '.
' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, di.id_image, '.
' dob.ce_utilisateur, prenom, nom, courriel, '.
513,25 → 490,21
' ON doi.id_observation = dob.id_observation '.
' LEFT JOIN del_image AS di '.
' ON di.id_image = doi.id_image '.
' WHERE dob.id_observation IN (%s) -- %s',
implode(',',$idObs),
'%s'.
' GROUP BY doi.id_observation'.
' ORDER BY %s %s %s -- %s',
$this->chargerClauseWhere(),
$this->tri,
$this->directionTri,
$this->gestionBdd->getLimitSql(),
__FILE__ . ':' . __LINE__);
 
return $this->bdd->recupererTous($requeteLiaisons);
}
 
private function chargerLiaisonsSimple(&$count) {
$r = sprintf('SELECT id_observation FROM del_observation ORDER BY %s %s %s',
$this->tri,
$this->directionTri,
$this->gestionBdd->getLimitSql());
$idObs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'),
$this->bdd->recupererTous($r)));
 
$c = $this->bdd->recupererTous('SELECT count(1) AS c FROM del_observation');
$count = $c[0]['c'];
 
$requeteLiaisons = sprintf(
'SELECT '.
private function chargerLiaisonsSimple() {
$requeteObs = sprintf(
'SELECT SQL_CALC_FOUND_ROWS '.
' dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, '.
' station, milieu, date_observation, dob.mots_cles_texte, date_transmission, '.
' dob.ce_utilisateur, prenom, nom, courriel, '.
540,10 → 513,14
' dob.nt, dob.nom_sel_nn '.
'FROM del_observation AS dob '.
' LEFT JOIN del_utilisateur AS du ON dob.ce_utilisateur = du.id_utilisateur '.
' WHERE dob.id_observation IN (%s) -- %s',
implode(',',$idObs),
' ORDER BY %s %s %s -- %s',
$this->tri,
$this->directionTri,
$this->gestionBdd->getLimitSql(),
__FILE__ . ':' . __LINE__);
return $this->bdd->recupererTous($requeteLiaisons);
$liaisons = $this->bdd->recupererTous($requeteObs);
 
return $liaisons;
}
 
/**