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

Généralisation de la prise en compte des jointures pour la critère Par,

qui était auparavant limitée à la table des mots. 

Attention, il y a du coup un petit changement d'interface de la variable "exceptions_des_jointures", qui permet à présent de spécifier n'importe quelle table.

Acceptation d'une fonction SQL dans le critère Par meme en jointure.

Oubli de signaler que la table des signatures est une jointure possible
pour la table articles.

Il y a qq situations qui devraient pouvoir etre optimisées.
parent 5a98a6e9
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -207,6 +207,17 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) { ...@@ -207,6 +207,17 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
} else { } else {
$par = array_shift($tri); $par = array_shift($tri);
$par = $par->texte; $par = $par->texte;
// par multi champ
if (ereg("^multi[[:space:]]*(.*)$",$par, $m)) {
$texte = $boucle->id_table . '.' . trim($m[1]);
$boucle->select[] = " \".creer_objet_multi('".$texte."', \$GLOBALS['spip_lang']).\"" ;
$order = "multi";
} else {
$fct = "";
if (!ereg("^" . CHAMP_SQL_PLUS_FONC . '$', $par, $match))
erreur_squelette(_T('zbug_info_erreur_squelette'), "{par $par} BOUCLE$idb");
else {
if ($match[2]) { $par = substr($match[2],1,-1); $fct = $match[1]; }
// par hasard // par hasard
if ($par == 'hasard') { if ($par == 'hasard') {
// tester si cette version de MySQL accepte la commande RAND() // tester si cette version de MySQL accepte la commande RAND()
...@@ -219,7 +230,6 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) { ...@@ -219,7 +230,6 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
$boucle->select[]= $par . " AS alea"; $boucle->select[]= $par . " AS alea";
$order = "'alea'"; $order = "'alea'";
} }
// par date_thread // par date_thread
else if ($par == 'date_thread') { else if ($par == 'date_thread') {
//date_thread est la date la plus recente d'un message dans un fil de discussion //date_thread est la date la plus recente d'un message dans un fil de discussion
...@@ -230,17 +240,10 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) { ...@@ -230,17 +240,10 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
$order = "'date_thread'"; $order = "'date_thread'";
$boucle->plat = true; $boucle->plat = true;
} }
// par titre_mot ou type_mot voire d'autres // par titre_mot ou type_mot voire d'autres
else if ($m = ($exceptions_des_jointures[$par])) { else if ($m = ($exceptions_des_jointures[$par])) {
$order = critere_par_jointure($boucle, $m); $order = critere_par_jointure($boucle, $m);
} }
// par multi champ
else if (ereg("^multi[[:space:]]*(.*)$",$par, $m)) {
$texte = $boucle->id_table . '.' . trim($m[1]);
$boucle->select[] = " \".creer_objet_multi('".$texte."', \$GLOBALS['spip_lang']).\"" ;
$order = "multi";
}
// par num champ(, suite) // par num champ(, suite)
else if (ereg("^num[[:space:]]*(.*)$",$par, $m)) { else if (ereg("^num[[:space:]]*(.*)$",$par, $m)) {
$texte = '0+' . $boucle->id_table . '.' . trim($m[1]); $texte = '0+' . $boucle->id_table . '.' . trim($m[1]);
...@@ -257,9 +260,8 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) { ...@@ -257,9 +260,8 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
$order = "'".$boucle->id_table ."." . $m . "'"; $order = "'".$boucle->id_table ."." . $m . "'";
} }
// par champ. Verifier qu'ils sont presents. // par champ. Verifier qu'ils sont presents.
else if (ereg("^" . CHAMP_SQL_PLUS_FONC . '$', $par, $match)) { else {
if ($match[2]) $par = $match[2]; global $table_des_tables, $tables_des_serveurs_sql;
global $table_des_tables, $tables_des_serveurs_sql;
$r = $boucle->type_requete; $r = $boucle->type_requete;
$s = $boucles[$idb]->sql_serveur; $s = $boucles[$idb]->sql_serveur;
if (!$s) $s = 'localhost'; if (!$s) $s = 'localhost';
...@@ -269,22 +271,23 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) { ...@@ -269,22 +271,23 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
$desc = $tables_des_serveurs_sql[$s][$t]; $desc = $tables_des_serveurs_sql[$s][$t];
if ($desc['field'][$par]) if ($desc['field'][$par])
$par = $boucle->id_table.".".$par; $par = $boucle->id_table.".".$par;
// sinon, tri sur les champs synthetises (cf points) // sinon tant pis, ca doit etre un champ synthetise (cf points)
$order = (!$match[2]) ? $par : ($match[1] . "($par)"); $order = "'$par'";
$order = "'$order'";
} }
else }
erreur_squelette(_T('zbug_info_erreur_squelette'), "{par $par} BOUCLE$idb"); }
} }
if ($order) if ($order)
$boucle->order[] = $order . (($order[0]=="'") ? $sens : ""); $boucle->order[] = ($fct ? "'$fct(' . $order . ')'" : $order) .
(($order[0]=="'") ? $sens : "");
} }
} }
function critere_par_jointure(&$boucle, $champ) function critere_par_jointure(&$boucle, $join)
{ {
global $table_des_tables; global $table_des_tables;
$t = array_search('spip_mots', $boucle->from); list($table, $champ) = $join;
$t = array_search($table, $boucle->from);
if (!$t) { if (!$t) {
$type = $boucle->type_requete; $type = $boucle->type_requete;
$nom = $table_des_tables[$type]; $nom = $table_des_tables[$type];
...@@ -293,7 +296,9 @@ function critere_par_jointure(&$boucle, $champ) ...@@ -293,7 +296,9 @@ function critere_par_jointure(&$boucle, $champ)
$cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle); $cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle);
if ($cle) if ($cle)
$cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle, false); $cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle, false);
if ($cle) $t = "L$cle"; // sinon erreur if ($cle) $t = "L$cle";
else erreur_squelette(_T('zbug_info_erreur_squelette'), "{par ?} BOUCLE$idb");
} }
return "'" . $t . '.' . $champ . "'"; return "'" . $t . '.' . $champ . "'";
} }
...@@ -617,7 +622,7 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col='', $cond=false) ...@@ -617,7 +622,7 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col='', $cond=false)
} }
// pas besoin de group by // pas besoin de group by
// si une seule jointure et sur une table primary key formee // si une seule jointure et sur une table avec primary key formee
// de l'index principal et de l'index de jointure (non conditionnel! [6031]) // de l'index principal et de l'index de jointure (non conditionnel! [6031])
// cf http://article.gmane.org/gmane.comp.web.spip.devel/30555 // cf http://article.gmane.org/gmane.comp.web.spip.devel/30555
......
...@@ -187,6 +187,8 @@ $exceptions_des_tables['syndic_articles']['url_site']=array('spip_syndic', ...@@ -187,6 +187,8 @@ $exceptions_des_tables['syndic_articles']['url_site']=array('spip_syndic',
$exceptions_des_tables['syndic_articles']['nom_site']=array('spip_syndic', $exceptions_des_tables['syndic_articles']['nom_site']=array('spip_syndic',
'nom_site'); 'nom_site');
$exceptions_des_tables['signatures']['id_article']=array('spip_petitions', 'id_article');
$table_date['articles']='date'; $table_date['articles']='date';
$table_date['auteurs']='date'; $table_date['auteurs']='date';
$table_date['breves']='date_heure'; $table_date['breves']='date_heure';
...@@ -210,6 +212,7 @@ $tables_jointures['spip_articles'][]= 'mots_articles'; ...@@ -210,6 +212,7 @@ $tables_jointures['spip_articles'][]= 'mots_articles';
$tables_jointures['spip_articles'][]= 'auteurs_articles'; $tables_jointures['spip_articles'][]= 'auteurs_articles';
$tables_jointures['spip_articles'][]= 'documents_articles'; $tables_jointures['spip_articles'][]= 'documents_articles';
$tables_jointures['spip_articles'][]= 'mots'; $tables_jointures['spip_articles'][]= 'mots';
$tables_jointures['spip_articles'][]= 'signatures';
$tables_jointures['spip_auteurs'][]= 'auteurs_articles'; $tables_jointures['spip_auteurs'][]= 'auteurs_articles';
$tables_jointures['spip_auteurs'][]= 'mots'; $tables_jointures['spip_auteurs'][]= 'mots';
...@@ -247,9 +250,11 @@ $tables_jointures['spip_mots'][]= 'mots_documents'; ...@@ -247,9 +250,11 @@ $tables_jointures['spip_mots'][]= 'mots_documents';
$tables_jointures['spip_groupes_mots'][]= 'mots'; $tables_jointures['spip_groupes_mots'][]= 'mots';
global $exceptions_des_jointures; global $exceptions_des_jointures;
$exceptions_des_jointures['titre_mot'] = 'titre'; $exceptions_des_jointures['titre_mot'] = array('spip_mots', 'titre');
$exceptions_des_jointures['type_mot'] = 'type'; $exceptions_des_jointures['type_mot'] = array('spip_mots', 'type');
$exceptions_des_jointures['id_signature']= array('spip_signatures', 'id_signature');
global $table_des_traitements; global $table_des_traitements;
$table_des_traitements['BIO'][]= 'propre(%s)'; $table_des_traitements['BIO'][]= 'propre(%s)';
......
...@@ -116,8 +116,8 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles) { ...@@ -116,8 +116,8 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles) {
} }
$t= $desc['type']; $t= $desc['type'];
$excep = $exceptions_des_tables[$r][$nom_champ]; $excep = $exceptions_des_tables[$r][$nom_champ];
if ($excep) { if ($excep) {
return index_exception($boucles[$idb], $desc, $nom_champ, $excep); return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
} else { } else {
...@@ -151,7 +151,9 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep) ...@@ -151,7 +151,9 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep)
if (!$t = array_search($e, $boucle->from)) { if (!$t = array_search($e, $boucle->from)) {
$t = 'J' . count($boucle->from); $t = 'J' . count($boucle->from);
$boucle->from[$t] = $e; $boucle->from[$t] = $e;
$j = $tables_des_serveurs_sql[$desc['serveur']][$e]['key']['PRIMARY KEY']; $j = $tables_des_serveurs_sql[$desc['serveur']][$e];
# essayer ca un jour: list($nom, $j) = trouver_def_table($e, $boucle);
$j = $j['key']['PRIMARY KEY'];
$boucle->where[]= array("'='", "'$boucle->id_table." . "$j'", "'$t.$j'"); $boucle->where[]= array("'='", "'$boucle->id_table." . "$j'", "'$t.$j'");
} }
} else $t = $desc['type']; } else $t = $desc['type'];
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter