Example #1
0
/**
 * Compile les critères {i,j} et {i/j}
 *
 * Le critère {i,j} limite l'affiche de la boucle en commançant l'itération
 * au i-ème élément, et pour j nombre d'éléments.
 * Le critère {n-i,j} limite en commençant au n moins i-ème élément de boucle
 * Le critère {i,n-j} limite en terminant au n moins j-ème élément de boucle.
 *
 * Le critère {i/j} affiche une part d'éléments de la boucle.
 * Commence à i*n/j élément et boucle n/j éléments. {2/4} affiche le second
 * quart des éléments d'une boucle.
 *
 * Traduit si possible (absence de n dans {i,j}) la demande en une
 * expression LIMIT du gestionnaire SQL
 *
 * @param string $idb     Identifiant de la boucle
 * @param array $boucles  AST du squelette
 * @param Critere $crit   Paramètres du critère dans cette boucle
 * @return void
**/
function calculer_critere_parties($idb, &$boucles, $crit)
{
    $boucle =& $boucles[$idb];
    $a1 = $crit->param[0];
    $a2 = $crit->param[1];
    $op = $crit->op;
    list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
    list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
    if ($op == ',' && (is_numeric($a11) && is_numeric($a21))) {
        $boucle->limit = $a11 . ',' . $a21;
    } else {
        // 3 dans {1/3}, {2,3} ou {1,n-3}
        $boucle->total_parties = $a21 != 'n' ? $a21 : $a22;
        // 2 dans {2/3}, {2,5}, {n-2,1}
        $partie = $a11 != 'n' ? $a11 : $a12;
        $mode = $op == '/' ? '/' : ($a11 == 'n' ? '-' : '+') . ($a21 == 'n' ? '-' : '+');
        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
        if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
            $boucle->limit = (is_numeric($a11) ? "'{$a11}'" : $a11) . ".','." . (is_numeric($a21) ? "'{$a21}'" : $a21);
        } else {
            calculer_parties($boucles, $idb, $partie, $mode);
        }
    }
}
Example #2
0
function calculer_critere_parties($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];
	$a1 = $crit->param[0];
	$a2 = $crit->param[1];
	$op = $crit->op;

	list($a11,$a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
	list($a21,$a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
	if (($op== ',')&&(is_numeric($a11) && (is_numeric($a21))))
	    $boucle->limit = $a11 .',' . $a21;
	else {
		$boucle->total_parties =  ($a21 != 'n') ? $a21 : $a22;
		$partie = ($a11 != 'n') ? $a11 : $a12;
		$mode = (($op == '/') ? '/' :
			(($a11=='n') ? '-' : '+').(($a21=='n') ? '-' : '+'));
		calculer_parties($boucles, $idb, $partie,  $mode);
	}
}