Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@0
|
3 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
Chris@0
|
4 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
Chris@0
|
5 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
Chris@0
|
6 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
Chris@0
|
7 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
Chris@0
|
8 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
Chris@0
|
9 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
Chris@0
|
10 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
Chris@0
|
11 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
Chris@0
|
12 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
Chris@0
|
13 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
Chris@0
|
14 *
|
Chris@0
|
15 * This software consists of voluntary contributions made by many individuals
|
Chris@0
|
16 * and is licensed under the MIT license. For more information, see
|
Chris@0
|
17 * <http://www.doctrine-project.org>.
|
Chris@0
|
18 */
|
Chris@0
|
19
|
Chris@0
|
20 namespace Doctrine\Common\Collections;
|
Chris@0
|
21
|
Chris@0
|
22 use Doctrine\Common\Collections\Expr\Expression;
|
Chris@0
|
23 use Doctrine\Common\Collections\Expr\CompositeExpression;
|
Chris@0
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * Criteria for filtering Selectable collections.
|
Chris@0
|
27 *
|
Chris@0
|
28 * @author Benjamin Eberlei <kontakt@beberlei.de>
|
Chris@0
|
29 * @since 2.3
|
Chris@0
|
30 */
|
Chris@0
|
31 class Criteria
|
Chris@0
|
32 {
|
Chris@0
|
33 /**
|
Chris@0
|
34 * @var string
|
Chris@0
|
35 */
|
Chris@0
|
36 const ASC = 'ASC';
|
Chris@0
|
37
|
Chris@0
|
38 /**
|
Chris@0
|
39 * @var string
|
Chris@0
|
40 */
|
Chris@0
|
41 const DESC = 'DESC';
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@0
|
44 * @var \Doctrine\Common\Collections\ExpressionBuilder|null
|
Chris@0
|
45 */
|
Chris@0
|
46 private static $expressionBuilder;
|
Chris@0
|
47
|
Chris@0
|
48 /**
|
Chris@0
|
49 * @var \Doctrine\Common\Collections\Expr\Expression|null
|
Chris@0
|
50 */
|
Chris@0
|
51 private $expression;
|
Chris@0
|
52
|
Chris@0
|
53 /**
|
Chris@0
|
54 * @var string[]
|
Chris@0
|
55 */
|
Chris@0
|
56 private $orderings = array();
|
Chris@0
|
57
|
Chris@0
|
58 /**
|
Chris@0
|
59 * @var int|null
|
Chris@0
|
60 */
|
Chris@0
|
61 private $firstResult;
|
Chris@0
|
62
|
Chris@0
|
63 /**
|
Chris@0
|
64 * @var int|null
|
Chris@0
|
65 */
|
Chris@0
|
66 private $maxResults;
|
Chris@0
|
67
|
Chris@0
|
68 /**
|
Chris@0
|
69 * Creates an instance of the class.
|
Chris@0
|
70 *
|
Chris@0
|
71 * @return Criteria
|
Chris@0
|
72 */
|
Chris@0
|
73 public static function create()
|
Chris@0
|
74 {
|
Chris@0
|
75 return new static();
|
Chris@0
|
76 }
|
Chris@0
|
77
|
Chris@0
|
78 /**
|
Chris@0
|
79 * Returns the expression builder.
|
Chris@0
|
80 *
|
Chris@0
|
81 * @return \Doctrine\Common\Collections\ExpressionBuilder
|
Chris@0
|
82 */
|
Chris@0
|
83 public static function expr()
|
Chris@0
|
84 {
|
Chris@0
|
85 if (self::$expressionBuilder === null) {
|
Chris@0
|
86 self::$expressionBuilder = new ExpressionBuilder();
|
Chris@0
|
87 }
|
Chris@0
|
88
|
Chris@0
|
89 return self::$expressionBuilder;
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 /**
|
Chris@0
|
93 * Construct a new Criteria.
|
Chris@0
|
94 *
|
Chris@0
|
95 * @param Expression $expression
|
Chris@0
|
96 * @param string[]|null $orderings
|
Chris@0
|
97 * @param int|null $firstResult
|
Chris@0
|
98 * @param int|null $maxResults
|
Chris@0
|
99 */
|
Chris@0
|
100 public function __construct(Expression $expression = null, array $orderings = null, $firstResult = null, $maxResults = null)
|
Chris@0
|
101 {
|
Chris@0
|
102 $this->expression = $expression;
|
Chris@0
|
103
|
Chris@0
|
104 $this->setFirstResult($firstResult);
|
Chris@0
|
105 $this->setMaxResults($maxResults);
|
Chris@0
|
106
|
Chris@0
|
107 if (null !== $orderings) {
|
Chris@0
|
108 $this->orderBy($orderings);
|
Chris@0
|
109 }
|
Chris@0
|
110 }
|
Chris@0
|
111
|
Chris@0
|
112 /**
|
Chris@0
|
113 * Sets the where expression to evaluate when this Criteria is searched for.
|
Chris@0
|
114 *
|
Chris@0
|
115 * @param Expression $expression
|
Chris@0
|
116 *
|
Chris@0
|
117 * @return Criteria
|
Chris@0
|
118 */
|
Chris@0
|
119 public function where(Expression $expression)
|
Chris@0
|
120 {
|
Chris@0
|
121 $this->expression = $expression;
|
Chris@0
|
122
|
Chris@0
|
123 return $this;
|
Chris@0
|
124 }
|
Chris@0
|
125
|
Chris@0
|
126 /**
|
Chris@0
|
127 * Appends the where expression to evaluate when this Criteria is searched for
|
Chris@0
|
128 * using an AND with previous expression.
|
Chris@0
|
129 *
|
Chris@0
|
130 * @param Expression $expression
|
Chris@0
|
131 *
|
Chris@0
|
132 * @return Criteria
|
Chris@0
|
133 */
|
Chris@0
|
134 public function andWhere(Expression $expression)
|
Chris@0
|
135 {
|
Chris@0
|
136 if ($this->expression === null) {
|
Chris@0
|
137 return $this->where($expression);
|
Chris@0
|
138 }
|
Chris@0
|
139
|
Chris@0
|
140 $this->expression = new CompositeExpression(CompositeExpression::TYPE_AND, array(
|
Chris@0
|
141 $this->expression, $expression
|
Chris@0
|
142 ));
|
Chris@0
|
143
|
Chris@0
|
144 return $this;
|
Chris@0
|
145 }
|
Chris@0
|
146
|
Chris@0
|
147 /**
|
Chris@0
|
148 * Appends the where expression to evaluate when this Criteria is searched for
|
Chris@0
|
149 * using an OR with previous expression.
|
Chris@0
|
150 *
|
Chris@0
|
151 * @param Expression $expression
|
Chris@0
|
152 *
|
Chris@0
|
153 * @return Criteria
|
Chris@0
|
154 */
|
Chris@0
|
155 public function orWhere(Expression $expression)
|
Chris@0
|
156 {
|
Chris@0
|
157 if ($this->expression === null) {
|
Chris@0
|
158 return $this->where($expression);
|
Chris@0
|
159 }
|
Chris@0
|
160
|
Chris@0
|
161 $this->expression = new CompositeExpression(CompositeExpression::TYPE_OR, array(
|
Chris@0
|
162 $this->expression, $expression
|
Chris@0
|
163 ));
|
Chris@0
|
164
|
Chris@0
|
165 return $this;
|
Chris@0
|
166 }
|
Chris@0
|
167
|
Chris@0
|
168 /**
|
Chris@0
|
169 * Gets the expression attached to this Criteria.
|
Chris@0
|
170 *
|
Chris@0
|
171 * @return Expression|null
|
Chris@0
|
172 */
|
Chris@0
|
173 public function getWhereExpression()
|
Chris@0
|
174 {
|
Chris@0
|
175 return $this->expression;
|
Chris@0
|
176 }
|
Chris@0
|
177
|
Chris@0
|
178 /**
|
Chris@0
|
179 * Gets the current orderings of this Criteria.
|
Chris@0
|
180 *
|
Chris@0
|
181 * @return string[]
|
Chris@0
|
182 */
|
Chris@0
|
183 public function getOrderings()
|
Chris@0
|
184 {
|
Chris@0
|
185 return $this->orderings;
|
Chris@0
|
186 }
|
Chris@0
|
187
|
Chris@0
|
188 /**
|
Chris@0
|
189 * Sets the ordering of the result of this Criteria.
|
Chris@0
|
190 *
|
Chris@0
|
191 * Keys are field and values are the order, being either ASC or DESC.
|
Chris@0
|
192 *
|
Chris@0
|
193 * @see Criteria::ASC
|
Chris@0
|
194 * @see Criteria::DESC
|
Chris@0
|
195 *
|
Chris@0
|
196 * @param string[] $orderings
|
Chris@0
|
197 *
|
Chris@0
|
198 * @return Criteria
|
Chris@0
|
199 */
|
Chris@0
|
200 public function orderBy(array $orderings)
|
Chris@0
|
201 {
|
Chris@0
|
202 $this->orderings = array_map(
|
Chris@0
|
203 function ($ordering) {
|
Chris@0
|
204 return strtoupper($ordering) === Criteria::ASC ? Criteria::ASC : Criteria::DESC;
|
Chris@0
|
205 },
|
Chris@0
|
206 $orderings
|
Chris@0
|
207 );
|
Chris@0
|
208
|
Chris@0
|
209 return $this;
|
Chris@0
|
210 }
|
Chris@0
|
211
|
Chris@0
|
212 /**
|
Chris@0
|
213 * Gets the current first result option of this Criteria.
|
Chris@0
|
214 *
|
Chris@0
|
215 * @return int|null
|
Chris@0
|
216 */
|
Chris@0
|
217 public function getFirstResult()
|
Chris@0
|
218 {
|
Chris@0
|
219 return $this->firstResult;
|
Chris@0
|
220 }
|
Chris@0
|
221
|
Chris@0
|
222 /**
|
Chris@0
|
223 * Set the number of first result that this Criteria should return.
|
Chris@0
|
224 *
|
Chris@0
|
225 * @param int|null $firstResult The value to set.
|
Chris@0
|
226 *
|
Chris@0
|
227 * @return Criteria
|
Chris@0
|
228 */
|
Chris@0
|
229 public function setFirstResult($firstResult)
|
Chris@0
|
230 {
|
Chris@0
|
231 $this->firstResult = null === $firstResult ? null : (int) $firstResult;
|
Chris@0
|
232
|
Chris@0
|
233 return $this;
|
Chris@0
|
234 }
|
Chris@0
|
235
|
Chris@0
|
236 /**
|
Chris@0
|
237 * Gets maxResults.
|
Chris@0
|
238 *
|
Chris@0
|
239 * @return int|null
|
Chris@0
|
240 */
|
Chris@0
|
241 public function getMaxResults()
|
Chris@0
|
242 {
|
Chris@0
|
243 return $this->maxResults;
|
Chris@0
|
244 }
|
Chris@0
|
245
|
Chris@0
|
246 /**
|
Chris@0
|
247 * Sets maxResults.
|
Chris@0
|
248 *
|
Chris@0
|
249 * @param int|null $maxResults The value to set.
|
Chris@0
|
250 *
|
Chris@0
|
251 * @return Criteria
|
Chris@0
|
252 */
|
Chris@0
|
253 public function setMaxResults($maxResults)
|
Chris@0
|
254 {
|
Chris@0
|
255 $this->maxResults = null === $maxResults ? null : (int) $maxResults;
|
Chris@0
|
256
|
Chris@0
|
257 return $this;
|
Chris@0
|
258 }
|
Chris@0
|
259 }
|