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

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

Il me semble qu'on peut stocker directement la limite de pagination dans l'iterateur. À vérifier.

File size: 2.0 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 $where   = array();
12        private $groupby = array();
13        private $orderby = array();
14        private $limit   = '';
15        private $facet   = array();
16
17        public function __construct() {}
18
19        public function select($select) {
20                $this->select[] = $select;
21                return $this;
22        }
23
24        public function from($from) {
25                $this->from[] = $from;
26                return $this;
27        }
28
29
30        public function where($where) {
31                $this->where[] = $where;
32                return $this;
33        }
34
35        public function orderby($orderby) {
36                $this->orderby[] = $orderby;
37                return $this;
38        }
39
40        public function groupby($groupby) {
41                $this->groupby[] = $groupby;
42                return $this;
43        }
44
45        public function limit($limit) {
46                $this->limit = $limit;
47                return $this;
48        }
49
50        public function facet($facet) {
51                $this->facet[] = $facet;
52                return $this;
53        }
54
55        function quote($value, $type='') {
56                return
57                        (is_numeric($value)) ? strval($value) :
58                                (!is_array($value) ? ("'" . addslashes($value) . "'") :
59                                        join(",", array_map(array($this, 'quote'), $value))
60                                );
61        }
62
63
64        public function get() {
65                $query = array();
66                $this->removeEmpty();
67                if ($this->select)   $query[] = 'SELECT '   . implode(', ', $this->select);
68                if ($this->from)     $query[] = 'FROM '     . implode(', ', $this->from);
69                if ($this->where)    $query[] = 'WHERE ('   . implode(') AND (', $this->where) . ')';
70                if ($this->groupby)  $query[] = 'GROUP BY ' . implode(', ', $this->groupby);
71                if ($this->orderby)  $query[] = 'ORDER BY ' . implode(', ', $this->orderby);
72                if ($this->limit)    $query[] = 'LIMIT '    . $this->limit;
73                if ($this->facet)    $query[] = 'FACET '    . implode(' FACET ', $this->facet);
74                return implode(' ', $query);
75        }
76
77
78        private function removeEmpty() {
79                foreach (array('select', 'from', 'where', 'groupby', 'orderby', 'facet') as $key) {
80                        $this->$key = array_filter($this->$key);
81                        #$this->$key = array_filter($this->key, 'strlen'); // leaves 0
82                }
83        }
84
85        public function __tostring() {
86                return $this->get();
87        }
88}
89
90
Note: See TracBrowser for help on using the repository browser.