Changeset 82954 in spip-zone


Ignore:
Timestamp:
Jun 11, 2014, 10:22:07 AM (5 years ago)
Author:
cedric@…
Message:

Gros bugfix : depuis r80391 la recherche ne retournait que les résultats qui matchaient tous les index d'une table, car la clause where ajoutée sur les index pour accélerer le résultat se compilait en AND au lieu de OR (il suffit qu'un des index matche pour que le résultat vaille).
+ refactoring/mise à jour des pipelines compat SPIP 3.0+

Location:
_plugins_/fulltext
Files:
4 edited

Legend:

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

    r80391 r82954  
    135135                        $score[] = $val;
    136136                }
     137                $full_text_where = array("(".implode(") OR (",$full_text_where).")");
    137138
    138139                // On ajoute la premiere cle FULLTEXT de chaque jointure
    139140                $from = array_pop($requete['FROM']);
    140141
    141                 if (is_array($jointures[$table]))
    142                 foreach(array_keys($jointures[$table]) as $jtable) {
    143                         $i++;
    144                         spip_log($pe,'recherche');
    145                         if ($mkeys = fulltext_keys($jtable, 'obj'.$i, $serveur)) {
    146                                 $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
    147                                 $_id_join = id_table_objet($jtable);
    148                                 $table_join = table_objet($jtable);
    149                                 $lesliens = recherche_tables_liens();
    150 
    151                                 $subscore = "MATCH(".implode($mkeys,',').") AGAINST ($p".($boolean ? ' IN BOOLEAN MODE':'').")";
    152 
    153                                 if (in_array($jtable, $lesliens))
    154                                         $from .= "
    155                                         LEFT JOIN (
    156                                          SELECT lien$i.id_objet,$subscore AS score
    157                                          FROM spip_${jtable}s_liens as lien$i
    158                                          JOIN spip_${jtable}s as obj$i ON obj$i.$_id_join=lien$i.$_id_join
    159                                          AND lien$i.objet='${table}'
    160                                          WHERE $subscore > 0
    161                                          ORDER BY score DESC LIMIT 100
    162                                          ) AS o$i ON o$i.id_objet=t.$_id_table
    163                                         ";
    164                                 else
    165                                         $from .= "
    166                                         LEFT JOIN (
    167                                          SELECT lien$i.$_id_table,$subscore AS score
    168                                          FROM spip_${jtable}s_${table}s as lien$i
    169                                          JOIN spip_${table_join} AS obj$i ON lien$i.$_id_join=obj$i.$_id_join
    170                                          WHERE $subscore > 0
    171                                          ORDER BY score DESC LIMIT 100
    172                                          ) AS o$i ON o$i.$_id_table=t.$_id_table
    173                                         ";
     142                if (is_array($jointures[$table])){
     143                        $i = 0;
     144                        foreach(array_keys($jointures[$table]) as $jtable) {
     145                                $i++;
     146                                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();
     152
     153                                        $subscore = "MATCH(".implode($mkeys,',').") AGAINST ($p".($boolean ? ' IN BOOLEAN MODE':'').")";
     154
     155                                        if (in_array($jtable, $lesliens))
     156                                                $from .= "
     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                                                $from .= "
     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                                }
    174177                        }
    175178                }
     
    288291                }
    289292        }
    290 
    291293
    292294        // Gerer les donnees associees
  • _plugins_/fulltext/inc/rechercher.php

    r46184 r82954  
    1919// http://doc.spip.org/@liste_des_champs
    2020function liste_des_champs() {
    21         global $spip_version_branche;
    22         if($spip_version_branche >= '2.3.0'){
    23                 static $liste=null;
    24                 if (is_null($liste)) {
    25                         $liste = array();
     21        static $liste=null;
     22        if (is_null($liste)) {
     23                $liste = array();
     24                if(intval($GLOBALS['spip_version_branche']) > 2){
    2625                        // recuperer les tables_objets_sql declarees
    2726                        include_spip('base/objets');
     
    3231                                }
    3332                        }
    34                         // puis passer dans le pipeline
    35                         $liste = pipeline('rechercher_liste_des_champs', $liste);
    36                 }
    37                 return $liste;
    38         }
    39         else
    40         return
    41         pipeline('rechercher_liste_des_champs',
    42                 array(
    43                         'article' => array(
    44                                 'surtitre' => 5, 'titre' => 8, 'soustitre' => 5, 'chapo' => 3,
    45                                 'texte' => 1, 'ps' => 1, 'nom_site' => 1, 'url_site' => 1,
    46                                 'descriptif' => 4
    47                         ),
    48                         'breve' => array(
    49                                 'titre' => 8, 'texte' => 2, 'lien_titre' => 1, 'lien_url' => 1
    50                         ),
    51                         'rubrique' => array(
    52                                 'titre' => 8, 'descriptif' => 5, 'texte' => 1
    53                         ),
    54                         'site' => array(
    55                                 'nom_site' => 5, 'url_site' => 1, 'descriptif' => 3
    56                         ),
    57                         'mot' => array(
    58                                 'titre' => 8, 'texte' => 1, 'descriptif' => 5
    59                         ),
    60                         'auteur' => array(
    61                                 'nom' => 5, 'bio' => 1, 'email' => 1, 'nom_site' => 1, 'url_site' => 1, 'login' => 1
    62                         ),
    63                         'forum' => array(
    64                                 'titre' => 3, 'texte' => 1, 'auteur' => 2, 'email_auteur' => 2, 'nom_site' => 1, 'url_site' => 1
    65                         ),
    66                         'document' => array(
    67                                 'titre' => 3, 'descriptif' => 1, 'contenu' => 1, 'fichier' => 1
    68                         ),
    69                         'syndic_article' => array(
    70                                 'titre' => 5, 'descriptif' => 1
    71                         ),
    72                         'signature' => array(
    73                                 'nom_email' => 2, 'ad_email' => 4,
    74                                 'nom_site' => 2, 'url_site' => 4,
    75                                 'message' => 1
    76                         )
    77                 )
    78         );
     33                }
     34                else {
     35                        $liste =
     36                                array(
     37                                        'article' => array(
     38                                                'surtitre' => 5, 'titre' => 8, 'soustitre' => 5, 'chapo' => 3,
     39                                                'texte' => 1, 'ps' => 1, 'nom_site' => 1, 'url_site' => 1,
     40                                                'descriptif' => 4
     41                                        ),
     42                                        'breve' => array(
     43                                                'titre' => 8, 'texte' => 2, 'lien_titre' => 1, 'lien_url' => 1
     44                                        ),
     45                                        'rubrique' => array(
     46                                                'titre' => 8, 'descriptif' => 5, 'texte' => 1
     47                                        ),
     48                                        'site' => array(
     49                                                'nom_site' => 5, 'url_site' => 1, 'descriptif' => 3
     50                                        ),
     51                                        'mot' => array(
     52                                                'titre' => 8, 'texte' => 1, 'descriptif' => 5
     53                                        ),
     54                                        'auteur' => array(
     55                                                'nom' => 5, 'bio' => 1, 'email' => 1, 'nom_site' => 1, 'url_site' => 1, 'login' => 1
     56                                        ),
     57                                        'forum' => array(
     58                                                'titre' => 3, 'texte' => 1, 'auteur' => 2, 'email_auteur' => 2, 'nom_site' => 1, 'url_site' => 1
     59                                        ),
     60                                        'document' => array(
     61                                                'titre' => 3, 'descriptif' => 1, 'contenu' => 1, 'fichier' => 1
     62                                        ),
     63                                        'syndic_article' => array(
     64                                                'titre' => 5, 'descriptif' => 1
     65                                        ),
     66                                        'signature' => array(
     67                                                'nom_email' => 2, 'ad_email' => 4,
     68                                                'nom_site' => 2, 'url_site' => 4,
     69                                                'message' => 1
     70                                        )
     71                                );
     72                }
     73                // puis passer dans le pipeline
     74                $liste = pipeline('rechercher_liste_des_champs', $liste);
     75        }
     76        return $liste;
    7977}
    8078
     
    8482// http://doc.spip.org/@liste_des_jointures
    8583function liste_des_jointures() {
    86         return
    87         pipeline('rechercher_liste_des_jointures',
    88                         array(
    89                         'article' => array(
    90                                 'auteur' => array('nom' => 10),
    91                                 'mot' => array('titre' => 3),
    92                                 'document' => array('titre' => 2, 'descriptif' => 1, 'contenu' => 1)
    93                         ),
    94                         'breve' => array(
    95                                 'mot' => array('titre' => 3),
    96                                 'document' => array('titre' => 2, 'descriptif' => 1, 'contenu' => 1)
    97                         ),
    98                         'rubrique' => array(
    99                                 'mot' => array('titre' => 3),
    100                                 'document' => array('titre' => 2, 'descriptif' => 1, 'contenu' => 1)
    101                         ),
    102                         'document' => array(
    103                                 'mot' => array('titre' => 3)
    104                         )
    105                 )
    106         );
     84        static $liste=null;
     85        if (is_null($liste)) {
     86                $liste = array();
     87                if(intval($GLOBALS['spip_version_branche']) > 2){
     88                        // recuperer les tables_objets_sql declarees
     89                        include_spip('base/objets');
     90                        $tables_objets = lister_tables_objets_sql();
     91                        foreach($tables_objets as $t=>$infos){
     92                                if ($infos['rechercher_jointures']){
     93                                        $liste[$infos['type']] = $infos['rechercher_jointures'];
     94                                }
     95                        }
     96                }
     97                else {
     98                        $liste =
     99                                array(
     100                                'article' => array(
     101                                        'auteur' => array('nom' => 10),
     102                                        'mot' => array('titre' => 3),
     103                                        'document' => array('titre' => 2, 'descriptif' => 1, 'contenu' => 1)
     104                                ),
     105                                'breve' => array(
     106                                        'mot' => array('titre' => 3),
     107                                        'document' => array('titre' => 2, 'descriptif' => 1, 'contenu' => 1)
     108                                ),
     109                                'rubrique' => array(
     110                                        'mot' => array('titre' => 3),
     111                                        'document' => array('titre' => 2, 'descriptif' => 1, 'contenu' => 1)
     112                                ),
     113                                'document' => array(
     114                                        'mot' => array('titre' => 3)
     115                                )
     116                        );
     117                }
     118                // puis passer dans le pipeline
     119                $liste = pipeline('rechercher_liste_des_jointures', $liste);
     120        }
     121        return $liste;
    107122}
    108123
  • _plugins_/fulltext/paquet.xml

    r81745 r82954  
    22        prefix="fulltext"
    33        categorie="navigation"
    4         version="0.7.2"
     4        version="0.8.0"
    55        etat="test"
    66        compatibilite="[2.0.0;3.0.*]"
  • _plugins_/fulltext/plugin.xml

    r81745 r82954  
    88        </slogan>
    99        <auteur>Fil, Gael Chareyre</auteur>
    10         <version>0.7.2</version>
     10        <version>0.8.0</version>
    1111        <version_base>0.2</version_base>
    1212        <etat>test</etat>
Note: See TracChangeset for help on using the changeset viewer.