Example #1
0
/**
 * 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('', '');
        }
    }
}
Example #2
0
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('','');
		}
	}
}
Example #3
0
/**
 * 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('', '');
        }
    }
}