Skip to content
Extraits de code Groupes Projets
Valider 643c61f6 rédigé par esj's avatar esj
Parcourir les fichiers

Traiter différemment 2 criteres sur une meme table de jointure, selon que le...

Traiter différemment 2 criteres sur une meme table de jointure, selon que le champ est le meme ou non
parent 0fd0a9a0
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -520,9 +520,8 @@ function calculer_critere_DEFAUT($idb, &$boucles, $crit) ...@@ -520,9 +520,8 @@ function calculer_critere_DEFAUT($idb, &$boucles, $crit)
function calculer_critere_infixe($idb, &$boucles, $crit) { function calculer_critere_infixe($idb, &$boucles, $crit) {
global $table_des_tables, $tables_principales; global $table_des_tables, $tables_principales, $table_date;
global $exceptions_des_jointures, $table_date; global $exceptions_des_jointures;
$boucle = &$boucles[$idb]; $boucle = &$boucles[$idb];
$type = $boucle->type_requete; $type = $boucle->type_requete;
$col_table = $boucle->id_table; $col_table = $boucle->id_table;
...@@ -555,40 +554,58 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { ...@@ -555,40 +554,58 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
else { else {
$nom = $table_des_tables[$type]; $nom = $table_des_tables[$type];
list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle); list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
// si champ hors table, ca doit etre une jointure
if (!array_key_exists($col, $desc['field'])) { if (!array_key_exists($col, $desc['field'])) {
if ($exceptions_des_jointures[$col]) if ($exceptions_des_jointures[$col])
$col = $exceptions_des_jointures[$col]; $col = $exceptions_des_jointures[$col];
$cle = trouver_champ_exterieur($col, $boucle->jointures, $boucle); $col_table = calculer_critere_externe_init($boucle, $col, $desc, $crit);
if ($cle) }
$cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle);
if ($cle)
$col_table = "L$cle";
else erreur_squelette(_T('zbug_info_erreur_squelette'),
_T('zbug_boucle') .
" $idb " .
_T('zbug_critere_inconnu',
array('critere' => $crit->op)));
} // else: champ dans la table, c'est ok.
} }
return array($fct, $col, $op, $val, $col_table, $args_sql); return array($fct, $col, $op, $val, $col_table, $args_sql);
} }
// 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.
function calculer_critere_externe_init(&$boucle, $col, $desc, $crit)
{
$cle = trouver_champ_exterieur($col, $boucle->jointures, $boucle);
if ($cle) {
$t = array_search($cle[0], $boucle->from);
if ($t) {
$tc = "^$t" . '.' . $col . " ";
foreach ($boucle->where as $v) {
if (ereg($tc,$v)) {$t = false; break;}
}
if ($t) return $t;
}
$cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle);
if ($cle) return "L$cle";
}
erreur_squelette(_T('zbug_info_erreur_squelette'),
_T('zbug_boucle') .
" $idb " .
_T('zbug_critere_inconnu',
array('critere' => $crit->op)));
}
// deduction automatique des jointures // deduction automatique des jointures
// une jointure sur une table avec primary key doit se faire sur cette Key. // une jointure sur une table avec primary key doit se faire sur celle-ci.
function calculer_jointure(&$boucle, $depart, $arrivee) function calculer_jointure(&$boucle, $depart, $arrivee)
{ {
$res = calculer_chaine_jointures($boucle, $depart, $arrivee); $res = calculer_chaine_jointures($boucle, $depart, $arrivee);
if (!$res) return ""; if (!$res) return "";
$n = ""; $n = "";
$i = count($res);
foreach($res as $r) { foreach($res as $r) {
list($d, $a, $j) = $r; list($d, $a, $j) = $r;
$i--; $n = calculer_critere_externe($boucle, ($n ? "L$n" : $d), $a, $j);
$n = calculer_critere_externe($boucle, ($n ? "L$n" : $d), $a, $j, $i);
} }
return $n; return $n;
} }
...@@ -598,7 +615,6 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array()) ...@@ -598,7 +615,6 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array())
list($dnom,$ddesc) = $depart; list($dnom,$ddesc) = $depart;
list($anom,$adesc) = $arrivee; list($anom,$adesc) = $arrivee;
$prim = $ddesc['key']['PRIMARY KEY']; $prim = $ddesc['key']['PRIMARY KEY'];
# spip_log("ccj $dnom $prim");
$v = array_intersect($prim ? split(',',$prim): $ddesc['key'], $adesc['key']); $v = array_intersect($prim ? split(',',$prim): $ddesc['key'], $adesc['key']);
if ($v) if ($v)
return array(array($dnom, $anom, array_shift($v))); return array(array($dnom, $anom, array_shift($v)));
...@@ -608,7 +624,6 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array()) ...@@ -608,7 +624,6 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array())
if ($v && (!in_array($v,$vu)) && if ($v && (!in_array($v,$vu)) &&
($j = trouver_def_table($v, $boucle))) { ($j = trouver_def_table($v, $boucle))) {
list($table,$join) = $j; list($table,$join) = $j;
# spip_log(" trouver $table " . join(",",$join['key']));
$milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key'])); $milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key']));
foreach ($milieu as $k) foreach ($milieu as $k)
{ {
...@@ -681,16 +696,9 @@ function trouver_champ_exterieur($cle, $joints, &$boucle) ...@@ -681,16 +696,9 @@ function trouver_champ_exterieur($cle, $joints, &$boucle)
// traitement des relations externes par DES jointures. // traitement des relations externes par DES jointures.
function calculer_critere_externe(&$boucle, $id_table, $lien, $join, $suite) { function calculer_critere_externe(&$boucle, $id_table, $lien, $join) {
static $num; static $num;
$id_field = $id_table . '.' . $join; $id_field = $id_table . '.' . $join;
// dans certains cas on pourrait ne pas dupliquer les jointures intermediaires
// a revoir
/* if ($suite)
foreach ($boucle->join as $v) {
if (ereg("^$id_field=L([0-9]+)\.$join$",$v, $r)) return $r[1];
}
*/
$num++; $num++;
$boucle->lien = true; $boucle->lien = true;
$boucle->from["L$num"] = $lien; $boucle->from["L$num"] = $lien;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter