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

Last change on this file since 108582 was 108582, checked in by marcimat@…, 3 years ago

Petite notice de moins.

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