Browse Source

optimiser

<BOUCLE(ARTICLES){id_document ?}>
et consoeurs en ecrivant une jointure sur le mode
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_objet = articles.id_article AND L1.objet='article')
Corrolairement, la verification de l'inutilite de L1 dans calculer_select doit se faire en excluant la jointure en cours d'examen car sinon elle auto justifie sa presence
svn/root/tags/spip-2.0.0
Cerdic 13 years ago
parent
commit
d711e9c740
  1. 5
      ecrire/public/compiler.php
  2. 16
      ecrire/public/composer.php
  3. 6
      ecrire/public/jointures.php

5
ecrire/public/compiler.php

@ -398,10 +398,7 @@ function calculer_dump_join($a)
{
$res = "";
foreach($a as $k => $v)
if (count($v)==3)
$res .= ", '$k' => array($v[0], $v[1], $v[2])";
else
$res .= ", '$k' => array($v[0], $v[1])";
$res .= ", '$k' => array(".implode(',',$v).")";
return 'array(' . substr($res,2) . ')';
}

16
ecrire/public/composer.php

@ -515,13 +515,10 @@ function calculer_select ($select = array(), $from = array(),
$k = count($join);
foreach(array_reverse($join,true) as $cledef=>$j) {
$cle = $cledef;
if (count($join[$cle])<3){
list($t,$c) = $join[$cle];
$carr = $c;
}
else
// le nom de la cle d'arrivee est different de celui du depart, et est specifie
list($t,$c,$carr) = $join[$cle];
// le format de join est :
// array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
list($t,$c,$carr,$and) = $join[$cle];
if (!$carr) $carr = $c;
// si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
// pour compat avec ancienne convention
if (is_numeric($cle))
@ -529,10 +526,12 @@ function calculer_select ($select = array(), $from = array(),
if (!$menage
OR isset($afrom[$cle])
OR calculer_jointnul($cle, $select)
OR calculer_jointnul($cle, $join)
OR calculer_jointnul($cle, array_diff($join,array($cle=>$join[$cle])))
OR calculer_jointnul($cle, $having)
OR calculer_jointnul($cle, $where_simples)) {
// on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
// sans recours a preg_match
// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
$afrom[$t][$cle] = array("\n" .
(isset($from_type[$cle])?$from_type[$cle]:"INNER")." JOIN",
$from[$cle],
@ -541,6 +540,7 @@ function calculer_select ($select = array(), $from = array(),
"$cle.$c",
"=",
"$t.$carr",
($and ? "AND ". $and:"") .
")");
if (isset($afrom[$cle])){
$afrom[$t] = $afrom[$t] + $afrom[$cle];

6
ecrire/public/jointures.php

@ -78,8 +78,10 @@ function fabrique_jointures(&$boucle, $res, $cond=false, $desc=array(), $nom='',
$obj = "$id_table.$obj";
else
$obj = "L$n.$obj";
$boucle->where[] = array("'='","'$obj'","sql_quote('$type')");
$boucle->join["L$n"]= array("'$id_table'","'$j2'","'$j1'");
// le where complementaire est envoye dans la jointure pour pouvoir etre elimine avec la jointure
// en cas d'optimisation
//$boucle->where[] = array("'='","'$obj'","sql_quote('$type')");
$boucle->join["L$n"]= array("'$id_table'","'$j2'","'$j1'","'$obj='.sql_quote('$type')");
}
else
$boucle->join["L$n"]= array("'$id_table'","'$j'");

Loading…
Cancel
Save