Valider 5c15fe9e rédigé par esj's avatar esj
Parcourir les fichiers

Amélioration de la détection des boucles dont le corps est constant, afin de...

Amélioration de la détection des boucles dont le corps est constant, afin de transformer le While-Fetch en For sans requête (le Numrows initial suffit).
Le manque se situait dans la non prise en compte des {{{\'}}} dans l'analyse du texte.

Application au plugin Nuage qui veut mettre en exergue les mots clés d'un article:

{{{
<BOUCLE2(MOTS)><br />
<span<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>>#TITRE</span>
</BOUCLE2>
}}}
qui fournit:
{{{
 $result = calculer_select(
        array("1"), # SELECT
        array('mots' => 'spip_mots','L1' => 'spip_mots_articles'), # FROM
        array(), # FROM    type jointure    
        
            array(
            array('=', 'L1.id_article', intval(@$Pile[0]['id_article'])), 
            array('=', 'mots.id_mot', intval($Pile[$SP]['id_mot']))), # WHERE
        array(1 => array('mots', 'id_mot')), # WHERE pour jointure
        array(), # GROUP
        array(), # ORDER
        '', # LIMIT
        
            array(), # HAVING
        'mots', # table
        '3', # boucle
        ''); # serveur
    $Numrows['3']['total'] = @sql_count($result,'');
    $t0 = "";
    for($x=$Numrows["3"]["total"];$x>0;$x--)
            $t0 .= 
// 15 signes
' class=\'arial1\'';
    @sql_free($result,'');
    return $t0;
}}}
parent 5b524cf7
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+3 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -160,7 +160,7 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) {
	$return = $boucle->return;
	$type_boucle = $boucle->type_requete;
	$primary = $boucle->primary;
	$constant = preg_match(CODE_MONOTONE,$return);
	$constant = preg_match(CODE_MONOTONE, str_replace("\\'",'', $return));
 
	// Cas {1/3} {1,4} {n-2,1}...

@@ -251,9 +251,8 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) {
	// Fin de parties
	if ($boucle->mode_partie) $corps .= "\n		}\n";


	// si le corps est une constante, ne pas appeler le serveur N fois!
	if (preg_match(CODE_MONOTONE,$corps, $r)) {
	if (preg_match(CODE_MONOTONE,str_replace("\\'",'',$corps), $r)) {
		if (!isset($r[2]) OR (!$r[2])) {
			if (!$boucle->numrows)
				return 'return "";';