Changeset 82568 in spip-zone


Ignore:
Timestamp:
May 18, 2014, 9:04:04 PM (5 years ago)
Author:
marcimat@…
Message:
  • Déplacement de la gestion de tableau d'api pour créer une requête dans un fichier séparé.
  • On sépare en autant de méthodes spécifiques cette création
  • Déplacement de SphinxQL (je suis pas encore satisfait de ce namespace, mais bon)
Location:
_plugins_/indexer/trunk
Files:
2 added
7 edited
2 moved

Legend:

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

    r82558 r82568  
    33
    44[(#FORMULAIRE_RECHERCHE{#SELF})]
    5 
    65
    76
     
    3130
    3231<!--
    33         {filtre auteurs, properties.authors, #ENV*{auteur}}
     32        {filtre auteurs, properties.authors, ALL, #ENV*{auteur}}
     33        {filtre tags, properties.mots.fr, IN, #ENV*{auteur}}
     34
     35        {mono #ENV{date}, date, =}
     36        {mono #ENV{date}, date, >}
     37        {mono #ENV{date}, date, IN}
     38        {mono #ENV{date}, date, INTERVAL, 100, 200, 300}
     39
     40        {filtres #ENV*{f}} => tableau ? f[auteurs][description...]
    3441-->
    3542
     
    3744        {recherche #ENV*{recherche}}
    3845
    39 
     46        {filtre multi, properties.authors IN #ENV*{auteur}}
    4047
    4148        {facet auteurs, properties.authors ORDER BY COUNT(*) DESC}
     
    4350        {facet date, YEAR(date) ORDER BY date DESC}
    4451>
     52
    4553        <h1>Dans la boucle (SPHINX)</h1>
    4654        <pre>#QUERY</pre>
  • _plugins_/indexer/trunk/inc/sphinxql_to_array.php

    r82546 r82568  
    1313   }
    1414
    15         $sphinx = new Sphinx\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT);
     15        $sphinx = new Sphinx\SphinxQL\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT);
    1616
    1717        $all = $sphinx->allfetsel($u);
  • _plugins_/indexer/trunk/indexer_fonctions.php

    r82558 r82568  
    11<?php
    2 /*
    3 // charger les fonctions pour le compilateur SPIP
    4 // boucles (PMB:NOTICES) ...
    5 include_spip('iterateur/sphinx');
    6 */
    72
    8 function sphinx_get_array2query($query_description, $limit=''){
     3
     4
     5function sphinx_get_array2query($api, $limit=''){
    96        include_spip('inc/indexer');
    10         $sq = new \Sphinx\SphinxQLQuery($query_description);
     7        $sq = new \Sphinx\SphinxQL\QueryApi($api);
    118        if ($limit){ $sq->limit($limit); }
    129
    1310        return $sq->get();
    1411}
     12
     13
     14function sphinx_test_api() {
     15    $api =      // exemple de description
     16        array(
     17                'index' => 'visites',
     18                'select' => array('date', 'properties', '*', 'etc'),
     19                'fulltext' => 'ma recherche',
     20                'snippet' => array(
     21                        'words' => 'un mot',
     22                        'field' => 'content',
     23                        'limit' => 200,
     24                ),
     25                'filters' => array(
     26                        array(
     27                                'type' => 'mono',
     28                                'field' => 'properties.lang',
     29                                'values' => array('fr'),
     30                                'comparison' => '!=', // default : =
     31                        ),
     32                        array(
     33                                'type' => 'multi_json',
     34                                'field' => 'properties.tags',
     35                                'values' => array('pouet', 'glop'),
     36                        ),
     37                        array(
     38                                'type' => 'distance',
     39                                'center' => array(
     40                                        'lat' => 44.837862,
     41                                        'lon' => -0.580086,
     42                                ),
     43                                'fields' => array(
     44                                        'lat' => 'properties.geo.lat',
     45                                        'lon' => 'properties.geo.lon',
     46                                ),
     47                                'distance' => 10000,
     48                                'comparison' => '>', // default : <=
     49                        ),
     50                        array(
     51                                'type' => 'interval',
     52                                'expression' => 'uint(properties.truc)',
     53                                'intervals' => array(1,2,3,4,5),
     54                                'field' => 'truc',
     55                                'test' => 'truc = 2',
     56                                'select' => 'interval(uint(properties.truc),1,2,3,4)',
     57                                'where' => 'test = 2',
     58                        ),
     59                ),
     60                'orders' => array(
     61                        array(
     62                                'field' => 'score',
     63                                'direction' => 'asc', // default : desc
     64                        ),
     65                        array(
     66                                'field' => 'distance',
     67                                'center' => array(
     68                                        'lat' => 44.837862,
     69                                        'lon' => -0.580086,
     70                                ),
     71                                'fields' => array(
     72                                        'lat' => 'properties.geo.lat',
     73                                        'lon' => 'properties.geo.lon',
     74                                ),
     75                        ),
     76                ),
     77                'facet' => array(
     78                        'field' => 'properties.tags',
     79                        'group_name' => 'tag',
     80                        'order' => 'tag asc', // default : count desc
     81                ),
     82        );
     83    echo "\n<pre>"; print_r(sphinx_get_array2query($api)); echo "</pre>";
     84}
     85
    1586
    1687/**
     
    2293    if (!$index) $index = SPHINX_DEFAULT_INDEX;
    2394
    24     $sq = new \Sphinx\SphinxQLQuery();
     95    $sq = new \Sphinx\SphinxQL\Query();
    2596    $sq
    2697        ->select('*')
     
    69140
    70141    include_spip('inc/indexer');
    71     $sq = new \Sphinx\SphinxQLQuery();
     142    $sq = new \Sphinx\SphinxQL\Query();
    72143    $sq
    73144        ->select('COUNT(*) AS c')
     
    90161
    91162    include_spip('inc/indexer');
    92     $sq = new \Sphinx\SphinxQLQuery();
     163    $sq = new \Sphinx\SphinxQL\Query();
    93164    $sq
    94165        ->select('COUNT(*) AS c')
  • _plugins_/indexer/trunk/iterateur/sphinx.php

    r82558 r82568  
    2828                        'meta' => 'ARRAY',
    2929                        'facets' => 'ARRAY',
    30                         'query' => 'STRING'
     30                        'query' => 'STRING',
     31                        '*' => 'ALL' // Champ joker *
    3132                )
    3233        );
     
    106107                ];
    107108
    108                 #var_dump($command);
     109#var_dump($this->command);
    109110
    110111                $this->info = $info;
     
    112113                include_spip('inc/indexer');
    113114
    114                 $this->sphinxQL      = new \Sphinx\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT);
    115                 $this->sphinxQLQuery = new \Sphinx\SphinxQLQuery();
     115                $this->sphinxQL      = new \Sphinx\SphinxQL\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT);
     116                $this->sphinxQLQuery = new \Sphinx\SphinxQL\Query();
    116117
    117118                $this->setIndex($this->command['index']);
  • _plugins_/indexer/trunk/lib/Indexer/Storage/Sphinx.php

    r82442 r82568  
    1515
    1616
    17     public function __construct(\Sphinx\SphinxQL $sphinxql, $indexName) {
     17    public function __construct(\Sphinx\SphinxQL\SphinxQL $sphinxql, $indexName) {
    1818        $this->sphinxql = $sphinxql;
    1919        $this->indexName = $indexName;
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQL/Query.php

    r82566 r82568  
    11<?php
    22
    3 namespace Sphinx;
     3namespace Sphinx\SphinxQL;
    44
    55/**
    66 * Classe pour créer des requêtes de sélection Sphinx
    77 */
    8 class SphinxQLQuery{
     8class Query{
    99        private $select  = [];
    1010        private $from    = [];
     
    1515        private $facet   = [];
    1616
    17         public function __construct($query_description=array()) {
    18                 if (!empty($query_description)){
    19                         $this->array2query($query_description);
    20                 }
    21         }
     17        public function __construct() {}
    2218
    2319        public function select($select) {
     
    6561        }
    6662
    67         public function generate_snippet($field, $words='', $limit=200){
    68                 if ($words){
    69                         $limit = intval($limit);
    70                         $this->select('snippet(' . $field . ', ' . $this->quote($words) . ", 'limit=$limit') as snippet");
    71                 }
    72         }
    73 
    74         public function array2query($query_description){
    75                 if (is_array($query_description)){
    76                         // Index (mandatory)
    77                         if (isset($query_description['index'])){
    78                                 if (!is_array($query_description['index'])){
    79                                         $query_description['index'] = array($query_description['index']);
    80                                 }
    81                                 foreach ($query_description['index'] as $index){
    82                                         $this->from($index);
    83                                 }
    84                         }
    85 
    86                         // Explicit select definition
    87                         if (isset($query_description['select'])){
    88                                 // Always work with an array of values
    89                                 if (!is_array($query_description['select'])){
    90                                         $query_description['select'] = array($query_description['select']);
    91                                 }
    92                                 foreach ($query_description['select'] as $select){
    93                                         $this->select($select);
    94                                 }
    95                         }
    96 
    97                         // Fulltext search string (optional)
    98                         if (isset($query_description['fulltext']) and is_string($query_description['fulltext'])){
    99                                 $this->where('match(' . $this->quote($query_description['fulltext']) . ')');
    100                                 // add the score
    101                                 $this->select('weight() as score');
    102                                 // add to snippet
    103                                 $snippet_words = $query_description['fulltext'];
    104                         }
    105 
    106                         // If there is fulltext and/or an other words declaration, generate a snippet
    107                         if (isset($query_description['snippet']['words']) and is_string($query_description['snippet']['words'])){
    108                                 $snippet_words .= ' ' . $query_description['snippet']['words'];
    109                                 $snippet_words = trim($snippet_words);
    110                         }
    111                         if ($snippet_words){
    112                                 $field = isset($query_description['snippet']['field']) ? $query_description['snippet']['field'] : 'content';
    113                                 $limit = isset($query_description['snippet']['limit']) ? $query_description['snippet']['limit'] : 200;
    114                                 $this->generate_snippet($field, $snippet_words, $limit);
    115                         }
    116 
    117                         // All filters
    118                         $as_count = 0;
    119                         if (isset($query_description['filters']) and is_array($query_description['filters'])){
    120                                 foreach ($query_description['filters'] as $filter){
    121                                         // Mono value
    122                                         if (
    123                                                 $filter['type'] == 'mono'
    124                                                 and isset($filter['field']) and is_string($filter['field']) // mandatory
    125                                                 and isset($filter['values']) // mandatory
    126                                         ){
    127                                                 // Default comparison : =
    128                                                 if (!isset($filter['comparison'])){
    129                                                         $filter['comparison'] = '=';
    130                                                 }
    131 
    132                                                 // Always work with an array of values
    133                                                 if (!is_array($filter['values'])){
    134                                                         $filter['values'] = array($filter['values']);
    135                                                 }
    136 
    137                                                 // For each values, we build a comparison
    138                                                 $comparisons = array();
    139                                                 foreach ($filter['values'] as $value){
    140                                                         $comparison = $filter['field'] . $filter['comparison'] . $this->quote($value);
    141                                                         if ($filter['not']){
    142                                                                 $comparison = "!($comparison)";
    143                                                         }
    144                                                         $comparisons[] = $comparison;
    145                                                 }
    146                                                 if ($comparisons){
    147                                                         $comparisons = join(' OR ', $comparisons);
    148                                                         $this->where($comparisons);
    149                                                 }
    150                                         }
    151 
    152                                         // Multi value JSON
    153                                         if (
    154                                                 $filter['type'] == 'multi_json'
    155                                                 and isset($filter['field']) and is_string($filter['field']) // mandatory
    156                                                 and isset($filter['values']) // mandatory
    157                                         ){
    158                                                 // Always work with an array of values
    159                                                 if (!is_array($filter['values'])){
    160                                                         $filter['values'] = array(array($filter['values']));
    161                                                 }
    162 
    163                                                 // At depth 1, generate AND
    164                                                 $ins = array();
    165                                                 foreach ($filter['values'] as $values_in){
    166                                                         // Always work with an array of values
    167                                                         if (!is_array($values_in)){
    168                                                                 $values_in = array($values_in);
    169                                                         }
    170                                                         $ins[] = 'IN(' . $filter['field'] . ', ' . join(', ', array_map(array($this, 'quote'), array_filter($values_in))) . ')';
    171                                                 }
    172                                                 if ($ins){
    173                                                         $this->select('(' . join(' AND ', $ins) . ') as select_'.$as_count);
    174                                                         $this->where('select_'.$as_count . '=' . ($filter['not'] ? '0' : '1'));
    175                                                         $as_count++;
    176                                                 }
    177                                         }
    178                                 }
    179                         }
    180                 }
    181 
    182                 /**
    183                 // exemple de description
    184                 array(
    185                         'index' => 'visites',
    186                         'select' => array('date', 'properties', '*', 'etc'),
    187                         'fulltext' => 'ma recherche',
    188                         'filters' => array(
    189                                 array(
    190                                         'type' => 'mono',
    191                                         'field' => 'properties.lang',
    192                                         'values' => array('fr'),
    193                                         'comparison' => '!=', // default : =
    194                                 ),
    195                                 array(
    196                                         'type' => 'multi_json',
    197                                         'field' => 'properties.tags',
    198                                         'values' => array('pouet', 'glop'),
    199                                 ),
    200                                 array(
    201                                         'type' => 'distance',
    202                                         'center' => array(
    203                                                 'lat' => 44.837862,
    204                                                 'lon' => -0.580086,
    205                                         ),
    206                                         'fields' => array(
    207                                                 'lat' => 'properties.geo.lat',
    208                                                 'lon' => 'properties.geo.lon',
    209                                         ),
    210                                         'distance' => 10000,
    211                                         'comparison' => '>', // default : <=
    212                                 ),
    213                                 array(
    214                                         'type' => 'interval',
    215                                         'expression' => 'uint(properties.truc)',
    216                                         'intervals' => array(1,2,3,4,5),
    217                                         'field' => 'truc',
    218                                         'test' => 'truc = 2',
    219                                         'select' => 'interval(uint(properties.truc),1,2,3,4)',
    220                                         'where' => 'test = 2',
    221                                 ),
    222                         ),
    223                         'orders' => array(
    224                                 array(
    225                                         'field' => 'score',
    226                                         'direction' => 'asc', // default : desc
    227                                 ),
    228                                 array(
    229                                         'field' => 'distance',
    230                                         'center' => array(
    231                                                 'lat' => 44.837862,
    232                                                 'lon' => -0.580086,
    233                                         ),
    234                                         'fields' => array(
    235                                                 'lat' => 'properties.geo.lat',
    236                                                 'lon' => 'properties.geo.lon',
    237                                         ),
    238                                 ),
    239                         ),
    240                         'facet' => array(
    241                                 'field' => 'properties.tags',
    242                                 'group_name' => 'tag',
    243                                 'order' => 'tag asc', // default : count desc
    244                         ),
    245                 );
    246                 **/
    247         }
    24863
    24964        public function get() {
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQL/SphinxQL.php

    r82558 r82568  
    11<?php
    22
    3 namespace Sphinx;
     3namespace Sphinx\SphinxQL;
    44
    55
  • _plugins_/indexer/trunk/prive/squelettes/contenu/indexer.html

    r82457 r82568  
    1010        $indexer->registerStorage(
    1111            new Indexer\Storage\Sphinx(
    12                 new Sphinx\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT), SPHINX_DEFAULT_INDEX)
     12                new Sphinx\SphinxQL\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT), SPHINX_DEFAULT_INDEX)
    1313        );
    1414    } catch( PDOException $e ) {
  • _plugins_/indexer/trunk/prive/squelettes/contenu/sphinx.html

    r82551 r82568  
    3838/*
    3939include_spip('inc/indexer');
    40 $sphinx = new Sphinx\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT);
     40$sphinx = new Sphinx\SphinxQL\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT);
    4141
    4242echo '<pre>';
     
    100100                [@(#VALEUR*{properties}|json_decode{1}|table_valeur{login}|print)
    101101                ][<small>(#DATE|affdate_court)</small>]
    102                  
     102
    103103                </dt>
    104104                 [<dd>(#SNIPPET|sinon{#SUMMARY})</dd>]
     
    149149 Distance de Nairobi :
    150150                GEODIST(lat1,long1,lat2,long2)
    151 ] 
     151]
    152152#SET{lon,36.817}
    153153#SET{lat,1.283}
Note: See TracChangeset for help on using the changeset viewer.