source: spip-zone/_plugins_/indexer/trunk/lib/Sphinx/SphinxQL/SphinxQL.php @ 82619

Last change on this file since 82619 was 82619, checked in by fil@…, 7 years ago

ajotuer un log pour voir les query envoyees a sphinx

File size: 3.7 KB
Line 
1<?php
2
3namespace Sphinx\SphinxQL;
4
5
6
7class SphinxQL {
8
9        private $host;
10        private $port;
11        private $sql; // objet MySQLi
12
13        public function __construct($host = '127.0.0.1', $port = 9306) {
14                $this->host = $host;
15                $this->port = $port;
16                $this->connect();
17        }
18
19        /**
20         * Se connecter à Sphinx
21        **/
22        public function connect() {
23                try {
24                        $this->sql = new \MySQLi($this->host, null, null, null, $this->port);
25                } catch (\Exception $e) {
26                        var_dump($e->getMessage());
27                        return false;
28                }
29                return true;
30        }
31
32        /**
33         * Exécute une requête
34        **/
35        public function query($query) {
36                spip_log($query, 'sphinx');
37                if (!$this->sql) {
38                        return false;
39                }
40                return $this->sql->multi_query($query);
41        }
42
43
44        /**
45         * Échappe une chaîne
46        **/
47        public function escape_string($string) {
48                if (!$this->sql) {
49                        return false;
50                }
51                return $this->sql->escape_string($string);
52        }
53
54        /**
55         * Récupère les dernières erreurs
56        **/
57        public function errors() {
58                if (!$this->sql) {
59                        return false;
60                }
61                return $this->sql->error_list;
62        }
63
64
65        /**
66         * Récupère toutes les informations de la requête ET ses metas
67        **/
68        public function allfetsel($query) {
69                if (!$this->sql) {
70                        return false;
71                }
72
73                $liste = array(
74                        'docs'   => array(),
75                        'facets' => array(),
76                        'meta'   => array(),
77                        'query'  => $query
78                );
79
80                try {
81                        $docs = $this->query($query);
82
83                        // les jeux de réponses sont les suivants :
84                        // 1) les documents trouvés
85                        // 2+) les FACET à la suite
86                        $reponses = array();
87                        do {
88                                if ($result = $this->sql->store_result()) {
89                                        $a = array(); while ($row = $result->fetch_assoc()) $a[] = $row;
90                                        $reponses[] = $a;
91                                        $result->free();
92                                }
93                        } while ($this->sql->more_results() AND $this->sql->next_result());
94
95                        $liste['docs']   = array_shift($reponses);
96                        $liste['facets'] = $this->parseFacets($reponses);
97
98                } catch  (\Exception $e) {
99                        echo "\n<div><tt>",htmlspecialchars($query),"</tt></div>\n";
100                        var_dump($e->getMessage());
101                        return false;
102                }
103
104                // recuperer les META
105                if ($meta = $this->query('SHOW META')) {
106                        $result = $this->sql->store_result();
107                        $a = array(); while ($row = $result->fetch_assoc()) $a[] = $row;
108                        $liste['meta']   = $this->parseMeta($a);
109                }
110
111                return array('query' => $liste);
112        }
113
114
115        /**
116         * Transforme un tableau de FACET en tableau PHP utilisable
117         *
118         * @param array $facettes
119         * @return array
120        **/
121        public function parseFacets($facettes) {
122                $facets = array();
123                if (is_array($facettes)) {
124                        foreach($facettes as $facette) {
125                                foreach ($facette as $i => $desc) {
126                                        $nb = $desc['count(*)'];
127                                        unset($desc['count(*)']);
128                                        $key  = array_keys($desc);
129                                        $key  = reset($key);
130                                        $value = array_shift($desc);
131                                        if (count($desc)) {
132                                                var_dump($desc);
133                                                die("Contenu non pris en compte dans FACET !");
134                                        }
135                                        if ($i == 0) {
136                                                $facets[$key] = array();
137                                        }
138                                        $facets[$key][$value] = $nb;
139                                }
140                        }
141                }
142                return $facets;
143        }
144
145        /**
146         * Transforme un tableau des Metas en tableau PHP élaboré
147         *
148         * Regroupe entre autres les infos de keywords
149         */
150        public function parseMeta($metas) {
151                $liste = array();
152                foreach ($metas as $meta) {
153                        $cle = $meta['Variable_name'];
154                        $val = $meta['Value'];
155                        // cles keywords[0] ...
156                        if (substr($cle,-1,1) == ']') {
157                                list($cle, $index) = explode('[', $cle);
158                                $index = rtrim($index, ']');
159
160                                if (!isset($liste[$cle])) {
161                                        $liste[$cle] = array();
162                                }
163
164                                $liste[$cle][$index] = $val;
165                        } else {
166                                $liste[$cle] = $val;
167                        }
168                }
169                if (isset($liste['keyword'])) {
170                        $liste['keywords'] = array();
171                        foreach ($liste['keyword'] as $index => $key) {
172                                $liste['keywords'][$key] = array(
173                                        'keyword' => $key,
174                                        'docs' => $liste['docs'][$index],
175                                        'hits' => $liste['hits'][$index],
176                                );
177                        }
178                        unset($liste['keyword'], $liste['docs'], $liste['hits']);
179                }
180                return $liste;
181        }
182}
183
Note: See TracBrowser for help on using the repository browser.