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

Poursuite de [5974] pour pouvoir optimiser avant l'appel au serveur SQL. En...

Poursuite de [5974] pour pouvoir optimiser avant l'appel au serveur SQL. En revanche, abandon de la sémantique de 5972: ne pas privilégier systématiquement la clé primaire mène à des aberrations (champs idx ou url_propre comme clé de jointures)
parent bb168503
Branches
Étiquettes
Aucune requête de fusion associée trouvée
...@@ -168,11 +168,9 @@ function boucle_DOCUMENTS_dist($id_boucle, &$boucles) { ...@@ -168,11 +168,9 @@ function boucle_DOCUMENTS_dist($id_boucle, &$boucles) {
// sauf s'ils sont distants (taille inconnue) // sauf s'ils sont distants (taille inconnue)
$boucle->where[]= "($id_table.taille > 0 OR $id_table.distant='oui')"; $boucle->where[]= "($id_table.taille > 0 OR $id_table.distant='oui')";
$jointure = array_search("spip_types_documents", $boucle->from); $joint = substr(array_search("spip_types_documents", $boucle->from),1);
if ($jointure) { if ($joint AND !isset($boucle->join[$joint]))
$j = $id_table . ".id_type=$jointure" . ".id_type"; $boucle->join[$joint]= array($id_table, 'id_type');
if (!in_array($j, $boucle->join)) $boucle->join[]= $j;
}
return calculer_boucle($id_boucle, $boucles); return calculer_boucle($id_boucle, $boucles);
} }
......
...@@ -551,9 +551,25 @@ function spip_optim_select ($select = array(), $from = array(), ...@@ -551,9 +551,25 @@ function spip_optim_select ($select = array(), $from = array(),
$sousrequete = '', $cpt = '', $sousrequete = '', $cpt = '',
$table = '', $id = '', $serveur='') { $table = '', $id = '', $serveur='') {
foreach($where as $k => $v) { if (!$v) unset($where[$k]);} // retirer les criteres vides:
$where = array_merge($where, $join); // {X ?} avec X absent de l'URL
// {par #ENV{X}} avec X absent de l'URL
// IN sur collection vide
foreach($where as $k => $v) {
if ((!$v) OR ($v==1) OR ($v=='0=0')) {
unset($where[$k]);
}
}
// Construire les clauses determinant les jointures.
// Il faudrait retirer celles seulement utiles aux criteres finalement absents
// (et nettoyer $from en consequence)
// mais la condition necessaire et suffisante n'est pas triviale
foreach($join as $k => $v) {
list($t,$c) = $v;
$where[]= "$t.$c=L$k.$c";
}
return spip_abstract_select($select, $from, $where, return spip_abstract_select($select, $from, $where,
$groupby, array_filter($orderby), $limit, $groupby, array_filter($orderby), $limit,
$sousrequete, $cpt, $sousrequete, $cpt,
......
...@@ -268,9 +268,8 @@ function calculer_requete_sql(&$boucle) ...@@ -268,9 +268,8 @@ function calculer_requete_sql(&$boucle)
array(' . array(' .
($boucle->where ? ('"'. join('", "', $boucle->where) . '"') : '') . ($boucle->where ? ('"'. join('", "', $boucle->where) . '"') : '') .
'), # WHERE '), # WHERE
array(' . ' . calculer_dump_array($boucle->join)
($boucle->join ? ('"'. join('", "', $boucle->join) . '"') : '') . . ', # WHERE pour jointure
'), # WHERE pour jointure
' . (!$boucle->group ? "''" : ' . (!$boucle->group ? "''" :
('"' . join(", ", $boucle->group)) . '"') . ('"' . join(", ", $boucle->group)) . '"') .
', # GROUP ', # GROUP
...@@ -288,6 +287,13 @@ function calculer_requete_sql(&$boucle) ...@@ -288,6 +287,13 @@ function calculer_requete_sql(&$boucle)
} }
function calculer_dump_array($a)
{
$res = "";
foreach($a as $k => $v) $res .= ", $k => array('$v[0]', '$v[1]')";
return 'array(' . substr($res,2) . ')';
}
function calculer_from(&$boucle) function calculer_from(&$boucle)
{ {
$res = ""; $res = "";
......
...@@ -591,7 +591,7 @@ function calculer_critere_externe_init(&$boucle, $col, $desc, $crit) ...@@ -591,7 +591,7 @@ function calculer_critere_externe_init(&$boucle, $col, $desc, $crit)
_T('zbug_boucle') . _T('zbug_boucle') .
" $idb " . " $idb " .
_T('zbug_critere_inconnu', _T('zbug_critere_inconnu',
array('critere' => $crit->op))); array('critere' => $col)));
} }
// deduction automatique des jointures // deduction automatique des jointures
...@@ -611,7 +611,7 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col='') ...@@ -611,7 +611,7 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col='')
foreach($res as $r) { foreach($res as $r) {
list($d, $a, $j) = $r; list($d, $a, $j) = $r;
$num++; $num++;
$boucle->join[]= ($id_table ? $id_table : $d) . ".$j=L$num." . $j; $boucle->join[$num]= array(($id_table ? $id_table : $d), $j);
$boucle->from[$id_table = "L$num"] = $a[0]; $boucle->from[$id_table = "L$num"] = $a[0];
} }
...@@ -646,10 +646,9 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array()) ...@@ -646,10 +646,9 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array())
$keys = $ddesc['key']; $keys = $ddesc['key'];
if ($v = $keys['PRIMARY KEY']) { // priorite a la primaire, qui peut etre multiple
unset($keys['PRIMARY KEY']); if ($v = (split(', *', $keys['PRIMARY KEY'])))
$keys = array_merge(split(', *', $v), $keys); $keys = $v;
}
$v = array_intersect($keys, $adesc['key']); $v = array_intersect($keys, $adesc['key']);
if ($v) if ($v)
return array(array($dnom, $arrivee, array_shift($v))); return array(array($dnom, $arrivee, array_shift($v)));
...@@ -659,7 +658,7 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array()) ...@@ -659,7 +658,7 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array())
if ($v && (!in_array($v,$vu)) && if ($v && (!in_array($v,$vu)) &&
($def = trouver_def_table($v, $boucle))) { ($def = trouver_def_table($v, $boucle))) {
list($table,$join) = $def; list($table,$join) = $def;
$milieu = array_intersect($keys, trouver_cles_table($join['key'])); $milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key']));
foreach ($milieu as $k) foreach ($milieu as $k)
{ {
$new[] = $v; $new[] = $v;
......
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