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

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

Réparer l'indexation avec le passage à mysqli…

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