Changeset 88310 in spip-zone


Ignore:
Timestamp:
Mar 31, 2015, 7:23:04 AM (4 years ago)
Author:
cedric@…
Message:

Attention aux jointures, certaines sont declarees pour *toutes* les tables donc y compris sur elle meme (mot sur mot)

File:
1 edited

Legend:

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

    r88309 r88310  
    162162                        $i = 0;
    163163                        foreach ($jointures[$table] as $table_liee => $champs) {
    164                                 $i++;
    165                                 spip_log($pe,'recherche');
    166                                 if ($mkeys = fulltext_keys($table_liee, 'obj'.$i, $serveur)) {
    167                                         $_id_join = id_table_objet($table_liee);
    168                                         $table_join = table_objet($table_liee);
    169 
    170                                         $subscore = "MATCH(".implode($mkeys,',').") AGAINST ($p".($boolean ? ' IN BOOLEAN MODE':'').")";
    171                                         // on peut definir une fonction de recherche jointe pour regler les cas particuliers
    172                                         $cle_arrivee =  id_table_objet($table_liee);
    173                                         $table_arrivee = table_objet($table_liee,$serveur);
    174                                         $desc_arrivee = $trouver_table($table_arrivee,$serveur);
    175                                         /**
    176                                          * cas simple : $cle_depart dans la table_liee
    177                                          *
    178                                          * Ce cas pourrait exister par exemple si on activait une jointure de recherche sur les articles avec la table spip_evenements du plugin agenda.
    179                                          * Il suffirait d'ajouter la ligne suivante dans le pipeline "declarer_tables_objets_sql" dans le fichier base/agenda_evenements :
    180                                          * $tables['spip_articles']['rechercher_jointures']['evenement'] = array('titre' => 8, 'descriptif' => 5, 'lieu' => 5, 'adresse' => 3);
    181                                          *
    182                                          */
    183                                         if (isset($desc_arrivee['field'][$cle_depart])){
    184                                                 $join = "
     164                                if ($table_liee!==$table){
     165
     166                                        $i++;
     167                                        spip_log($pe,'recherche');
     168                                        if ($mkeys = fulltext_keys($table_liee, 'obj'.$i, $serveur)) {
     169                                                $_id_join = id_table_objet($table_liee);
     170                                                $table_join = table_objet($table_liee);
     171
     172                                                $subscore = "MATCH(".implode($mkeys,',').") AGAINST ($p".($boolean ? ' IN BOOLEAN MODE':'').")";
     173                                                // on peut definir une fonction de recherche jointe pour regler les cas particuliers
     174                                                $cle_arrivee =  id_table_objet($table_liee);
     175                                                $table_arrivee = table_objet($table_liee,$serveur);
     176                                                $desc_arrivee = $trouver_table($table_arrivee,$serveur);
     177                                                /**
     178                                                 * cas simple : $cle_depart dans la table_liee
     179                                                 *
     180                                                 * Ce cas pourrait exister par exemple si on activait une jointure de recherche sur les articles avec la table spip_evenements du plugin agenda.
     181                                                 * Il suffirait d'ajouter la ligne suivante dans le pipeline "declarer_tables_objets_sql" dans le fichier base/agenda_evenements :
     182                                                 * $tables['spip_articles']['rechercher_jointures']['evenement'] = array('titre' => 8, 'descriptif' => 5, 'lieu' => 5, 'adresse' => 3);
     183                                                 *
     184                                                 */
     185                                                if (isset($desc_arrivee['field'][$cle_depart])){
     186                                                        $join = "
     187                                                                LEFT JOIN (
     188                                                                SELECT lien$i.$cle_depart,$subscore AS score
     189                                                                FROM ".$desc_depart['table_sql']." as lien$i
     190                                                                JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$cle_depart=lien$i.$cle_depart
     191                                                                WHERE $subscore > 0
     192                                                                ORDER BY score DESC LIMIT 100
     193                                                                ) AS o$i ON o$i.$cle_depart=t.$cle_depart";
     194                                                        $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     195                                                        $from .= $join;
     196                                                }
     197                                                /**
     198                                                 * cas simple : $cle_arrivee dans la table
     199                                                 *
     200                                                 * Ce cas pourrait exister par exemple si on activait une jointure de recherche sur les évènements (du plugin agenda) avec la table spip_articles.
     201                                                 * Il suffirait d'ajouter la ligne suivante dans le pipeline "declarer_tables_objets_sql" dans le fichier base/agenda_evenements :
     202                                                 * $tables['spip_evenements']['rechercher_jointures']['article'] = array('titre' => 8, 'texte' => 5);
     203                                                 */
     204                                                elseif (isset($desc_depart['field'][$cle_arrivee])){
     205                                                        $join = "
     206                                                                LEFT JOIN (
     207                                                                SELECT lien$i.$cle_depart,$subscore AS score
     208                                                                FROM ".$desc_depart['table_sql']." as lien$i
     209                                                                JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$_id_join=lien$i.$_id_join
     210                                                                WHERE $subscore > 0
     211                                                                ORDER BY score DESC LIMIT 100
     212                                                                ) AS o$i ON o$i.$cle_depart=t.$cle_depart";
     213                                                        $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     214                                                        $from .= $join;
     215                                                }
     216                                                // sinon cherchons une table de liaison
     217                                                // cas recherche principale article, objet lie document : passer par spip_documents_liens
     218                                                elseif ($l = objet_associable($table_liee)){
     219                                                        list($primary, $table_liens) = $l;
     220                                                        $join = "
    185221                                                        LEFT JOIN (
    186                                                         SELECT lien$i.$cle_depart,$subscore AS score
    187                                                         FROM ".$desc_depart['table_sql']." as lien$i
    188                                                         JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$cle_depart=lien$i.$cle_depart
    189                                                         WHERE $subscore > 0
    190                                                         ORDER BY score DESC LIMIT 100
    191                                                         ) AS o$i ON o$i.$cle_depart=t.$cle_depart";
    192                                                 $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
    193                                                 $from .= $join;
     222                                                                SELECT lien$i.id_objet,$subscore AS score
     223                                                                FROM $table_liens as lien$i
     224                                                                JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$_id_join=lien$i.$_id_join
     225                                                                AND lien$i.objet='$table'
     226                                                                WHERE $subscore > 0
     227                                                                ORDER BY score DESC LIMIT 100
     228                                                                ) AS o$i ON o$i.id_objet=t.$_id_table";
     229                                                        $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     230                                                        $from .= $join;
     231                                                }
     232                                                // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens
     233                                                elseif ($l = $depart_associable){
     234                                                        list($primary, $table_liens) = $l;
     235                                                        $join = "
     236                                                                LEFT JOIN (
     237                                                                SELECT lien$i.id_objet,$subscore AS score
     238                                                                FROM $table_liens as lien$i
     239                                                                JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$_id_join=lien$i.$_id_join
     240                                                                                AND lien$i.objet='$table'
     241                                                                                WHERE $subscore > 0
     242                                                                                ORDER BY score DESC LIMIT 100
     243                                                                ) AS o$i ON o$i.id_objet=t.$_id_table";
     244                                                        $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     245                                                        $from .= $join;
     246                                                }
    194247                                        }
    195                                         /**
    196                                          * cas simple : $cle_arrivee dans la table
    197                                          *
    198                                          * Ce cas pourrait exister par exemple si on activait une jointure de recherche sur les évènements (du plugin agenda) avec la table spip_articles.
    199                                          * Il suffirait d'ajouter la ligne suivante dans le pipeline "declarer_tables_objets_sql" dans le fichier base/agenda_evenements :
    200                                          * $tables['spip_evenements']['rechercher_jointures']['article'] = array('titre' => 8, 'texte' => 5);
    201                                          */
    202                                         elseif (isset($desc_depart['field'][$cle_arrivee])){
    203                                                 $join = "
    204                                                         LEFT JOIN (
    205                                                         SELECT lien$i.$cle_depart,$subscore AS score
    206                                                         FROM ".$desc_depart['table_sql']." as lien$i
    207                                                         JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$_id_join=lien$i.$_id_join
    208                                                         WHERE $subscore > 0
    209                                                         ORDER BY score DESC LIMIT 100
    210                                                         ) AS o$i ON o$i.$cle_depart=t.$cle_depart";
    211                                                 $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
    212                                                 $from .= $join;
    213                                         }
    214                                         // sinon cherchons une table de liaison
    215                                         // cas recherche principale article, objet lie document : passer par spip_documents_liens
    216                                         elseif ($l = objet_associable($table_liee)){
    217                                                 list($primary, $table_liens) = $l;
    218                                                 $join = "
    219                                                 LEFT JOIN (
    220                                                         SELECT lien$i.id_objet,$subscore AS score
    221                                                         FROM $table_liens as lien$i
    222                                                         JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$_id_join=lien$i.$_id_join
    223                                                         AND lien$i.objet='$table'
    224                                                         WHERE $subscore > 0
    225                                                         ORDER BY score DESC LIMIT 100
    226                                                         ) AS o$i ON o$i.id_objet=t.$_id_table";
    227                                                 $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
    228                                                 $from .= $join;
    229                                         }
    230                                         // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens
    231                                         elseif ($l = $depart_associable){
    232                                                 list($primary, $table_liens) = $l;
    233                                                 $join = "
    234                                                         LEFT JOIN (
    235                                                         SELECT lien$i.id_objet,$subscore AS score
    236                                                         FROM $table_liens as lien$i
    237                                                         JOIN ".$desc_arrivee['table_sql']." as obj$i ON obj$i.$_id_join=lien$i.$_id_join
    238                                                                         AND lien$i.objet='$table'
    239                                                                         WHERE $subscore > 0
    240                                                                         ORDER BY score DESC LIMIT 100
    241                                                         ) AS o$i ON o$i.id_objet=t.$_id_table";
    242                                                 $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
    243                                                 $from .= $join;
    244                                         }
    245248                                }
    246249                        }
    247250                }
    248                
     251
    249252                $requete['FROM'][] = $from;
    250253                $score = join(' + ', $score).' AS score';
Note: See TracChangeset for help on using the changeset viewer.