source: pro-violet-viettel/sourcecode/application/libraries/Doctrine/ORM/Query/Expr.php @ 345

Last change on this file since 345 was 345, checked in by quyenla, 11 years ago

collaborator page

File size: 17.7 KB
Line 
1<?php
2/*
3 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14 *
15 * This software consists of voluntary contributions made by many individuals
16 * and is licensed under the LGPL. For more information, see
17 * <http://www.doctrine-project.org>.
18 */
19
20namespace Doctrine\ORM\Query;
21
22/**
23 * This class is used to generate DQL expressions via a set of PHP static functions
24 *
25 * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
26 * @link    www.doctrine-project.org
27 * @since   2.0
28 * @author  Guilherme Blanco <guilhermeblanco@hotmail.com>
29 * @author  Jonathan Wage <jonwage@gmail.com>
30 * @author  Roman Borschel <roman@code-factory.org>
31 * @author  Benjamin Eberlei <kontakt@beberlei.de>
32 * @todo Rename: ExpressionBuilder
33 */
34class Expr
35{
36    /**
37     * Creates a conjunction of the given boolean expressions.
38     *
39     * Example:
40     *
41     *     [php]
42     *     // (u.type = ?1) AND (u.role = ?2)
43     *     $expr->andX($expr->eq('u.type', ':1'), $expr->eq('u.role', ':2'));
44     *
45     * @param \Doctrine\ORM\Query\Expr\Comparison |
46     *          \Doctrine\ORM\Query\Expr\Func |
47     *          \Doctrine\ORM\Query\Expr\Orx
48    *               $x Optional clause. Defaults = null, but requires at least one defined when converting to string.
49     * @return Expr\Andx
50     */
51    public function andX($x = null)
52    {
53        return new Expr\Andx(func_get_args());
54    }
55
56    /**
57     * Creates a disjunction of the given boolean expressions.
58     *
59     * Example:
60     *
61     *     [php]
62     *     // (u.type = ?1) OR (u.role = ?2)
63     *     $q->where($q->expr()->orX('u.type = ?1', 'u.role = ?2'));
64     *
65     * @param mixed $x Optional clause. Defaults = null, but requires
66     *                 at least one defined when converting to string.
67     * @return Expr\Orx
68     */
69    public function orX($x = null)
70    {
71        return new Expr\Orx(func_get_args());
72    }
73
74    /**
75     * Creates an ASCending order expression.
76     *
77     * @param $sort
78     * @return Expr\OrderBy
79     */
80    public function asc($expr)
81    {
82        return new Expr\OrderBy($expr, 'ASC');
83    }
84
85    /**
86     * Creates a DESCending order expression.
87     *
88     * @param $sort
89     * @return Expr\OrderBy
90     */
91    public function desc($expr)
92    {
93        return new Expr\OrderBy($expr, 'DESC');
94    }
95
96    /**
97     * Creates an equality comparison expression with the given arguments.
98     *
99     * First argument is considered the left expression and the second is the right expression.
100     * When converted to string, it will generated a <left expr> = <right expr>. Example:
101     *
102     *     [php]
103     *     // u.id = ?1
104     *     $expr->eq('u.id', '?1');
105     *
106     * @param mixed $x Left expression
107     * @param mixed $y Right expression
108     * @return Expr\Comparison
109     */
110    public function eq($x, $y)
111    {
112        return new Expr\Comparison($x, Expr\Comparison::EQ, $y);
113    }
114
115    /**
116     * Creates an instance of Expr\Comparison, with the given arguments.
117     * First argument is considered the left expression and the second is the right expression.
118     * When converted to string, it will generated a <left expr> <> <right expr>. Example:
119     *
120     *     [php]
121     *     // u.id <> ?1
122     *     $q->where($q->expr()->neq('u.id', '?1'));
123     *
124     * @param mixed $x Left expression
125     * @param mixed $y Right expression
126     * @return Expr\Comparison
127     */
128    public function neq($x, $y)
129    {
130        return new Expr\Comparison($x, Expr\Comparison::NEQ, $y);
131    }
132
133    /**
134     * Creates an instance of Expr\Comparison, with the given arguments.
135     * First argument is considered the left expression and the second is the right expression.
136     * When converted to string, it will generated a <left expr> < <right expr>. Example:
137     *
138     *     [php]
139     *     // u.id < ?1
140     *     $q->where($q->expr()->lt('u.id', '?1'));
141     *
142     * @param mixed $x Left expression
143     * @param mixed $y Right expression
144     * @return Expr\Comparison
145     */
146    public function lt($x, $y)
147    {
148        return new Expr\Comparison($x, Expr\Comparison::LT, $y);
149    }
150
151    /**
152     * Creates an instance of Expr\Comparison, with the given arguments.
153     * First argument is considered the left expression and the second is the right expression.
154     * When converted to string, it will generated a <left expr> <= <right expr>. Example:
155     *
156     *     [php]
157     *     // u.id <= ?1
158     *     $q->where($q->expr()->lte('u.id', '?1'));
159     *
160     * @param mixed $x Left expression
161     * @param mixed $y Right expression
162     * @return Expr\Comparison
163     */
164    public function lte($x, $y)
165    {
166        return new Expr\Comparison($x, Expr\Comparison::LTE, $y);
167    }
168
169    /**
170     * Creates an instance of Expr\Comparison, with the given arguments.
171     * First argument is considered the left expression and the second is the right expression.
172     * When converted to string, it will generated a <left expr> > <right expr>. Example:
173     *
174     *     [php]
175     *     // u.id > ?1
176     *     $q->where($q->expr()->gt('u.id', '?1'));
177     *
178     * @param mixed $x Left expression
179     * @param mixed $y Right expression
180     * @return Expr\Comparison
181     */
182    public function gt($x, $y)
183    {
184        return new Expr\Comparison($x, Expr\Comparison::GT, $y);
185    }
186
187    /**
188     * Creates an instance of Expr\Comparison, with the given arguments.
189     * First argument is considered the left expression and the second is the right expression.
190     * When converted to string, it will generated a <left expr> >= <right expr>. Example:
191     *
192     *     [php]
193     *     // u.id >= ?1
194     *     $q->where($q->expr()->gte('u.id', '?1'));
195     *
196     * @param mixed $x Left expression
197     * @param mixed $y Right expression
198     * @return Expr\Comparison
199     */
200    public function gte($x, $y)
201    {
202        return new Expr\Comparison($x, Expr\Comparison::GTE, $y);
203    }
204
205    /**
206     * Creates an instance of AVG() function, with the given argument.
207     *
208     * @param mixed $x Argument to be used in AVG() function.
209     * @return Expr\Func
210     */
211    public function avg($x)
212    {
213        return new Expr\Func('AVG', array($x));
214    }
215
216    /**
217     * Creates an instance of MAX() function, with the given argument.
218     *
219     * @param mixed $x Argument to be used in MAX() function.
220     * @return Expr\Func
221     */
222    public function max($x)
223    {
224        return new Expr\Func('MAX', array($x));
225    }
226
227    /**
228     * Creates an instance of MIN() function, with the given argument.
229     *
230     * @param mixed $x Argument to be used in MIN() function.
231     * @return Expr\Func
232     */
233    public function min($x)
234    {
235        return new Expr\Func('MIN', array($x));
236    }
237
238    /**
239     * Creates an instance of COUNT() function, with the given argument.
240     *
241     * @param mixed $x Argument to be used in COUNT() function.
242     * @return Expr\Func
243     */
244    public function count($x)
245    {
246        return new Expr\Func('COUNT', array($x));
247    }
248
249    /**
250     * Creates an instance of COUNT(DISTINCT) function, with the given argument.
251     *
252     * @param mixed $x Argument to be used in COUNT(DISTINCT) function.
253     * @return string
254     */
255    public function countDistinct($x)
256    {
257        return 'COUNT(DISTINCT ' . implode(', ', func_get_args()) . ')';
258    }
259
260    /**
261     * Creates an instance of EXISTS() function, with the given DQL Subquery.
262     *
263     * @param mixed $subquery DQL Subquery to be used in EXISTS() function.
264     * @return Expr\Func
265     */
266    public function exists($subquery)
267    {
268        return new Expr\Func('EXISTS', array($subquery));
269    }
270
271    /**
272     * Creates an instance of ALL() function, with the given DQL Subquery.
273     *
274     * @param mixed $subquery DQL Subquery to be used in ALL() function.
275     * @return Expr\Func
276     */
277    public function all($subquery)
278    {
279        return new Expr\Func('ALL', array($subquery));
280    }
281
282    /**
283     * Creates a SOME() function expression with the given DQL subquery.
284     *
285     * @param mixed $subquery DQL Subquery to be used in SOME() function.
286     * @return Expr\Func
287     */
288    public function some($subquery)
289    {
290        return new Expr\Func('SOME', array($subquery));
291    }
292
293    /**
294     * Creates an ANY() function expression with the given DQL subquery.
295     *
296     * @param mixed $subquery DQL Subquery to be used in ANY() function.
297     * @return Expr\Func
298     */
299    public function any($subquery)
300    {
301        return new Expr\Func('ANY', array($subquery));
302    }
303
304    /**
305     * Creates a negation expression of the given restriction.
306     *
307     * @param mixed $restriction Restriction to be used in NOT() function.
308     * @return Expr\Func
309     */
310    public function not($restriction)
311    {
312        return new Expr\Func('NOT', array($restriction));
313    }
314
315    /**
316     * Creates an ABS() function expression with the given argument.
317     *
318     * @param mixed $x Argument to be used in ABS() function.
319     * @return Expr\Func
320     */
321    public function abs($x)
322    {
323        return new Expr\Func('ABS', array($x));
324    }
325
326    /**
327     * Creates a product mathematical expression with the given arguments.
328     *
329     * First argument is considered the left expression and the second is the right expression.
330     * When converted to string, it will generated a <left expr> * <right expr>. Example:
331     *
332     *     [php]
333     *     // u.salary * u.percentAnualSalaryIncrease
334     *     $q->expr()->prod('u.salary', 'u.percentAnualSalaryIncrease')
335     *
336     * @param mixed $x Left expression
337     * @param mixed $y Right expression
338     * @return Expr\Math
339     */
340    public function prod($x, $y)
341    {
342        return new Expr\Math($x, '*', $y);
343    }
344
345    /**
346     * Creates a difference mathematical expression with the given arguments.
347     * First argument is considered the left expression and the second is the right expression.
348     * When converted to string, it will generated a <left expr> - <right expr>. Example:
349     *
350     *     [php]
351     *     // u.monthlySubscriptionCount - 1
352     *     $q->expr()->diff('u.monthlySubscriptionCount', '1')
353     *
354     * @param mixed $x Left expression
355     * @param mixed $y Right expression
356     * @return Expr\Math
357     */
358    public function diff($x, $y)
359    {
360        return new Expr\Math($x, '-', $y);
361    }
362
363    /**
364     * Creates a sum mathematical expression with the given arguments.
365     * First argument is considered the left expression and the second is the right expression.
366     * When converted to string, it will generated a <left expr> + <right expr>. Example:
367     *
368     *     [php]
369     *     // u.numChildren + 1
370     *     $q->expr()->diff('u.numChildren', '1')
371     *
372     * @param mixed $x Left expression
373     * @param mixed $y Right expression
374     * @return Expr\Math
375     */
376    public function sum($x, $y)
377    {
378        return new Expr\Math($x, '+', $y);
379    }
380
381    /**
382     * Creates a quotient mathematical expression with the given arguments.
383     * First argument is considered the left expression and the second is the right expression.
384     * When converted to string, it will generated a <left expr> / <right expr>. Example:
385     *
386     *     [php]
387     *     // u.total / u.period
388     *     $expr->quot('u.total', 'u.period')
389     *
390     * @param mixed $x Left expression
391     * @param mixed $y Right expression
392     * @return Expr\Math
393     */
394    public function quot($x, $y)
395    {
396        return new Expr\Math($x, '/', $y);
397    }
398
399    /**
400     * Creates a SQRT() function expression with the given argument.
401     *
402     * @param mixed $x Argument to be used in SQRT() function.
403     * @return Expr\Func
404     */
405    public function sqrt($x)
406    {
407        return new Expr\Func('SQRT', array($x));
408    }
409
410    /**
411     * Creates an IN() expression with the given arguments.
412     *
413     * @param string $x Field in string format to be restricted by IN() function
414     * @param mixed $y Argument to be used in IN() function.
415     * @return Expr\Func
416     */
417    public function in($x, $y)
418    {
419        if (is_array($y)) {
420            foreach ($y as &$literal) {
421                if ( ! ($literal instanceof Expr\Literal)) {
422                    $literal = $this->_quoteLiteral($literal);
423                }
424            }
425        }
426        return new Expr\Func($x . ' IN', (array) $y);
427    }
428
429    /**
430     * Creates a NOT IN() expression with the given arguments.
431     *
432     * @param string $x Field in string format to be restricted by NOT IN() function
433     * @param mixed $y Argument to be used in NOT IN() function.
434     * @return Expr\Func
435     */
436    public function notIn($x, $y)
437    {
438        if (is_array($y)) {
439            foreach ($y as &$literal) {
440                if ( ! ($literal instanceof Expr\Literal)) {
441                    $literal = $this->_quoteLiteral($literal);
442                }
443            }
444        }
445        return new Expr\Func($x . ' NOT IN', (array) $y);
446    }
447
448    /**
449     * Creates an IS NULL expression with the given arguments.
450     *
451     * @param string $x Field in string format to be restricted by IS NULL
452     * @return string
453     */
454    public function isNull($x)
455    {
456        return $x . ' IS NULL';
457    }
458
459    /**
460     * Creates an IS NOT NULL expression with the given arguments.
461     *
462     * @param string $x Field in string format to be restricted by IS NOT NULL
463     * @return string
464     */
465    public function isNotNull($x)
466    {
467        return $x . ' IS NOT NULL';
468    }
469
470    /**
471     * Creates a LIKE() comparison expression with the given arguments.
472     *
473     * @param string $x Field in string format to be inspected by LIKE() comparison.
474     * @param mixed $y Argument to be used in LIKE() comparison.
475     * @return Expr\Comparison
476     */
477    public function like($x, $y)
478    {
479        return new Expr\Comparison($x, 'LIKE', $y);
480    }
481
482    /**
483     * Creates a CONCAT() function expression with the given arguments.
484     *
485     * @param mixed $x First argument to be used in CONCAT() function.
486     * @param mixed $x Second argument to be used in CONCAT() function.
487     * @return Expr\Func
488     */
489    public function concat($x, $y)
490    {
491        return new Expr\Func('CONCAT', array($x, $y));
492    }
493
494    /**
495     * Creates a SUBSTRING() function expression with the given arguments.
496     *
497     * @param mixed $x Argument to be used as string to be cropped by SUBSTRING() function.
498     * @param integer $from Initial offset to start cropping string. May accept negative values.
499     * @param integer $len Length of crop. May accept negative values.
500     * @return Expr\Func
501     */
502    public function substring($x, $from, $len = null)
503    {
504        $args = array($x, $from);
505        if (null !== $len) {
506            $args[] = $len;
507        }
508        return new Expr\Func('SUBSTRING', $args);
509    }
510
511    /**
512     * Creates a LOWER() function expression with the given argument.
513     *
514     * @param mixed $x Argument to be used in LOWER() function.
515     * @return Expr\Func A LOWER function expression.
516     */
517    public function lower($x)
518    {
519        return new Expr\Func('LOWER', array($x));
520    }
521
522    /**
523     * Creates an UPPER() function expression with the given argument.
524     *
525     * @param mixed $x Argument to be used in UPPER() function.
526     * @return Expr\Func An UPPER function expression.
527     */
528    public function upper($x)
529    {
530        return new Expr\Func('UPPER', array($x));
531    }
532
533    /**
534     * Creates a LENGTH() function expression with the given argument.
535     *
536     * @param mixed $x Argument to be used as argument of LENGTH() function.
537     * @return Expr\Func A LENGTH function expression.
538     */
539    public function length($x)
540    {
541        return new Expr\Func('LENGTH', array($x));
542    }
543
544    /**
545     * Creates a literal expression of the given argument.
546     *
547     * @param mixed $literal Argument to be converted to literal.
548     * @return Expr\Literal
549     */
550    public function literal($literal)
551    {
552        return new Expr\Literal($this->_quoteLiteral($literal));
553    }
554
555    /**
556     * Quotes a literal value, if necessary, according to the DQL syntax.
557     *
558     * @param mixed $literal The literal value.
559     * @return string
560     */
561    private function _quoteLiteral($literal)
562    {
563        if (is_numeric($literal) && !is_string($literal)) {
564            return (string) $literal;
565        } else if (is_bool($literal)) {
566            return $literal ? "true" : "false";
567        } else {
568            return "'" . str_replace("'", "''", $literal) . "'";
569        }
570    }
571
572    /**
573     * Creates an instance of BETWEEN() function, with the given argument.
574     *
575     * @param mixed $val Valued to be inspected by range values.
576     * @param integer $x Starting range value to be used in BETWEEN() function.
577     * @param integer $y End point value to be used in BETWEEN() function.
578     * @return Expr\Func A BETWEEN expression.
579     */
580    public function between($val, $x, $y)
581    {
582        return $val . ' BETWEEN ' . $x . ' AND ' . $y;
583    }
584
585    /**
586     * Creates an instance of TRIM() function, with the given argument.
587     *
588     * @param mixed $x Argument to be used as argument of TRIM() function.
589     * @return Expr\Func a TRIM expression.
590     */
591    public function trim($x)
592    {
593        return new Expr\Func('TRIM', $x);
594    }
595}
Note: See TracBrowser for help on using the repository browser.