1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* This file is part of the Happyr Doctrine Specification package. |
5
|
|
|
* |
6
|
|
|
* (c) Tobias Nyholm <[email protected]> |
7
|
|
|
* Kacper Gunia <[email protected]> |
8
|
|
|
* Peter Gribanov <[email protected]> |
9
|
|
|
* |
10
|
|
|
* For the full copyright and license information, please view the LICENSE |
11
|
|
|
* file that was distributed with this source code. |
12
|
|
|
*/ |
13
|
|
|
|
14
|
|
|
namespace Happyr\DoctrineSpecification\Logic; |
15
|
|
|
|
16
|
|
|
use Doctrine\ORM\QueryBuilder; |
17
|
|
|
use Happyr\DoctrineSpecification\Filter\Filter; |
18
|
|
|
use Happyr\DoctrineSpecification\Query\QueryModifier; |
19
|
|
|
use Happyr\DoctrineSpecification\Specification\Specification; |
20
|
|
|
|
21
|
|
|
/** |
22
|
|
|
* This class should be used when you combine two or more Expressions. |
23
|
|
|
* |
24
|
|
|
* @deprecated This class will be marked as abstract in 2.0. |
25
|
|
|
*/ |
26
|
|
|
class LogicX implements Specification |
27
|
|
|
{ |
28
|
|
|
const AND_X = 'andX'; |
29
|
|
|
|
30
|
|
|
const OR_X = 'orX'; |
31
|
|
|
|
32
|
|
|
/** |
33
|
|
|
* @var Filter[]|QueryModifier[] |
34
|
|
|
*/ |
35
|
|
|
private $children; |
36
|
|
|
|
37
|
|
|
/** |
38
|
|
|
* @var string |
39
|
|
|
*/ |
40
|
|
|
private $expression; |
41
|
|
|
|
42
|
|
|
/** |
43
|
|
|
* Take two or more Expression as parameters. |
44
|
|
|
* |
45
|
|
|
* @param string $expression |
46
|
|
|
* @param Filter[]|QueryModifier[] $children |
47
|
|
|
*/ |
48
|
|
|
public function __construct($expression, array $children = []) |
49
|
|
|
{ |
50
|
|
|
$this->expression = $expression; |
51
|
|
|
$this->children = $children; |
52
|
|
|
} |
53
|
|
|
|
54
|
|
|
/** |
55
|
|
|
* @param QueryBuilder $qb |
56
|
|
|
* @param string $dqlAlias |
57
|
|
|
* |
58
|
|
|
* @return string |
59
|
|
|
*/ |
60
|
|
|
public function getFilter(QueryBuilder $qb, $dqlAlias) |
61
|
|
|
{ |
62
|
|
|
$children = []; |
63
|
|
|
foreach ($this->children as $spec) { |
64
|
|
|
if ($spec instanceof Filter && $filter = $spec->getFilter($qb, $dqlAlias)) { |
65
|
|
|
$children[] = $filter; |
66
|
|
|
} |
67
|
|
|
} |
68
|
|
|
|
69
|
|
|
if (!$children) { |
|
|
|
|
70
|
|
|
return ''; |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
$expression = [$qb->expr(), $this->expression]; |
74
|
|
|
|
75
|
|
|
if (!is_callable($expression)) { |
76
|
|
|
throw new \InvalidArgumentException( |
77
|
|
|
sprintf('Undefined "%s" method in "%s" class.', $this->expression, get_class($qb->expr())) |
78
|
|
|
); |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
return (string) call_user_func_array($expression, $children); |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
/** |
85
|
|
|
* @param QueryBuilder $query |
86
|
|
|
* @param string $dqlAlias |
87
|
|
|
*/ |
88
|
|
|
public function modify(QueryBuilder $query, $dqlAlias) |
89
|
|
|
{ |
90
|
|
|
foreach ($this->children as $child) { |
91
|
|
|
if ($child instanceof QueryModifier) { |
92
|
|
|
$child->modify($query, $dqlAlias); |
93
|
|
|
} |
94
|
|
|
} |
95
|
|
|
} |
96
|
|
|
|
97
|
|
|
/** |
98
|
|
|
* Add another child to this logic tree. |
99
|
|
|
* |
100
|
|
|
* @param Filter|QueryModifier $child |
101
|
|
|
*/ |
102
|
|
|
protected function append($child) |
103
|
|
|
{ |
104
|
|
|
$this->children[] = $child; |
105
|
|
|
} |
106
|
|
|
} |
107
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.