/** * Cherche un champ dans une boucle * * Le champ peut être : * * - un alias d'un autre : il faut alors le calculer, éventuellement en * construisant une jointure. * - présent dans la table : on l'utilise * - absent, mais le type de boucle l'autorise (joker des itérateurs DATA) : * on l'utilise et lève le drapeau joker * - absent, on cherche une jointure et on l'utilise si on en trouve. * * @todo * Ici la recherche de jointure sur l'absence d'un champ ne cherche * une jointure que si des jointures explicites sont demandées, * et non comme à d'autres endroits sur toutes les jointures possibles. * Il faut homogénéiser cela. * * * @param string $idb Identifiant de la boucle * @param string $nom_champ Nom du champ SQL cherché * @param Boucle $boucles AST du squelette * @param bool $joker * Le champ peut-il être inconnu à la compilation ? * Ce drapeau sera levé si c'est le cas. * @return array * Liste (Nom du champ véritable, nom du champ demandé). * Le nom du champ véritable est une expression pour le SELECT de * la boucle tel que "rubriques.titre" ou "mots.titre AS titre_mot". * Les éléments de la liste sont vides si on ne trouve rien. **/ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { global $exceptions_des_tables; $r = $boucles[$idb]->type_requete; // boucle recursive, c'est foutu... if ($r == TYPE_RECURSIF) { return array(); } if (!$r) { $joker = false; // indiquer a l'appelant # continuer pour chercher l'erreur suivante return array("'#" . $r . ':' . $nom_champ . "'", ''); } $desc = $boucles[$idb]->show; // le nom du champ est il une exception de la table ? un alias ? $excep = isset($exceptions_des_tables[$r]) ? $exceptions_des_tables[$r] : ''; if ($excep) { $excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : ''; } if ($excep) { $joker = false; // indiquer a l'appelant return index_exception($boucles[$idb], $desc, $nom_champ, $excep); } else { // le champ est réellement présent, on le prend. if (isset($desc['field'][$nom_champ])) { $t = $boucles[$idb]->id_table; $joker = false; // indiquer a l'appelant return array("{$t}.{$nom_champ}", $nom_champ); } elseif (isset($desc['field']['*'])) { $joker = true; // indiquer a l'appelant return array($nom_champ, $nom_champ); } else { $joker = false; // indiquer a l'appelant // regarder si le champ est deja dans une jointure existante // sinon, si il y a des joitures explicites, la construire if (!($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]))) { if ($boucles[$idb]->jointures_explicites) { // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites // mais est-ce ce qu'on veut ? $jointures = preg_split("/\\s+/", $boucles[$idb]->jointures_explicites); if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) { $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]); } } } if ($t) { // si on a trouvé une jointure possible, on fait comme // si c'était une exception pour le champ demandé return index_exception($boucles[$idb], $desc, $nom_champ, array($t[1]['id_table'], reset($t[2]))); } return array('', ''); } } }
function index_tables_en_pile($idb, $nom_champ, &$boucles) { global $exceptions_des_tables; $r = $boucles[$idb]->type_requete; if ($r == 'boucle') return array(); if (!$r) { # continuer pour chercher l'erreur suivante return array("'#" . $r . ':' . $nom_champ . "'",''); } $desc = $boucles[$idb]->show; $excep = isset($exceptions_des_tables[$r]) ? $exceptions_des_tables[$r] : ''; if ($excep) $excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : ''; if ($excep) { return index_exception($boucles[$idb], $desc, $nom_champ, $excep); } else { if (isset($desc['field'][$nom_champ])) { $t = $boucles[$idb]->id_table; return array("$t.$nom_champ", $nom_champ); } else { if ($boucles[$idb]->jointures_explicites) { $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->jointures, $boucles[$idb]); if ($t) return index_exception($boucles[$idb], $desc, $nom_champ, array($t[1]['id_table'], $nom_champ)); } return array('',''); } } }
/** * Cherche un champ dans une boucle * * Le champ peut être : * - un alias d'un autre : il faut alors le calculer, éventuellement en * construisant une jointure. * - présent dans la table : on l'utilise * - absent, mais le type de boucle l'autorise (joker des itérateurs DATA) : * on l'utilise et lève le drapeau joker * - absent, on cherche une jointure et on l'utilise si on en trouve. * * @todo * Ici la recherche de jointure sur l'absence d'un champ ne cherche * une jointure que si des jointures explicites sont demandées, * et non comme à d'autres endroits sur toutes les jointures possibles. * Il faut homogénéiser cela. * * * @param string $idb Identifiant de la boucle * @param string $nom_champ Nom du champ SQL cherché * @param Boucle $boucles AST du squelette * @param bool $joker * Le champ peut-il être inconnu à la compilation ? * Ce drapeau sera levé si c'est le cas. * @return array * Liste (Nom du champ véritable, nom du champ demandé). * Le nom du champ véritable est une expression pour le SELECT de * la boucle tel que "rubriques.titre" ou "mots.titre AS titre_mot". * Les éléments de la liste sont vides si on ne trouve rien. **/ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { global $exceptions_des_tables; $r = $boucles[$idb]->type_requete; // boucle recursive, c'est foutu... if ($r == TYPE_RECURSIF) { return array(); } if (!$r) { $joker = false; // indiquer a l'appelant # continuer pour chercher l'erreur suivante return array("'#" . $r . ':' . $nom_champ . "'", ''); } $desc = $boucles[$idb]->show; // le nom du champ est il une exception de la table ? un alias ? $excep = isset($exceptions_des_tables[$r]) ? $exceptions_des_tables[$r] : ''; if ($excep) { $excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : ''; } if ($excep) { $joker = false; // indiquer a l'appelant return index_exception($boucles[$idb], $desc, $nom_champ, $excep); } else { // le champ est réellement présent, on le prend. if (isset($desc['field'][$nom_champ])) { $t = $boucles[$idb]->id_table; $joker = false; // indiquer a l'appelant return array("{$t}.{$nom_champ}", $nom_champ); } elseif (isset($desc['field']['*'])) { $joker = true; // indiquer a l'appelant return array($nom_champ, $nom_champ); } else { $joker = false; // indiquer a l'appelant // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! if ($boucles[$idb]->jointures_explicites) { $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->jointures, $boucles[$idb]); if ($t) { // si on a trouvé une jointure possible, on fait comme // si c'était une exception pour le champ demandé return index_exception($boucles[$idb], $desc, $nom_champ, array($t[1]['id_table'], $nom_champ)); } } return array('', ''); } } }