LogicX::append()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
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;
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...
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) {
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...
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