Changeset 82604 in spip-zone


Ignore:
Timestamp:
May 19, 2014, 11:50:03 PM (5 years ago)
Author:
rastapopoulos@…
Message:

Déplacement des fonctions utilitaires de snippet au début + renommage en camelCase.

Suppression de la condition pour l'entrée "snippet", car en fait on veut que ça puisse le générer même s'il n'y que "fulltext" et pas de "snippet" explicite (comme avant quoi :D).

Modif de l'ancien squelette de test que j'utilise toujours pour tester l'API tableau, pour mettre directement #DOCS etc afin que ça remarche de nouveau.

Location:
_plugins_/indexer/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQL/QueryApi.php

    r82597 r82604  
    133133                return $ok;
    134134        }
    135 
    136         /**
    137          * Définit l'index de la requête.
    138          *
    139          * Utilise la clé 'index' du tableau d'API
    140          *
    141          *     ```
    142          *     'index' => 'visites'
    143          *     'index' => ['visites', 'autre']
    144          *     ```
    145          *
    146          * @param array $api Tableau de description
    147          * @return bool True si index présent.
    148         **/
    149         public function setApiIndex($api) {
    150                 if (!isset($api['index'])) {
    151                         return false;
    152                 }
    153                 // Always work with an array of values
    154                 if (!is_array($api['index'])) {
    155                         $api['index'] = array($api['index']);
    156                 }
    157                 foreach ($api['index'] as $index){
    158                         $this->from($index);
    159                 }
    160                 return true;
    161         }
    162 
    163         /**
    164          * Définit le select de la requête.
    165          *
    166          * Utilise la clé 'select' du tableau d'API
    167          *
    168          *     ```
    169          *     'select' => array('date', 'properties', '*', 'etc'),
    170          *     ```
    171          *
    172          * @param array $api Tableau de description
    173          * @return bool True si select présent.
    174         **/
    175         public function setApiSelect($api) {
    176                 if (!isset($api['select'])) {
    177                         return false;
    178                 }
    179                 // Always work with an array of values
    180                 if (!is_array($api['select'])){
    181                         $api['select'] = array($api['select']);
    182                 }
    183                 foreach ($api['select'] as $select){
    184                         $this->select($select);
    185                 }
    186                 return true;
    187         }
    188 
    189 
    190         /**
    191          * Définit le fulltext (match) de la requête.
    192          *
    193          * Utilise la clé 'fulltext' du tableau d'API
    194          *
    195          *     ```
    196          *     'fulltext' => 'ma recherche',
    197          *     ```
    198          *
    199          * @param array $api Tableau de description
    200          * @return bool True si fulltext présent.
    201         **/
    202         public function setApiFulltext($api) {
    203                 // Fulltext search string (optional)
    204                 if (!isset($api['fulltext']) OR !is_string($api['fulltext'])) {
    205                         return false;
    206                 }
    207 
    208                 $this->where('MATCH(' . $this->quote($api['fulltext']) . ')');
    209                 // add the score
    210                 $this->select('WEIGHT() as score');
    211                 // add to snippet
    212                 $this->add_snippet_words($api['fulltext']);
    213         }
    214 
    215 
    216         /**
    217          * Définit un snippet pour la requête.
    218          *
    219          * Utilise la clé 'snippet' du tableau d'API
    220          *
    221          * Un snippet est créé dès qu'un mot est connu,
    222          * notamment avec la valeur de la clé 'fulltext'.
    223          *
    224          * Si la clé snippet n'est pas précisée, les valeurs par défaut
    225          * sont appliquées.
    226          *
    227          *     ```
    228          *    'snippet' => array(
    229          *        'words' => 'un mot',  // optionnel
    230          *        'field' => 'content', // optionnel
    231          *        'limit' => 200,       // optionnel
    232          *     ),
    233          *     ```
    234          *
    235          * @param array $api Tableau de description
    236          * @return bool True si snippet ajouté, false sinon.
    237         **/
    238         public function setApiSnippet($api) {
    239 
    240                 if (!isset($api['snippet']) or !is_array($api['snippet'])) {
    241                         return false;
    242                 }
    243                 if (isset($api['snippet']['words']) and is_string($api['snippet']['words'])){
    244                         $this->add_snippet_words($api['snippet']['words']);
    245                 }
    246 
    247                 // If there is fulltext and/or an other words declaration, generate a snippet
    248                 if (!$words = $this->get_snippet_words()) {
    249                         return false;
    250                 }
    251 
    252                 $field = isset($api['snippet']['field']) ? $api['snippet']['field'] : 'content';
    253                 $limit = isset($api['snippet']['limit']) ? $api['snippet']['limit'] : 200;
    254 
    255                 $this->generate_snippet($field, $words, $limit);
    256                 return true;
    257         }
    258 
    259 
     135       
    260136        /**
    261137         * Ajoute des mots pour la sélection de snippet
     
    264140         * @return bool True si au moins un mot présent, false sinon.
    265141        **/
    266         public function add_snippet_words($words) {
     142        public function addSnippetWords($words) {
    267143                $words = trim($words);
    268144                if (!strlen($words)) {
     
    272148                return true;
    273149        }
    274 
    275 
     150       
    276151        /**
    277152         * Extrait et retourne les mots pertinents d'une phrase pour un snippet
     
    279154         * @return string Mots séparés par espace.
    280155        **/
    281         public function get_snippet_words() {
     156        public function getSnippetWords() {
    282157                $phrase = implode(' ', $this->snippet_words);
    283158
     
    295170                return implode(' ', $mots);
    296171        }
    297 
     172       
     173        /**
     174         * Génére le bon select pour produire un snippet suivant un champ et des mots
     175         *
     176         * @param string $field Nom du champ (ou de la combinaison de champs) pour chercher les mots
     177         * @param string $words='' Chaîne contenant les mots à mettre en gras
     178         * @param int $limit=200 Limite facultative (200 par défaut)
     179         * @return void
     180         */
     181        public function generateSnippet($field, $words='', $limit=200){
     182                if ($words){
     183                        $limit = intval($limit);
     184                        $this->select('snippet(' . $field . ', ' . $this->quote($words) . ", 'limit=$limit') as snippet");
     185                }
     186        }
     187       
     188        /**
     189         * Définit l'index de la requête.
     190         *
     191         * Utilise la clé 'index' du tableau d'API
     192         *
     193         *     ```
     194         *     'index' => 'visites'
     195         *     'index' => ['visites', 'autre']
     196         *     ```
     197         *
     198         * @param array $api Tableau de description
     199         * @return bool True si index présent.
     200        **/
     201        public function setApiIndex($api) {
     202                if (!isset($api['index'])) {
     203                        return false;
     204                }
     205                // Always work with an array of values
     206                if (!is_array($api['index'])) {
     207                        $api['index'] = array($api['index']);
     208                }
     209                foreach ($api['index'] as $index){
     210                        $this->from($index);
     211                }
     212                return true;
     213        }
     214
     215        /**
     216         * Définit le select de la requête.
     217         *
     218         * Utilise la clé 'select' du tableau d'API
     219         *
     220         *     ```
     221         *     'select' => array('date', 'properties', '*', 'etc'),
     222         *     ```
     223         *
     224         * @param array $api Tableau de description
     225         * @return bool True si select présent.
     226        **/
     227        public function setApiSelect($api) {
     228                if (!isset($api['select'])) {
     229                        return false;
     230                }
     231                // Always work with an array of values
     232                if (!is_array($api['select'])){
     233                        $api['select'] = array($api['select']);
     234                }
     235                foreach ($api['select'] as $select){
     236                        $this->select($select);
     237                }
     238                return true;
     239        }
     240
     241
     242        /**
     243         * Définit le fulltext (match) de la requête.
     244         *
     245         * Utilise la clé 'fulltext' du tableau d'API
     246         *
     247         *     ```
     248         *     'fulltext' => 'ma recherche',
     249         *     ```
     250         *
     251         * @param array $api Tableau de description
     252         * @return bool True si fulltext présent.
     253        **/
     254        public function setApiFulltext($api) {
     255                // Fulltext search string (optional)
     256                if (!isset($api['fulltext']) OR !is_string($api['fulltext'])) {
     257                        return false;
     258                }
     259
     260                $this->where('MATCH(' . $this->quote($api['fulltext']) . ')');
     261                // add the score
     262                $this->select('WEIGHT() as score');
     263                // add to snippet
     264                $this->addSnippetWords($api['fulltext']);
     265        }
     266
     267        /**
     268         * Définit un snippet pour la requête.
     269         *
     270         * Utilise la clé 'snippet' du tableau d'API
     271         *
     272         * Un snippet est créé dès qu'un mot est connu,
     273         * notamment avec la valeur de la clé 'fulltext'.
     274         *
     275         * Si la clé snippet n'est pas précisée, les valeurs par défaut
     276         * sont appliquées.
     277         *
     278         *     ```
     279         *    'snippet' => array(
     280         *        'words' => 'un mot',  // optionnel
     281         *        'field' => 'content', // optionnel
     282         *        'limit' => 200,       // optionnel
     283         *     ),
     284         *     ```
     285         *
     286         * @param array $api Tableau de description
     287         * @return bool True si snippet ajouté, false sinon.
     288        **/
     289        public function setApiSnippet($api) {
     290                if (isset($api['snippet']['words']) and is_string($api['snippet']['words'])){
     291                        $this->addSnippetWords($api['snippet']['words']);
     292                }
     293
     294                // If there is fulltext and/or an other words declaration, generate a snippet
     295                if (!$words = $this->getSnippetWords()) {
     296                        return false;
     297                }
     298
     299                $field = isset($api['snippet']['field']) ? $api['snippet']['field'] : 'content';
     300                $limit = isset($api['snippet']['limit']) ? $api['snippet']['limit'] : 200;
     301
     302                $this->generateSnippet($field, $words, $limit);
     303                return true;
     304        }
    298305
    299306        /**
     
    342349        **/
    343350        public function setApiFilters($api) {
    344 
    345351                if (!isset($api['filters']) or !is_array($api['filters'])) {
    346352                        return false;
     
    363369        }
    364370
    365 
    366371        public function setFilterMono($api, $filter) {
    367372                if (
     
    388393                foreach ($filter['values'] as $value){
    389394                        $comparison = $filter['field'] . $filter['comparison'] . $this->quote($value);
    390                         if ($filter['not']){
     395                        if (isset($filter['not']) and $filter['not']){
    391396                                $comparison = "!($comparison)";
    392397                        }
     
    401406        }
    402407
    403 
    404408        public function setFilterMultiJson($api, $filter) {
    405 
    406409                static $as_count = 0;
    407410
     
    433436                if ($ins){
    434437                        $this->select('(' . join(' AND ', $ins) . ') as select_'.$as_count);
    435                         $this->where('select_'.$as_count . '=' . ($filter['not'] ? '0' : '1'));
     438                        $this->where('select_'.$as_count . '=' . ((isset($filter['not']) and $filter['not']) ? '0' : '1'));
    436439                        $as_count++;
    437440                }
    438 
    439         }
    440 
    441 
    442         public function generate_snippet($field, $words='', $limit=200){
    443                 if ($words){
    444                         $limit = intval($limit);
    445                         $this->select('snippet(' . $field . ', ' . $this->quote($words) . ", 'limit=$limit') as snippet");
    446                 }
    447441        }
    448442}
  • _plugins_/indexer/trunk/prive/squelettes/contenu/sphinx.html

    r82568 r82604  
    9696            <h2>Liste des documents trouvés</h2>
    9797            <dl>
    98         <BOUCLE_documents(DATA){source tableau, #VALEUR}{si #CLE|=={docs}}>
     98        <BOUCLE_documents(DATA){source tableau, #DOCS}>
    9999                [<dt>#SCORE <a href="[(#URI)]">(#TITLE)</a>
    100100                [@(#VALEUR*{properties}|json_decode{1}|table_valeur{login}|print)
     
    112112            <h2>Métas associées</h2>
    113113            <dl>
    114         <BOUCLE_meta(DATA){source tableau, #VALEUR}{si #CLE|=={meta}}>
     114        <BOUCLE_meta(DATA){source tableau, #META}>
    115115                [<dt>(#CLE)</dt>]
    116116                [<dt><pre>(#VALEUR*|print_r{1})</pre></dt>]
     
    122122        <h2>Facettes associées</h2>
    123123        <dl>
    124     <BOUCLE_facettes(DATA){source tableau, #VALEUR}{si #CLE|=={facets}}>
     124    <BOUCLE_facettes(DATA){source tableau, #FACETS}>
    125125            [<dt>(#CLE)</dt>]
    126126            [<dt><pre>(#VALEUR*|print_r{1})</pre></dt>]
     
    186186        <B_facette>
    187187            <h2>Liste des facettes</h2>
    188         <BOUCLE_facette(DATA){source tableau, #VALEUR}{si #CLE|=={docs}}>
     188        <BOUCLE_facette(DATA){source tableau, #DOCS}>
    189189                <a href="[(#SELF|parametre_url{datation,[(#VALEUR{facette}|sinon{-})]})]">[(#VALEUR{facette}|sinon{<i>sans tag</i>})]</a> (#VALEUR{c} documents)<br />
    190190        </BOUCLE_facette>
     
    195195            <h2>Métas associées</h2>
    196196            <dl>
    197         <BOUCLE_meta2(DATA){source tableau, #VALEUR}{si #CLE|=={meta}}>
     197        <BOUCLE_meta2(DATA){source tableau, #META}>
    198198                [<dt>(#CLE)</dt>]
    199199                [<dt><pre>(#VALEUR*|print_r{1})</pre></dt>]
Note: See TracChangeset for help on using the changeset viewer.