Completed
Push — master ( bdbef0...70c07b )
by Peter
63:38 queued 53:13
created

LogicX::getFilter()   B

Complexity

Conditions 6
Paths 9

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 8.9297
c 0
b 0
f 0
cc 6
nc 9
nop 2
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
class LogicX implements Specification
25
{
26
    const AND_X = 'andX';
27
28
    const OR_X = 'orX';
29
30
    /**
31
     * @var Filter[]|QueryModifier[]
32
     */
33
    private $children;
34
35
    /**
36
     * @var string
37
     */
38
    private $expression;
39
40
    /**
41
     * Take two or more Expression as parameters.
42
     *
43
     * @param string                   $expression
44
     * @param Filter[]|QueryModifier[] $children
45
     */
46
    public function __construct($expression, array $children = [])
47
    {
48
        $this->expression = $expression;
49
        $this->children = $children;
0 ignored issues
show
Documentation Bug introduced by
It seems like $children of type array<integer,object<Hap...n\Query\QueryModifier>> is incompatible with the declared type array<integer,object<Hap...n\Query\QueryModifier>> of property $children.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
50
    }
51
52
    /**
53
     * @param QueryBuilder $qb
54
     * @param string       $dqlAlias
55
     *
56
     * @return string
57
     */
58
    public function getFilter(QueryBuilder $qb, $dqlAlias)
59
    {
60
        $children = [];
61
        foreach ($this->children as $spec) {
62
            if ($spec instanceof Filter && $filter = $spec->getFilter($qb, $dqlAlias)) {
63
                $children[] = $filter;
64
            }
65
        }
66
67
        if (!$children) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $children of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

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.

Loading history...
68
            return '';
69
        }
70
71
        $expression = [$qb->expr(), $this->expression];
72
73
        if (!is_callable($expression)) {
74
            throw new \InvalidArgumentException(
75
                sprintf('Undefined "%s" method in "%s" class.', $this->expression, get_class($qb->expr()))
76
            );
77
        }
78
79
        return call_user_func_array($expression, $children);
80
    }
81
82
    /**
83
     * @param QueryBuilder $query
84
     * @param string       $dqlAlias
85
     */
86
    public function modify(QueryBuilder $query, $dqlAlias)
87
    {
88
        foreach ($this->children as $child) {
89
            if ($child instanceof QueryModifier) {
90
                $child->modify($query, $dqlAlias);
91
            }
92
        }
93
    }
94
95
    /**
96
     * Add another child to this logic tree.
97
     *
98
     * @param Filter|QueryModifier $child
99
     */
100
    protected function append($child)
101
    {
102
        $this->children[] = $child;
103
    }
104
}
105