From 0bb4cbeeade1eaffd8b8c82cf3ef27eb9a0b5295 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sat, 9 Feb 2008 19:55:20 +0000
Subject: [PATCH] =?UTF-8?q?Compl=C3=A9ment=20=C3=A0=20[11901]:=20la=20supp?=
 =?UTF-8?q?ression=20de=20la=20table=20principale=20dans=20la=20requ=C3=AA?=
 =?UTF-8?q?te=20lorsque=20celle-ci=20ne=20concerne=20en=20fait=20que=20la?=
 =?UTF-8?q?=20jointutre=20s'=C3=A9tend=20au=20cas=20de=20plusieurs=20joint?=
 =?UTF-8?q?ures=20et=20non=20plus=20une=20seule.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Application: trouver dans une hiérarchie la rubrique ayant un mot clé d'un certain groupe:

{{{
<BOUCLE2(HIERARCHIE)
		{id_rubrique}
		{tout}
		{type='Squelette'}
		{inverse}
		{0,1}
		{lang_select=non}
}}}
se compile en
{{{
SELECT L1.id_rubrique
FROM  spip_mots_rubriques AS L1
    INNER JOIN spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (L2.type = 'Squelette')
    AND (L1.id_rubrique IN (329,589,645))
GROUP BY L1.id_rubrique
ORDER BY FIELD(L1.id_rubrique, 329,589,645) DESC
LIMIT 0,1
}}}
et non plus en
{{{
SELECT rubriques.id_rubrique
FROM spip_rubriques AS `rubriques`
    INNER JOIN spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
    INNER JOIN spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
WHERE (L2.type = 'Squelette')
    AND (rubriques.id_rubrique IN (329,589,645))
GROUP BY rubriques.id_rubrique
ORDER BY FIELD(rubriques.id_rubrique, 329,589,645) DESC
LIMIT 0,1
}}}
Il faut le critère {{{ {lang_select=non} }}} autrement le champ lang est mis d'office et empêche la disparition. Il faudrait voir si cette mise d'office e pourrait pas être évitée.
---
 ecrire/public/composer.php | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php
index 955bb882a6..f1cbddf5f1 100644
--- a/ecrire/public/composer.php
+++ b/ecrire/public/composer.php
@@ -584,15 +584,14 @@ function calculer_select ($select = array(), $from = array(),
 	  list($t,$c) = each($from);
 	  reset($from);
 	  $e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
-	  if (!( count($equiv) <> 1 OR // a faire sauter un jour
-		 strpos($t, ' ') OR // jointure des le depart cf boucle_doc
+	  if (!(strpos($t, ' ') OR // jointure des le depart cf boucle_doc
 		 calculer_jointnul($t, $select, $e) OR
 		 calculer_jointnul($t, $join, $e) OR
 		 calculer_jointnul($t, $where, $e) OR
 		 calculer_jointnul($t, $having, $e))) {
 	    unset($from[$t]);
 	    // bien garder les espaces pour le strpos ci-dessus
-	    preg_match('/^\s*\w*\s*JOIN\s+(.*?AS\s+(\w+)\s+)ON\s*[(][^.]*[.](\w+)[^)]*[)](.*)$/', $sfrom, $r);
+	    $x = preg_match('/^\s*\w*\s*JOIN\s+(.*?AS\s+(\w+)\s+)ON\s*[(][^.]*[.](\w+)[^)]*[)](.*)$/s', $sfrom, $r);
 	    $sfrom = $r[1].  $r[4];
 	    $e = '/\b' . $t . '\.' . $r[3] .'\b/';
 	    $t = $r[2] . '.' . $r[3];
@@ -600,6 +599,8 @@ function calculer_select ($select = array(), $from = array(),
 	    $join = remplacer_jointnul($t, $join, $e);
 	    $where = remplacer_jointnul($t, $where, $e);
 	    $having = remplacer_jointnul($t, $having, $e);
+	    $groupby = remplacer_jointnul($t, $groupby, $e);
+	    $orderby = remplacer_jointnul($t, $orderby, $e);
 	  }
 	  $from[-1] = $sfrom; 
 	}
-- 
GitLab