Changeset 85860 in spip-zone


Ignore:
Timestamp:
Nov 5, 2014, 8:06:04 PM (5 years ago)
Author:
kent1@…
Message:

Enlever du code spécifique pour les anciennes versions

Se rapprocher de inc/recherche_to_array du core

Faire fonctionner un peu mieux les recherches sur jointures, c'est encore loin d'être parfait mais doit fonctionner sur les points GIS maintenant

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fulltext/trunk/inc/recherche_to_array.php

    r82959 r85860  
    44 *  SPIP, Systeme de publication pour l'internet                           *
    55 *                                                                         *
    6  *  Copyright (c) 2001-2011                                                *
     6 *  Copyright (c) 2001-2014                                                *
    77 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
    88 *                                                                         *
     
    1414if (!defined('_ECRIRE_INC_VERSION')) return;
    1515
    16 // Determiner les tables gerees via spip_xxx_liens
    17 function recherche_tables_liens() {
    18         if ($GLOBALS['spip_version_base'] >= 16428)
    19                 return array('document', 'auteur', 'mot');
    20         else
    21         if ($GLOBALS['spip_version_base'] >= 12008)
    22                 return array('document');
    23         else
    24                 return array();
    25 }
    2616
    2717// methodes sql
    28 function inc_recherche_to_array_dist($recherche, $options=null) {
     18function inc_recherche_to_array_dist($recherche, $options = array()) {
     19
     20        // options par defaut
     21        $options = array_merge(
     22                array(
     23                'score' => true,
     24                'champs' => false,
     25                'toutvoir' => false,
     26                'matches' => false,
     27                'jointures' => false
     28                ),
     29                $options
     30        );
     31
     32        include_spip('inc/rechercher');
     33        include_spip('inc/autoriser');
    2934
    3035        $requete = array(
    31         "SELECT"=>array(),
    32         "FROM"=>array(),
    33         "WHERE"=>array(),
    34         "GROUPBY"=>array(),
    35         "ORDERBY"=>array(),
    36         "LIMIT"=>"",
    37         "HAVING"=>array()
     36                "SELECT"=>array(),
     37                "FROM"=>array(),
     38                "WHERE"=>array(),
     39                "GROUPBY"=>array(),
     40                "ORDERBY"=>array(),
     41                "LIMIT"=>"",
     42                "HAVING"=>array()
    3843        );
    3944
    40         $options = array_merge(
    41                 array('table' => 'article',
    42                 ),
    43                 (array)$options
    44         );
    45         $table = $options['table'];
     45        $table = sinon($options['table'], 'article');
     46        if ($options['champs'])
     47                $champs = $options['champs'];
     48        else {
     49                $l = liste_des_champs();
     50                $champs = $l['article'];
     51        }
    4652        $serveur = $options['serveur'];
    4753
    48         include_spip('inc/rechercher');
    4954
    5055        // s'il n'y a qu'un mot mais <= 3 lettres, il faut le chercher avec une *
     
    5560        list($methode, $q, $preg) = expression_recherche($recherche, $options);
    5661
    57         $liste = liste_des_champs();
    58         $champs = $liste[$table];
    59 
    6062        $jointures = $options['jointures']
    6163                ? liste_des_jointures()
     
    6365
    6466        $_id_table = id_table_objet($table);
     67
     68        // c'est un pis-aller : ca a peu de chance de marcher, mais mieux quand meme que en conservant la ','
     69        // (aka ca marche au moins dans certains cas comme avec spip_formulaires_reponses_champs)
     70        if (strpos($_id_table,",")!==false){
     71                $_id_table = explode(',',$_id_table);
     72                $_id_table = reset($_id_table);
     73        }
     74       
     75        $table_origine = table_objet_sql($table);
    6576        $requete['SELECT'][] = "t.".$_id_table;
    6677        $a = array();
     
    6879        foreach ($champs as $champ => $poids) {
    6980                if (is_array($champ)){
    70                   spip_log("requetes imbriquees interdites");
     81                        spip_log("requetes imbriquees interdites");
    7182                } else {
    7283                        if (strpos($champ,".")===FALSE)
     
    7788        }
    7889        if ($a) $requete['WHERE'][] = join(" OR ", $a);
    79         $requete['FROM'][] = table_objet_sql($table).' AS t';
    80 
    81         // FULLTEXT
     90        $requete['FROM'][] = $table_origine.' AS t';
     91
     92        /**
     93         * FULLTEXT
     94         * Partie spécifique à l'indexation du plugin
     95         */
    8296        $fulltext = false; # cette table est-elle fulltext?
    8397        if ($keys = fulltext_keys($table, 't', $serveur)) {
     
    140154                $from = array_pop($requete['FROM']);
    141155
    142                 if (is_array($jointures[$table])){
     156                if (isset($jointures[$table])
     157                       
     158                        ) {
     159                        include_spip('action/editer_liens');
     160                        $trouver_table = charger_fonction('trouver_table','base');
     161                        $cle_depart = id_table_objet($table);
     162                        $table_depart = table_objet($table,$serveur);
     163                        $desc_depart = $trouver_table($table_depart,$serveur);
     164                        $depart_associable = objet_associable($table);
    143165                        $i = 0;
    144                         foreach(array_keys($jointures[$table]) as $jtable) {
     166
     167                        foreach ($jointures[$table] as $table_liee => $champs) {
     168                        //foreach(array_keys($jointures[$table]) as $jtable) {
    145169                                $i++;
    146170                                spip_log($pe,'recherche');
    147                                 if ($mkeys = fulltext_keys($jtable, 'obj'.$i, $serveur)) {
    148                                         $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
    149                                         $_id_join = id_table_objet($jtable);
    150                                         $table_join = table_objet($jtable);
    151                                         $lesliens = recherche_tables_liens();
     171                                if ($mkeys = fulltext_keys($table_liee, 'obj'.$i, $serveur)) {
     172                                        $_id_join = id_table_objet($table_liee);
     173                                        $table_join = table_objet($table_liee);
     174                                        //$lesliens = recherche_tables_liens();
    152175
    153176                                        $subscore = "MATCH(".implode($mkeys,',').") AGAINST ($p".($boolean ? ' IN BOOLEAN MODE':'').")";
    154 
    155                                         if (in_array($jtable, $lesliens))
    156                                                 $join = "
    157                                                 LEFT JOIN (
    158                                                  SELECT lien$i.id_objet,$subscore AS score
    159                                                  FROM spip_${jtable}s_liens as lien$i
    160                                                  JOIN spip_${jtable}s as obj$i ON obj$i.$_id_join=lien$i.$_id_join
    161                                                  AND lien$i.objet='${table}'
    162                                                  WHERE $subscore > 0
    163                                                  ORDER BY score DESC LIMIT 100
    164                                                  ) AS o$i ON o$i.id_objet=t.$_id_table
    165                                                 ";
    166                                         else
    167                                                 $join = "
    168                                                 LEFT JOIN (
    169                                                  SELECT lien$i.$_id_table,$subscore AS score
    170                                                  FROM spip_${jtable}s_${table}s as lien$i
    171                                                  JOIN spip_${table_join} AS obj$i ON lien$i.$_id_join=obj$i.$_id_join
    172                                                  WHERE $subscore > 0
    173                                                  ORDER BY score DESC LIMIT 100
    174                                                  ) AS o$i ON o$i.$_id_table=t.$_id_table
    175                                                 ";
    176                                         #var_dump($join);
    177                                         $from .= $join;
    178                                 }
    179                         }
    180                 }
     177                                        // on peut definir une fonction de recherche jointe pour regler les cas particuliers
     178                                                $cle_arrivee =  id_table_objet($table_liee);
     179                                                $table_arrivee = table_objet($table_liee,$serveur);
     180                                                $desc_arrivee = $trouver_table($table_arrivee,$serveur);
     181                                                // cas simple : $cle_depart dans la table_liee
     182                                                if (isset($desc_arrivee['field'][$cle_depart])){
     183                                                        //$s = sql_select("$cle_depart, $cle_arrivee", $desc_arrivee['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur);
     184                                                }
     185                                                // cas simple : $cle_arrivee dans la table
     186                                                elseif (isset($desc_depart['field'][$cle_arrivee])){
     187                                                        //$s = sql_select("$cle_depart, $cle_arrivee", $desc_depart['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur);
     188                                                }
     189                                                // sinon cherchons une table de liaison
     190                                                // cas recherche principale article, objet lie document : passer par spip_documents_liens
     191                                                elseif ($l = objet_associable($table_liee)){
     192                                                        list($primary, $table_liens) = $l;
     193                                                        $join = "
     194                                                        LEFT JOIN (
     195                                                        SELECT lien$i.id_objet,$subscore AS score
     196                                                        FROM $table_liens as lien$i
     197                                                        JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$_id_join=lien$i.$_id_join
     198                                                        AND lien$i.objet='$table'
     199                                                        WHERE $subscore > 0
     200                                                        ORDER BY score DESC LIMIT 100
     201                                                        ) AS o$i ON o$i.id_objet=t.$_id_table
     202                                                        ";
     203                                                        $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     204                                                        $from .= $join;
     205                                                        //$s = sql_select("id_objet as $cle_depart, $primary as $cle_arrivee", $table_liens, array("objet='$table'",sql_in($primary, array_keys($ids_trouves))), '','','','',$serveur);
     206                                                }
     207                                                // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens
     208                                                elseif ($l = $depart_associable){
     209                                                        list($primary, $table_liens) = $l;
     210                                                        $join = "
     211                                                        LEFT JOIN (
     212                                                        SELECT lien$i.id_objet,$subscore AS score
     213                                                        FROM $table_liens as lien$i
     214                                                        JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$_id_join=lien$i.$_id_join
     215                                                                        AND lien$i.objet='$table'
     216                                                                        WHERE $subscore > 0
     217                                                                        ORDER BY score DESC LIMIT 100
     218                                                        ) AS o$i ON o$i.id_objet=t.$_id_table";
     219                                                        $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     220                                                        $from .= $join;
     221                                                }
     222                                        }
     223                                }
     224                }
     225               
    181226                $requete['FROM'][] = $from;
    182227                $score = join(' + ', $score).' AS score';
     
    298343
    299344        // Gerer les donnees associees
    300         if (!$fulltext
     345        if (!$fulltext 
    301346        AND isset($jointures[$table])
    302347        AND $joints = recherche_en_base(
     
    306351                )
    307352        ) {
    308                 foreach ($joints as $jtable => $jj) {
    309                         $it = id_table_objet($table);
    310                         $ij =  id_table_objet($jtable);
    311                         $lesliens = recherche_tables_liens();
    312                         if (in_array($jtable, $lesliens))
    313                                 $s = sql_select("id_objet as $it", "spip_${jtable}s_liens", array("objet='$table'",sql_in('id_'.${jtable}, array_keys($jj))), '','','','',$serveur);
     353                include_spip('action/editer_liens');
     354                $trouver_table = charger_fonction('trouver_table','base');
     355                $cle_depart = id_table_objet($table);
     356                $table_depart = table_objet($table,$serveur);
     357                $desc_depart = $trouver_table($table_depart,$serveur);
     358                $depart_associable = objet_associable($table);
     359                foreach ($joints as $table_liee => $ids_trouves) {
     360                        // on peut definir une fonction de recherche jointe pour regler les cas particuliers
     361                        if (
     362                                        !(
     363                                                        $rechercher_joints = charger_fonction("rechercher_joints_${table}_${table_liee}","inc",true)
     364                                                        or $rechercher_joints = charger_fonction("rechercher_joints_objet_${table_liee}","inc",true)
     365                                                        or $rechercher_joints = charger_fonction("rechercher_joints_${table}_objet_lie","inc",true)
     366                        )
     367                        ){
     368                                $cle_arrivee =  id_table_objet($table_liee);
     369                                $table_arrivee = table_objet($table_liee,$serveur);
     370                                $desc_arrivee = $trouver_table($table_arrivee,$serveur);
     371                                // cas simple : $cle_depart dans la table_liee
     372                                if (isset($desc_arrivee['field'][$cle_depart])){
     373                                        $s = sql_select("$cle_depart, $cle_arrivee", $desc_arrivee['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur);
     374                                }
     375                                // cas simple : $cle_arrivee dans la table
     376                                elseif (isset($desc_depart['field'][$cle_arrivee])){
     377                                        $s = sql_select("$cle_depart, $cle_arrivee", $desc_depart['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur);
     378                                }
     379                                // sinon cherchons une table de liaison
     380                                // cas recherche principale article, objet lie document : passer par spip_documents_liens
     381                                elseif ($l = objet_associable($table_liee)){
     382                                        list($primary, $table_liens) = $l;
     383                                        $s = sql_select("id_objet as $cle_depart, $primary as $cle_arrivee", $table_liens, array("objet='$table'",sql_in($primary, array_keys($ids_trouves))), '','','','',$serveur);
     384                                }
     385                                // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens
     386                                elseif ($l = $depart_associable){
     387                                        list($primary, $table_liens) = $l;
     388                                        $s = sql_select("$primary as $cle_depart, id_objet as $cle_arrivee", $table_liens, array("objet='$table_liee'",sql_in('id_objet', array_keys($ids_trouves))), '','','','',$serveur);
     389                                }
     390                                // cas table de liaison generique spip_xxx_yyy
     391                                elseif($t=$trouver_table($table_arrivee."_".$table_depart,$serveur)
     392                                                OR $t=$trouver_table($table_depart."_".$table_arrivee,$serveur)){
     393                                        $s = sql_select("$cle_depart,$cle_arrivee", $t["table_sql"], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur);
     394                                }
     395                        }
    314396                        else
    315                                 $s = sql_select("$it,$ij", "spip_${jtable}s_${table}s", sql_in('id_'.${jtable}, array_keys($jj)), '','','','',$serveur);
    316                         while ($t = sql_fetch($s)) {
    317                                 $id = $t[$it];
    318                                 $joint = $jj[$t[$ij]];
    319                                 if (!isset($r))
    320                                         $r = array();
    321                                 if (!isset($r[$id]))
    322                                         $r[$id] = array();
    323                                 if ($joint['score'])
    324                                         $r[$id]['score'] += $joint['score'];
    325                                 if ($joint['champs'])
    326                                 foreach($joint['champs'] as $c => $val)
    327                                         $r[$id]['champs'][$jtable.'.'.$c] = $val;
    328                                 if ($joint['matches'])
    329                                 foreach($joint['matches'] as $c => $val)
    330                                         $r[$id]['matches'][$jtable.'.'.$c] = $val;
     397                                list($cle_depart,$cle_arrivee,$s) = $rechercher_joints($table,$table_liee,array_keys($ids_trouves), $serveur);
     398       
     399                        while ($t = is_array($s)?array_shift($s):sql_fetch($s)) {
     400                                $id = $t[$cle_depart];
     401                                $joint = $ids_trouves[$t[$cle_arrivee]];
     402                                if (!isset($results))
     403                                        $results = array();
     404                                if (!isset($results[$id]))
     405                                        $results[$id] = array();
     406                                if (isset($joint['score']) and $joint['score']) {
     407                                        $results[$id]['score'] += $joint['score'];
     408                                }
     409                                if (isset($joint['champs']) and $joint['champs']) {
     410                                        foreach($joint['champs'] as $c => $val) {
     411                                                $results[$id]['champs'][$table_liee.'.'.$c] = $val;
     412                                        }
     413                                }
     414                                if (isset($joint['matches']) and $joint['matches']) {
     415                                        foreach($joint['matches'] as $c => $val) {
     416                                                $results[$id]['matches'][$table_liee.'.'.$c] = $val;
     417                                        }
     418                                }
    331419                        }
    332420                }
Note: See TracChangeset for help on using the changeset viewer.