82,9 → 82,8 |
|
$resultat = new ResultatService(); |
if ($this->requeteSansParametres($ressources, $parametres)) { |
$liaisons = $this->chargerLiaisonsSimple(); |
$liaisons = $this->chargerLiaisonsSimple($total); |
$observations = $this->chargerObservations($liaisons); |
$total = $this->compterObservations(); |
$this->navigation->setTotal($total); |
// modifie $observations |
$this->chargerImages($observations); |
101,8 → 100,7 |
// 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 = $this->compterObservations(); |
$liaisons = $this->chargerLiaisons($total); |
$this->navigation->setTotal($total); |
$observations = $this->chargerObservations($liaisons); |
// modifie $observations |
472,11 → 470,36 |
CHARGEMENT DES OBSERVATIONS |
--------------------------------------------------------------------------------*/ |
/** |
* Chargement depuis la bdd de toutes les liaisons entre images et observations |
* */ |
private function chargerLiaisons() { |
* 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 |
$requeteLiaisons = sprintf( |
'SELECT SQL_CALC_FOUND_ROWS '. |
'SELECT '. |
' 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, '. |
490,21 → 513,25 |
' ON doi.id_observation = dob.id_observation '. |
' LEFT JOIN del_image AS di '. |
' ON di.id_image = doi.id_image '. |
'%s'. |
' GROUP BY doi.id_observation'. |
' ORDER BY %s %s %s -- %s', |
$this->chargerClauseWhere(), |
$this->tri, |
$this->directionTri, |
$this->gestionBdd->getLimitSql(), |
' WHERE dob.id_observation IN (%s) -- %s', |
implode(',',$idObs), |
__FILE__ . ':' . __LINE__); |
|
return $this->bdd->recupererTous($requeteLiaisons); |
} |
|
private function chargerLiaisonsSimple() { |
$requeteObs = sprintf( |
'SELECT SQL_CALC_FOUND_ROWS '. |
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 '. |
' 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, '. |
513,14 → 540,10 |
' dob.nt, dob.nom_sel_nn '. |
'FROM del_observation AS dob '. |
' LEFT JOIN del_utilisateur AS du ON dob.ce_utilisateur = du.id_utilisateur '. |
' ORDER BY %s %s %s -- %s', |
$this->tri, |
$this->directionTri, |
$this->gestionBdd->getLimitSql(), |
' WHERE dob.id_observation IN (%s) -- %s', |
implode(',',$idObs), |
__FILE__ . ':' . __LINE__); |
$liaisons = $this->bdd->recupererTous($requeteObs); |
|
return $liaisons; |
return $this->bdd->recupererTous($requeteLiaisons); |
} |
|
/** |