/** * 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); } } }
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); } }