Changeset 82479 in spip-zone


Ignore:
Timestamp:
May 17, 2014, 10:24:41 AM (5 years ago)
Author:
marcimat@…
Message:

Nettoyer les éventuels éléments vides des morceaux de requête. Commentaires en moins. Passer en multicolonne l'affichage des Facet (avec spipr/bootstrap)

Location:
_plugins_/indexer/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/indexer/trunk/content/sphinx.html

    r82475 r82479  
    4444    </BOUCLE_documents>
    4545        </dl>
    46     [<p class="pagination">(#PAGINATION)</p>]
     46    [<div class="pagination">(#PAGINATION)</div>]
    4747    </B_documents>
    4848
     
    6262    <B_facettes>
    6363        <h2>Facettes associées</h2>
     64        <div class='row-fluid'>
    6465    <BOUCLE_facettes(DATA){source tableau, #VALEUR}{si #CLE|=={facets}}>
    65         <h3>#CLE</h3>
    66         <div class='liste'>
    67             <ul class='liste-items'>
    68         <BOUCLE_liste_facettes(DATA){source tableau, #VALEUR}>
    69                 <li class='item'>#CLE \(#VALEUR\)</li>
    70         </BOUCLE_liste_facettes>
    71             </ul>
     66        <div class='span4'>
     67            <h3>#CLE</h3>
     68            <div class='liste'>
     69                <ul class='liste-items'>
     70            <BOUCLE_liste_facettes(DATA){source tableau, #VALEUR}>
     71                    <li class='item'>#CLE \(#VALEUR\)</li>
     72            </BOUCLE_liste_facettes>
     73                </ul>
     74            </div>
    7275        </div>
    7376    </BOUCLE_facettes>
     77        </div>
    7478    </B_facettes>
    7579</BOUCLE_recherche>
  • _plugins_/indexer/trunk/indexer_fonctions.php

    r82470 r82479  
    55        $sq = new \Sphinx\SphinxQLQuery($query_description);
    66        if ($limit){ $sq->limit($limit); }
    7        
     7
    88        return $sq->get();
    99}
     
    2020        ->select("SNIPPET(content, " . $sq->quote($recherche . ($tag ? " $tag" : '')) . ", 'limit=200') AS snippet")
    2121        ->from($index)
    22         ->where(strlen($recherche) ? "MATCH(" . $sq->quote($recherche) . ")" : null)
    2322        ->facet("properties.authors ORDER BY COUNT(*) DESC")
    2423        ->facet("properties.tags ORDER BY COUNT(*) DESC")
    2524        ->facet("YEAR(date) ORDER BY date DESC")
    2625        ;
     26
     27    if (strlen($recherche)) {
     28        $sq->where("MATCH(" . $sq->quote($recherche) . ")");
     29    }
    2730
    2831    if ($orderby) {
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQLQuery.php

    r82470 r82479  
    55/**
    66 * Classe pour créer des requêtes de sélection Sphinx
    7  *
    8  * Quelques exemples :
    9 
    10 
    11 SPIP
    12 
    13 [(#SET{sql, [(#ENV{source,spip}|sphinx_get_query_documents{#ENV*{recherche},#ENV*{tag},#ENV*{auteur}})]})]
    14 
    15 PHP
    16 
    17 function sphinx_get_query_documents($source, $recherche, $tag = '', $auteur = '', $orderby = '') {
    18     include_spip('inc/indexer');
    19     $sq = new \Sphinx\SphinxQLQuery();
    20     $sq
    21         ->select('WEIGHT() AS score')
    22         ->select('*')
    23         ->select("SNIPPET(content, " . $sq->quote($recherche . ($tag ? " $tag" : '')) . ", 'limit=200') AS snippet")
    24         ->from($source)
    25         ->where("MATCH(" . $sq->quote($recherche) . ")");
    26 
    27     if ($orderby) {
    28         $sq->orderby($orderby);
    29     }
    30 
    31     if ($tag) {
    32         if ($tag == '-') {
    33             $sq->select("IN(properties.tags.fr, " . $sq->quote($tag) . ") AS tag");
    34         } else {
    35             $sq->select("(LENGTH(properties.tags.fr) = 0) AS tag");
    36         }
    37         $sq->where("tag = 1");
    38     }
    39 
    40     if ($auteur) {
    41         $sq->select("IN(properties.authors, " . $sq->quote($auteur) . ") AS auteur");
    42         $sq->where("auteur = 1");
    43     }
    44 
    45     return $sq->get();
    46 }
    47 
    48 SPIP
    49 
    50 [(#SET{sqlf, [(#ENV{source,spip}|sphinx_get_query_facette_auteurs{#ENV*{recherche},#ENV*{tag},#ENV*{auteur}})]})]
    51 
    52 PHP
    53 
    54 function sphinx_get_query_facette_auteurs($source, $recherche, $tag = '', $auteur = '', $orderby = '') {
    55 
    56     include_spip('inc/indexer');
    57     $sq = new \Sphinx\SphinxQLQuery();
    58     $sq
    59         ->select('COUNT(*) AS c')
    60         ->select('GROUPBY() AS facette')
    61         ->from($source)
    62         ->where("MATCH(" . $sq->quote($recherche) . ")")
    63         ->groupby("properties.authors")
    64         ->orderby("c DESC")
    65         ->limit("30")
    66         ;
    67 
    68     return $sq->get();
    69 }
    70 
    71 
    72 
    737 */
    748class SphinxQLQuery{
     
    8014    private $limit   = '';
    8115    private $facet   = [];
    82        
     16
    8317        public function __construct($query_description=array()) {
    8418                if (!empty($query_description)){
     
    8620                }
    8721        }
    88        
     22
    8923    public function select($select) {
    9024        $this->select[] = $select;
     
    13064                                );
    13165        }
    132        
     66
    13367        public function array2query($query_description){
    13468                if (is_array($query_description)){
     
    14276                                }
    14377                        }
    144                        
     78
    14579                        // Fulltext search string (optional)
    14680                        if (isset($query_description['fulltext']) and is_string($query_description['fulltext'])){
    14781                                $this->where('match(' . $this->quote($query_description['fulltext']) . ')');
    14882                        }
    149                        
     83
    15084                        // All filters
    15185                        $as_count = 0;
     
    16296                                                        $filter['comparison'] = '=';
    16397                                                }
    164                                                
     98
    16599                                                // Always work with an array of values
    166100                                                if (!is_array($filter['values'])){
    167101                                                        $filter['values'] = array($filter['values']);
    168102                                                }
    169                                                
     103
    170104                                                // For each values, we build a comparision
    171105                                                $comparisons = array();
     
    178112                                                }
    179113                                        }
    180                                        
     114
    181115                                        // Multi value JSON
    182116                                        if (
     
    189123                                                        $filter['values'] = array($filter['values']);
    190124                                                }
    191                                                
     125
    192126                                                // For each values, we build an "in" select
    193127                                                $this->select(
     
    199133                        }
    200134                }
    201                
     135
    202136                /**
    203137                // exemple de description
     
    265199                **/
    266200        }
    267        
     201
    268202    public function get() {
    269203        $query = [];
     204        $this->removeEmpty();
    270205        if ($this->select)   $query[] = 'SELECT '   . implode(',', $this->select);
    271206        if ($this->from)     $query[] = 'FROM '     . implode(',', $this->from);
    272         if ($this->where = array_filter($this->where))    $query[] = 'WHERE ('   . implode(') AND (', $this->where) . ')';
     207        if ($this->where)    $query[] = 'WHERE ('   . implode(') AND (', $this->where) . ')';
    273208        if ($this->groupby)  $query[] = 'GROUP BY ' . implode(',', $this->groupby);
    274209        if ($this->orderby)  $query[] = 'ORDER BY ' . implode(',', $this->orderby);
     
    278213    }
    279214
     215    private function removeEmpty() {
     216        foreach (['select', 'from', 'where', 'groupby', 'orderby', 'facet'] as $key) {
     217            $this->$key = array_filter($this->$key);
     218            #$this->$key = array_filter($this->key, 'strlen'); // leaves 0
     219        }
     220    }
     221
    280222    public function __tostring() {
    281223        return $this->get();
Note: See TracChangeset for help on using the changeset viewer.