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

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

comme il ne peut exister qu'une seule clause MATCH(), on la traite comme une chose unique, ce qui facilite la modification a la volee de la query avec ->match('autre chose')

File size: 2.3 KB
Line 
1<?php
2
3namespace Sphinx\SphinxQL;
4
5/**
6 * Classe pour créer des requêtes de sélection Sphinx
7 */
8class Query{
9        private $select  = array();
10        private $from    = array();
11        private $match   = null;
12        private $where   = array();
13        private $groupby = array();
14        private $orderby = array();
15        private $limit   = '';
16        private $facet   = array();
17
18        public function __construct() {}
19
20        public function select($select) {
21                $this->select[] = $select;
22                return $this;
23        }
24
25        public function from($from) {
26                $this->from[] = $from;
27                return $this;
28        }
29
30
31        public function where($where) {
32                $this->where[] = $where;
33                return $this;
34        }
35
36        public function match($match) {
37                $this->match = $match;
38                return $this;
39        }
40
41        public function orderby($orderby) {
42                $this->orderby[] = $orderby;
43                return $this;
44        }
45
46        public function groupby($groupby) {
47                $this->groupby[] = $groupby;
48                return $this;
49        }
50
51        public function limit($limit) {
52                $this->limit = $limit;
53                return $this;
54        }
55
56        public function facet($facet) {
57                $this->facet[] = $facet;
58                return $this;
59        }
60
61        function quote($value, $type='') {
62                return
63                        (is_numeric($value)) ? strval($value) :
64                                (!is_array($value) ? ("'" . addslashes($value) . "'") :
65                                        join(",", array_map(array($this, 'quote'), $value))
66                                );
67        }
68
69
70        public function get() {
71                $query = array();
72                $this->removeEmpty();
73                if ($this->select)   $query[] = 'SELECT '   . implode(', ', array_unique($this->select));
74                if ($this->from)     $query[] = 'FROM '     . implode(', ', $this->from);
75
76                // WHERE et MATCH
77                $where = $this->where;
78                if ($this->match) $where[] = 'MATCH('. $this->quote($this->match).')';
79                if ($where)    $query[] = 'WHERE ('   . implode(') AND (', $where) . ')';
80
81                if ($this->groupby)  $query[] = 'GROUP BY ' . implode(', ', $this->groupby);
82                if ($this->orderby)  $query[] = 'ORDER BY ' . implode(', ', $this->orderby);
83                if ($this->limit)    $query[] = 'LIMIT '    . $this->limit;
84                if ($this->facet)    $query[] = 'FACET '    . implode(' FACET ', $this->facet);
85                return implode(' ', $query);
86        }
87
88
89        private function removeEmpty() {
90                foreach (array('select', 'from', 'where', 'groupby', 'orderby', 'facet') as $key) {
91                        $this->$key = array_filter($this->$key);
92                        #$this->$key = array_filter($this->key, 'strlen'); // leaves 0
93                }
94        }
95
96        public function __tostring() {
97                return $this->get();
98        }
99}
100
101
Note: See TracBrowser for help on using the repository browser.