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