Changeset 82740 in spip-zone


Ignore:
Timestamp:
May 26, 2014, 7:34:49 AM (5 years ago)
Author:
rastapopoulos@…
Message:

Dans le découpage des méthodes de l'API tableau, ne plus envoyer tout le tableau de description, mais seulement le morceau de description réellement utilisé.

Ce qui permet ensuite d'appeler plus logiquement les fonctions toutes seules avec uniquement la description dont elles ont besoin.

+ quelques commentaires

File:
1 edited

Legend:

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

    r82604 r82740  
    112112        }
    113113
    114 
    115114        /**
    116115         * Transforme un tableau d'API en requête Sphinx structurée
     
    120119        **/
    121120        public function api2query($api) {
     121                $ok = true;
     122               
    122123                if (!is_array($api)) {
    123                         return false;
    124                 }
    125 
    126                 $ok = true;
     124                        $ok = false;
     125                }
     126               
     127                // Si une clé reconnue existe dans la description demandée, on applique la méthode adaptée
    127128                foreach (array('index', 'select', 'fulltext', 'snippet', 'filters', /*'orders', 'facet'*/) as $cle) {
    128129                        if (isset($api[$cle])) {
    129130                                $methodApi = 'setApi' . ucfirst($cle);
    130                                 $ok &= $this->$methodApi($api);
     131                                $ok &= $this->$methodApi($api[$cle]);
    131132                        }
    132133                }
     134               
    133135                return $ok;
    134136        }
     
    199201         * @return bool True si index présent.
    200202        **/
    201         public function setApiIndex($api) {
    202                 if (!isset($api['index'])) {
    203                         return false;
    204                 }
     203        public function setApiIndex($index) {
     204                if (!$index){ return false; }
     205               
    205206                // 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                 }
     207                if (!is_array($index)) {
     208                        $index = array($index);
     209                }
     210                foreach ($index as $i){
     211                        $this->from($i);
     212                }
     213               
    212214                return true;
    213215        }
     
    225227         * @return bool True si select présent.
    226228        **/
    227         public function setApiSelect($api) {
    228                 if (!isset($api['select'])) {
    229                         return false;
    230                 }
     229        public function setApiSelect($select) {
     230                if (!$select){ return false; }
     231               
    231232                // 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 
     233                if (!is_array($select)){
     234                        $select = array($select);
     235                }
     236                foreach ($select as $s){
     237                        $this->select($s);
     238                }
     239               
     240                return true;
     241        }
    241242
    242243        /**
     
    252253         * @return bool True si fulltext présent.
    253254        **/
    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 
     255        public function setApiFulltext($fulltext) {
     256                if (!is_string($fulltext)) { return false; }
     257               
     258                // Add the condition in where
    260259                $this->where('MATCH(' . $this->quote($api['fulltext']) . ')');
    261                 // add the score
     260                // Add the score
    262261                $this->select('WEIGHT() as score');
    263                 // add to snippet
     262                // Add to snippet
    264263                $this->addSnippetWords($api['fulltext']);
    265264        }
     
    287286         * @return bool True si snippet ajouté, false sinon.
    288287        **/
    289         public function setApiSnippet($api) {
    290                 if (isset($api['snippet']['words']) and is_string($api['snippet']['words'])){
    291                         $this->addSnippetWords($api['snippet']['words']);
     288        public function setApiSnippet($snippet) {
     289                if (isset($snippet['words']) and is_string($snippet['words'])){
     290                        $this->addSnippetWords($snippet['words']);
    292291                }
    293292
     
    296295                        return false;
    297296                }
    298 
    299                 $field = isset($api['snippet']['field']) ? $api['snippet']['field'] : 'content';
    300                 $limit = isset($api['snippet']['limit']) ? $api['snippet']['limit'] : 200;
    301 
     297               
     298                // Default values
     299                $field = isset($snippet['field']) ? $snippet['field'] : 'content';
     300                $limit = isset($snippet['limit']) ? $snippet['limit'] : 200;
     301               
     302                // Add the snippet in select
    302303                $this->generateSnippet($field, $words, $limit);
     304               
    303305                return true;
    304306        }
     
    348350         * @return bool True si filtres ajouté, false sinon.
    349351        **/
    350         public function setApiFilters($api) {
    351                 if (!isset($api['filters']) or !is_array($api['filters'])) {
    352                         return false;
    353                 }
    354 
    355                 foreach ($api['filters'] as $filter) {
    356                         if (!is_array($filter) or !isset($filter['type'])) {
    357                                 continue;
     352        public function setApiFilters($filters) {
     353                if (!is_array($filters)) { return false; }
     354               
     355                $ok = true;
     356
     357                // For each type of filter, call the right method
     358                foreach ($filters as $filter) {
     359                        if (is_array($filter) and isset($filter['type'])) {
     360                                switch ($filter['type']) {
     361                                        case 'mono':
     362                                                $ok &= $this->setFilterMono($filter);
     363                                                break;
     364                                        case 'multi_json':
     365                                                $ok &= $this->setFilterMultiJson($filter);
     366                                                break;
     367                                }
    358368                        }
    359                         switch ($filter['type']) {
    360                                 case 'mono':
    361                                         $this->setFilterMono($api, $filter);
    362                                         break;
    363                                 case 'multi_json':
    364                                         $this->setFilterMultiJson($api, $filter);
    365                                         break;
    366                         }
    367                 }
    368                 return true;
    369         }
    370 
    371         public function setFilterMono($api, $filter) {
     369                }
     370               
     371                return $ok;
     372        }
     373       
     374        /**
     375         * Add a mono value filter
     376         *
     377         * @param array $filter Description of the filter
     378         * @return bool Return true if the filter has been added
     379         */
     380        public function setFilterMono($filter) {
    372381                if (
    373                         ($filter['type'] != 'mono')
    374                         or !isset($filter['field'])
     382                        !isset($filter['field'])
    375383                        or !is_string($filter['field']) // mandatory
    376384                        or !isset($filter['values']) // mandatory
     
    405413                return true;
    406414        }
    407 
    408         public function setFilterMultiJson($api, $filter) {
     415       
     416        /**
     417         * Add a multi values filter in JSON
     418         *
     419         * @param array $filter
     420         *              Description of the filter
     421         *              - field : the field to compare to
     422         *              - values : an array of values
     423         *                      * in this array, all comparisons will be join with AND
     424         *                      * if a value is itself an array, it uses an IN (so like an OR)
     425         * @return bool
     426         *              Return true if the filter has been added
     427         */
     428        public function setFilterMultiJson($filter) {
    409429                static $as_count = 0;
    410430
    411431                // Multi value JSON
    412432                if (
    413                         ($filter['type'] != 'multi_json')
    414                         or !isset($filter['field'])
     433                        !isset($filter['field'])
    415434                        or !is_string($filter['field']) // mandatory
    416435                        or !isset($filter['values']) // mandatory
     
    435454
    436455                if ($ins){
    437                         $this->select('(' . join(' AND ', $ins) . ') as select_'.$as_count);
    438                         $this->where('select_'.$as_count . '=' . ((isset($filter['not']) and $filter['not']) ? '0' : '1'));
     456                        $this->select('(' . join(' AND ', $ins) . ') as multi_'.$as_count);
     457                        $this->where('multi_'.$as_count . '=' . ((isset($filter['not']) and $filter['not']) ? '0' : '1'));
    439458                        $as_count++;
    440459                }
     460               
     461                return true;
    441462        }
    442463}
Note: See TracChangeset for help on using the changeset viewer.