/** * Champ hors table, ça ne peut être qu'une jointure. * * On cherche la table du champ et on regarde si elle est déjà jointe * Si oui et qu'on y cherche un champ nouveau, pas de jointure supplementaire * Exemple: criteres {titre_mot=...}{type_mot=...} * Dans les 2 autres cas ==> jointure * (Exemple: criteres {type_mot=...}{type_mot=...} donne 2 jointures * pour selectioner ce qui a exactement ces 2 mots-cles. * * @param Boucle $boucle * Description de la boucle * @param array $joints * Liste de jointures possibles (ex: $boucle->jointures ou $boucle->jointures_explicites) * @param string $col * Colonne cible de la jointure * @param array $desc * Description de la table * @param bool $cond * Flag pour savoir si le critère est conditionnel ou non * @param bool|string $checkarrivee * string : nom de la table jointe où on veut trouver le champ. * n'a normalement pas d'appel sans $checkarrivee. * @return string * Alias de la table de jointure (Lx) * Vide sinon. */ function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) { // si on demande un truc du genre spip_mots // avec aussi spip_mots_liens dans les jointures dispo // et qu'on est la // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots if ($checkarrivee and is_string($checkarrivee) and $a = table_objet($checkarrivee) and in_array($a . '_liens', $joints)) { if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) { return $res; } } foreach ($joints as $joint) { if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) { // alias de table dans le from $t = array_search($arrivee[0], $boucle->from); // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet) $cols = $arrivee[2]; // mais on ignore la 3eme cle si presente qui correspond alors au point de depart if (count($cols) > 2) { array_pop($cols); } if ($t) { // la table est déjà dans le FROM, on vérifie si le champ est utilisé. $joindre = false; foreach ($cols as $col) { $c = '/\\b' . $t . ".{$col}" . '\\b/'; if (trouver_champ($c, $boucle->where)) { $joindre = true; } else { // mais ca peut etre dans le FIELD pour le Having $c = "/FIELD.{$t}" . ".{$col},/"; if (trouver_champ($c, $boucle->select)) { $joindre = true; } } } if (!$joindre) { return $t; } } array_pop($arrivee); if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) { return $res; } } } return ''; }
/** * Champ hors table, ca ne peut etre qu'une jointure. * On cherche la table du champ et on regarde si elle est deja jointe * Si oui et qu'on y cherche un champ nouveau, pas de jointure supplementaire * Exemple: criteres {titre_mot=...}{type_mot=...} * Dans les 2 autres cas ==> jointure * (Exemple: criteres {type_mot=...}{type_mot=...} donne 2 jointures * pour selectioner ce qui a exactement ces 2 mots-cles. * * http://doc.spip.org/@calculer_critere_externe_init * * @param $boucle * @param $joints * @param $col * @param $desc * @param $cond * @param bool|string $checkarrivee * @return mixed|string */ function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) { // si on demande un truc du genre spip_mots // avec aussi spip_mots_liens dans les jointures dispo // et qu'on est la // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots if ($checkarrivee and is_string($checkarrivee) and $a = table_objet($checkarrivee) and in_array($a . '_liens', $joints)) { if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) { return $res; } } foreach ($joints as $joint) { if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) { $t = array_search($arrivee[0], $boucle->from); // transformer eventuellement id_xx en (id_objet,objet) $cols = trouver_champs_decomposes($col, $arrivee[1]); if ($t) { $joindre = false; foreach ($cols as $col) { $c = '/\\b' . $t . ".{$col}" . '\\b/'; if (trouver_champ($c, $boucle->where)) { $joindre = true; } else { // mais ca peut etre dans le FIELD pour le Having $c = "/FIELD.{$t}" . ".{$col},/"; if (trouver_champ($c, $boucle->select)) { $joindre = true; } } } if (!$joindre) { return $t; } } if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) { return $res; } } } return ''; }