From ea8b9ffbac65aeca8f1cf0b8bb91ddb9969cdbeb Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Thu, 27 Mar 2008 09:31:54 +0000 Subject: [PATCH] optimiser les criteres {statut==.*} et optimiser les requetes vides avec jointures sur ARTICLES <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6> --- ecrire/public/composer.php | 11 ++++++++--- ecrire/public/jointures.php | 10 +++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php index 6a950b265e..fcdeb7a763 100644 --- a/ecrire/public/composer.php +++ b/ecrire/public/composer.php @@ -551,7 +551,11 @@ function calculer_select ($select = array(), $from = array(), $menage = false; foreach($where as $k => $v) { - if (is_array($v)) $v = $v[0]; + if (is_array($v)){ + if ((count($v)>=2) && ($v[0]=='REGEXP') && ($v[2]=="'.*'")) $v= false; + elseif ((count($v)>=2) && ($v[0]=='LIKE') && ($v[2]=="'%'")) $v= false; + elseif ($v[0]) $v = $v[0]; + } if ((!$v) OR ($v==1) OR ($v=='0=0')) { unset($where[$k]); $menage = true; @@ -631,8 +635,9 @@ function calculer_select ($select = array(), $from = array(), // ou dans //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8> // qui comporte plusieurs jointures - // cette optimisation ne peut s'appliquer dans aucune boucle articles - // en raison de where ajoutes sur le statut par SPIP lui meme. + // ou dans + // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6> + // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7> list($t,$c) = each($from); reset($from); diff --git a/ecrire/public/jointures.php b/ecrire/public/jointures.php index 4744d75db2..1afc455318 100644 --- a/ecrire/public/jointures.php +++ b/ecrire/public/jointures.php @@ -55,7 +55,7 @@ function fabrique_jointures(&$boucle, $res, $cond=false, $desc=array(), $nom='', } // la clause Group by est en conflit avec ORDER BY, a completer - if (!$pk) foreach(liste_champs_jointures($nom,$desc) as $id_prim){ + if (!$pk) foreach(liste_champs_jointures($nom,$desc,true) as $id_prim){ $id_field = $nom . '.' . $id_prim; if (!in_array($id_field, $boucle->group)) { $boucle->group[] = $id_field; @@ -72,9 +72,13 @@ function fabrique_jointures(&$boucle, $res, $cond=false, $desc=array(), $nom='', // http://doc.spip.org/@liste_champs_jointures -function liste_champs_jointures($nom,$desc){ +function liste_champs_jointures($nom,$desc,$primary=false){ static $nojoin = array('idx','maj','date','statut'); + + // si cle primaire demandee, la privilegier + if ($primary && isset($desc['key']['PRIMARY KEY'])) + return split_key($desc['key']['PRIMARY KEY']); // les champs declares explicitement pour les jointures if (isset($desc['join'])) return $desc['join']; @@ -84,7 +88,7 @@ function liste_champs_jointures($nom,$desc){ // si pas de cle, c'est fichu if (!isset($desc['key'])) return array(); - // si cle primaire, la privilegier + // si cle primaire if (isset($desc['key']['PRIMARY KEY'])) return split_key($desc['key']['PRIMARY KEY']); -- GitLab