r11091 - in spip/ecrire: public req

Author: esj@rezo.net
Date: 2008-01-17 19:06:31 +0100 (jeu, 17 jan 2008)
New Revision: 11091

Log:
Compilation d'une boucle sans que sa table n'aparaisse dans la requête SQL. Trop beau pour être vrai ?

Soit la boucle donnée dans [11087]:
{{{
<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
}}}
dont la compilation montre que finalement c'est seulement le contenu de la table de jointure spip_mots_articles. Il suffit de regarder si la table principale a des occurrences dans les clauses de la requête, compte non tenu des champs dont la fabrication de la jointure dit justement qu'ils sont égaux à celle de l'autre table. Si oui, on remplace les synonymes et on élimine complètement le début de la clause FROM. Ainsi, la boucle ci-dessus ne se compile plus en
{{{
SELECT 1
FROM spipnet_mots AS `mots`
    INNER JOIN spipnet_mots_articles AS L1 ON mots.id_mot=L1.id_mot
WHERE (L1.id_article = 898)
    AND (mots.id_mot = 409)
}}}
mais en
{{{
SELECT 1
FROM spipnet_mots_articles AS L1
WHERE (L1.id_article = 898)
    AND (L1.id_mot = 409)
}}}

L'optmisation se retrouve aussi dans par exemple:
{{{
<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
<BOUCLE1(ARTICLES){id_mot} />#TOTAL_BOUCLE<//B1>
<BOUCLE4(ARTICLES){id_mot}{id_article} />#TOTAL_BOUCLE<//B4>
}}}

Il manquait qqch pour traiter ce cas dans la version MySQL, mais pour PG c'était prévu prémonitoirement. Il faut vérifier pour SQLite.

Modified:
   spip/ecrire/public/composer.php
   spip/ecrire/req/mysql.php

Details: http://trac.rezo.net/trac/spip/changeset/11091