Line 45... |
Line 45... |
45 |
* - subqueries dans le FROM pour les critère WHERE portant directement sur v_del_image
|
45 |
* - subqueries dans le FROM pour les critère WHERE portant directement sur v_del_image
|
46 |
* plutôt que dans WHERE (qui nécessite dès lors un FULL-JOIN)
|
46 |
* plutôt que dans WHERE (qui nécessite dès lors un FULL-JOIN)
|
47 |
* (http://www.mysqlperformanceblog.com/2007/04/06/using-delayed-join-to-optimize-count-and-limit-queries/)
|
47 |
* (http://www.mysqlperformanceblog.com/2007/04/06/using-delayed-join-to-optimize-count-and-limit-queries/)
|
48 |
* - éviter de dépendre d'une jointure systématique sur `cel_obs`, uniquement pour `(date_)transmission
|
48 |
* - éviter de dépendre d'une jointure systématique sur `cel_obs`, uniquement pour `(date_)transmission
|
49 |
* (cf VIEW del_image)
|
49 |
* (cf VIEW del_image)
|
50 |
* - poursuivre la réorganisation des méthodes statiques parmis Observation, ListeObservations et ListImages2
|
50 |
* - poursuivre la réorganisation des méthodes statiques parmis Observation, ListeObservations et ListeImages2
|
51 |
* - *peut-être*: passer requestFilterParams() en méthode de classe
|
51 |
* - *peut-être*: passer requestFilterParams() en méthode de classe
|
52 |
*
|
52 |
*
|
53 |
*
|
53 |
*
|
54 |
* MySQL sux:
|
54 |
* MySQL sux:
|
55 |
* EXPLAIN SELECT id_image FROM v_del_image vdi WHERE vdi.id_image IN (SELECT ce_image FROM del_image_tag WHERE actif = 1 LIMIT 1);
|
55 |
* EXPLAIN SELECT id_image FROM v_del_image vdi WHERE vdi.id_image IN (SELECT ce_image FROM del_image_tag WHERE actif = 1 LIMIT 1);
|
Line 64... |
Line 64... |
64 |
* FORCE INDEX/IGNORE INDEX semble incapable de résoudre le problème de l'optimiseur MySQL
|
64 |
* FORCE INDEX/IGNORE INDEX semble incapable de résoudre le problème de l'optimiseur MySQL
|
65 |
*
|
65 |
*
|
66 |
*/
|
66 |
*/
|
Line 67... |
Line 67... |
67 |
|
67 |
|
68 |
require_once(dirname(__FILE__) . '/../DelTk.php');
|
- |
|
69 |
require_once(dirname(__FILE__) . '/../observations/ListeObservations.php');
|
68 |
require_once(dirname(__FILE__) . '/../DelTk.php');
|
70 |
require_once(dirname(__FILE__) . '/../observations/Observation.php');
|
69 |
require_once(dirname(__FILE__) . '/../observations/Observation.php');
|
71 |
restore_error_handler();
|
70 |
restore_error_handler();
|
72 |
restore_exception_handler();
|
71 |
restore_exception_handler();
|
Line 178... |
Line 177... |
178 |
/* $this->conteneur->setParametre('url_images', sprintf($this->conteneur->getParametre('url_images'),
|
177 |
/* $this->conteneur->setParametre('url_images', sprintf($this->conteneur->getParametre('url_images'),
|
179 |
"%09d", $params['format']));*/
|
178 |
"%09d", $params['format']));*/
|
Line 180... |
Line 179... |
180 |
|
179 |
|
181 |
// création des contraintes (génériques de DelTk)
|
180 |
// création des contraintes (génériques de DelTk)
|
182 |
DelTk::sqlAddConstraint($params, $db, $req);
|
- |
|
183 |
// création des contraintes héritées de Identiplante (TODO: needed ??)
|
- |
|
184 |
ListeObservations::sqlAddConstraint($params, $db, $req, $this->conteneur);
|
181 |
DelTk::sqlAddConstraint($params, $db, $req);
|
185 |
// création des contraintes spécifiques (sur les tags essentiellement)
|
182 |
// création des contraintes spécifiques (sur les tags essentiellement)
|
186 |
self::sqlAddConstraint($params, $db, $req, $this->conteneur);
|
183 |
self::sqlAddConstraint($params, $db, $req, $this->conteneur);
|
187 |
// création des contraintes spécifiques impliquées par le masque général
|
184 |
// création des contraintes spécifiques impliquées par le masque général
|
188 |
self::sqlAddMasqueConstraint($params, $db, $req, $this->conteneur);
|
185 |
self::sqlAddMasqueConstraint($params, $db, $req, $this->conteneur);
|
Line 472... |
Line 469... |
472 |
de manière identique à la seule différence que:
|
469 |
de manière identique à la seule différence que:
|
473 |
1) ils sont combinés par des "OU" logiques plutôt que des "ET".
|
470 |
1) ils sont combinés par des "OU" logiques plutôt que des "ET".
|
474 |
2) les tags sont traités différemment pour conserver la compatibilité avec l'utilisation historique:
|
471 |
2) les tags sont traités différemment pour conserver la compatibilité avec l'utilisation historique:
|
475 |
Tous les mots-clefs doivent matcher et sont séparés par des espaces
|
472 |
Tous les mots-clefs doivent matcher et sont séparés par des espaces
|
476 |
(dit autrement, str_replace(" ", ".*", $mots-clefs-requête) =~ $mots-clefs-mysql)
|
473 |
(dit autrement, str_replace(" ", ".*", $mots-clefs-requête) =~ $mots-clefs-mysql)
|
477 |
Pour plus d'information: ListeObservations::sqlAddMasqueConstraint() */
|
474 |
Pour plus d'information: (ListeObservations|DelTk)::sqlAddMasqueConstraint() */
|
478 |
static function sqlAddMasqueConstraint($p, $db, &$req, Conteneur $c = NULL) {
|
475 |
static function sqlAddMasqueConstraint($p, $db, &$req, Conteneur $c = NULL) {
|
479 |
if(!empty($p['masque'])) {
|
476 |
if(!empty($p['masque'])) {
|
480 |
$or_params = array('masque.auteur' => $p['masque'],
|
477 |
$or_params = array('masque.auteur' => $p['masque'],
|
481 |
'masque.departement' => $p['masque'],
|
478 |
'masque.departement' => $p['masque'],
|
482 |
'masque.commune' => $p['masque'], // TODO/XXX ?
|
479 |
'masque.commune' => $p['masque'], // TODO/XXX ?
|
Line 508... |
Line 505... |
508 |
|
505 |
|
509 |
|
506 |
|
510 |
// pas de select, groupby & co ici: uniquement 'join' et 'where'
|
507 |
// pas de select, groupby & co ici: uniquement 'join' et 'where'
|
511 |
$or_req = array('join' => array(), 'where' => array());
|
- |
|
512 |
DelTk::sqlAddConstraint($or_masque, $db, $or_req);
|
508 |
$or_req = array('join' => array(), 'where' => array());
|
Line 513... |
Line 509... |
513 |
ListeObservations::sqlAddConstraint($or_masque, $db, $or_req);
|
509 |
DelTk::sqlAddConstraint($or_masque, $db, $or_req);
|
514 |
self::sqlAddConstraint($or_masque, $db, $or_req);
|
510 |
self::sqlAddConstraint($or_masque, $db, $or_req);
|
515 |
|
511 |
|