[spip-dev] r11162 - spip/ecrire/public

* cedric@yterium.com tapuscrivait, le 30/01/2008 22:56:

Author: cedric@yterium.com
Date: 2008-01-30 22:56:01 +0100 (mer, 30 jan 2008)
New Revision: 11162

Log:
differencier le {!xxx IN truc} du {xxx !IN truc}
le premier indique une exclusion d'un sous ensemble, le second une inclusion d'un autre sous ensemble
(idem avec == )
on a donc crit->exclus et crit->not dans le compilateur
A noter que {!xxx IN truc} produit une ecriture assez peu optimisee puisque le FIELD(L2.id_groupe,1) AS cpt1 reste dans le select de la premiere requete
et le "group by cpt1" aussi. a creuser
Cela doit neanmoins produire le resultat escompte dans tous les cas maintenant

Ben non :frowning:
Avec ce squelette :
BOUCLE_Secteurs2(RUBRIQUES){racine}{par num titre}{!titre_mot IN MenuHaut,PasDansMenu}>

ça compile :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique, FIELD(L2.titre,'MenuHaut','PasDansMenu') AS cpt1, rubriques.titre, rubriques.id_rubrique, rubriques.lang
  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 (rubriques.statut = 'publie')
      AND (rubriques.id_parent = 0)
      AND NOT((rubriques.id_rubrique IN (
  SELECT rubriques.id_rubrique
  FROM `db_spip`.spip_rubriques AS `rubriques`
      INNER JOIN `db_spip`.spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
      INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
  WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
  GROUP BY rubriques.id_rubrique
  ORDER BY num

qui ne renvoit rien.

En transformant la requête en :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique, FIELD(L2.titre,'MenuHaut','PasDansMenu') AS cpt1, rubriques.titre, rubriques.id_rubrique, rubriques.lang
  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 (rubriques.statut = 'publie')
      AND (rubriques.id_parent = 0)
      AND NOT((rubriques.id_rubrique IN (
  SELECT rubriques.id_rubrique
  FROM `db_spip`.spip_rubriques AS `rubriques`
      INNER JOIN `db_spip`.spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
      INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
  WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
  GROUP BY rubriques.id_rubrique
  ORDER BY num

ça renvoit la bonne liste, mais non triée par 'num'.

En enlevant en plus le GROUP BY rubriques.id_rubrique c'est trié par 'num'.

Et la requête peut encore être simplifiée en :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique, rubriques.titre, rubriques.id_rubrique, rubriques.lang
  FROM spip_rubriques AS `rubriques`
  WHERE (rubriques.statut = 'publie')
      AND (rubriques.id_parent = 0)
      AND NOT((rubriques.id_rubrique IN (
  SELECT L1.id_rubrique
  FROM `db_spip`.spip_mots_rubriques AS L1
      INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
  WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
  ORDER BY num

* cedric@yterium.com tapuscrivait, le
30/01/2008 22:56:

Author: cedric@yterium.com
Date: 2008-01-30 22:56:01 +0100 (mer, 30 jan 2008)
New Revision: 11162

Log:
differencier le {!xxx IN truc} du {xxx !IN truc}
le premier indique une exclusion d'un sous ensemble, le second une inclusion d'un autre sous ensemble
(idem avec == )
on a donc crit->exclus et crit->not dans le compilateur
A noter que {!xxx IN truc} produit une ecriture assez peu optimisee puisque le
FIELD(L2.id_groupe,1) AS cpt1 reste dans le select de la premiere requete
et le "group by cpt1" aussi. a creuser
Cela doit neanmoins produire le resultat escompte dans tous les cas maintenant

Ben non :frowning:
Avec ce squelette :
BOUCLE_Secteurs2(RUBRIQUES){racine}{par num titre}{!titre_mot IN
MenuHaut,PasDansMenu}>

ça compile :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique,
FIELD(L2.titre,'MenuHaut','PasDansMenu') AS cpt1, rubriques.titre,
rubriques.id_rubrique, rubriques.lang
  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 (rubriques.statut = 'publie')
      AND (rubriques.id_parent = 0)
      AND NOT((rubriques.id_rubrique IN (
  SELECT rubriques.id_rubrique
  FROM `db_spip`.spip_rubriques AS `rubriques`
      INNER JOIN `db_spip`.spip_mots_rubriques AS L1 ON (L1.id_rubrique =
rubriques.id_rubrique)
      INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
  WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
  GROUP BY rubriques.id_rubrique
  ORDER BY num

qui ne renvoit rien.

En transformant la requête en :

ou est la différence ? je l'ai lu 3 fois sans la voir ... :frowning:

SELECT 0+rubriques.titre AS num, rubriques.id_rubrique,
FIELD(L2.titre,'MenuHaut','PasDansMenu') AS cpt1, rubriques.titre,
rubriques.id_rubrique, rubriques.lang
  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 (rubriques.statut = 'publie')
      AND (rubriques.id_parent = 0)
      AND NOT((rubriques.id_rubrique IN (
  SELECT rubriques.id_rubrique
  FROM `db_spip`.spip_rubriques AS `rubriques`
      INNER JOIN `db_spip`.spip_mots_rubriques AS L1 ON (L1.id_rubrique =
rubriques.id_rubrique)
      INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
  WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
  GROUP BY rubriques.id_rubrique
  ORDER BY num

ça renvoit la bonne liste, mais non triée par 'num'.

En enlevant en plus le GROUP BY rubriques.id_rubrique c'est trié par 'num'.

Et la requête peut encore être simplifiée en :

oui c'est l'objet des simplifications qui restent à faire, mais pas si triviales ...

* Cédric MORIN tapuscrivait, le 30/01/2008 23:45:

* cedric@yterium.com tapuscrivait, le
30/01/2008 22:56:

Author: cedric@yterium.com
Date: 2008-01-30 22:56:01 +0100 (mer, 30 jan 2008)
New Revision: 11162

Log:
differencier le {!xxx IN truc} du {xxx !IN truc}
le premier indique une exclusion d'un sous ensemble, le second une inclusion d'un autre sous ensemble
(idem avec == )
on a donc crit->exclus et crit->not dans le compilateur
A noter que {!xxx IN truc} produit une ecriture assez peu optimisee puisque le
FIELD(L2.id_groupe,1) AS cpt1 reste dans le select de la premiere requete
et le "group by cpt1" aussi. a creuser
Cela doit neanmoins produire le resultat escompte dans tous les cas maintenant

Ben non :frowning:
Avec ce squelette :
BOUCLE_Secteurs2(RUBRIQUES){racine}{par num titre}{!titre_mot IN
MenuHaut,PasDansMenu}>

ça compile :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique,
FIELD(L2.titre,'MenuHaut','PasDansMenu') AS cpt1, rubriques.titre,
rubriques.id_rubrique, rubriques.lang
  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 (rubriques.statut = 'publie')
      AND (rubriques.id_parent = 0)
      AND NOT((rubriques.id_rubrique IN (
  SELECT rubriques.id_rubrique
  FROM `db_spip`.spip_rubriques AS `rubriques`
      INNER JOIN `db_spip`.spip_mots_rubriques AS L1 ON (L1.id_rubrique =
rubriques.id_rubrique)
      INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
  WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
  GROUP BY rubriques.id_rubrique
  ORDER BY num

qui ne renvoit rien.

En transformant la requête en :

ou est la différence ? je l'ai lu 3 fois sans la voir ... :frowning:

Oups ! Mauvais copier/coller :
SELECT 0+rubriques.titre AS num, rubriques.id_rubrique, rubriques.titre, rubriques.id_rubrique, rubriques.lang
  FROM spip_rubriques AS `rubriques`
  WHERE (rubriques.statut = 'publie')
      AND (rubriques.id_parent = 0)
      AND NOT((rubriques.id_rubrique IN (
  SELECT rubriques.id_rubrique
  FROM `db_spip`.spip_rubriques AS `rubriques`
      INNER JOIN `db_spip`.spip_mots_rubriques AS L1 ON (L1.id_rubrique = rubriques.id_rubrique)
      INNER JOIN `db_spip`.spip_mots AS L2 ON (L2.id_mot = L1.id_mot)
  WHERE (FIELD(L2.titre,'MenuHaut','PasDansMenu') <> 0))))
  GROUP BY rubriques.id_rubrique
  ORDER BY num

Donc, j'ai enlevé les INNER JOIN de la requête principale ET le
, FIELD(L2.titre,'MenuHaut','PasDansMenu') AS cpt1 du FROM de la requête principale.

ça renvoit la bonne liste, mais non triée par 'num'.

En enlevant en plus le GROUP BY rubriques.id_rubrique c'est trié par 'num'.

Et la requête peut encore être simplifiée en :

oui c'est l'objet des simplifications qui restent à faire, mais pas si triviales ...

C'est sûr !

Je donnais la simplification juste comme ça.