Completed
Pull Request — master (#46)
by Daniel
03:48
created

supportsSearchingContext()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
namespace KGzocha\Searcher\QueryCriteriaBuilder\Doctrine;
4
5
use Doctrine\ORM\Query\Expr\Join;
6
use Doctrine\ORM\QueryBuilder;
7
use KGzocha\Searcher\Context\Doctrine\QueryBuilderSearchingContext;
8
use KGzocha\Searcher\Context\SearchingContextInterface;
9
use KGzocha\Searcher\FilterImposer\QueryCriteriaBuilderInterface;
10
11
/**
12
 * Filter imposers that requires {@link QueryBuilderSearchingContext}
13
 * in SearchingContext can extend this class.
14
 *
15
 * @author Krzysztof Gzocha <[email protected]>
16
 * @package KGzocha\DoctrineSearcher\FilterImposer
17
 */
18
abstract class AbstractQueryBuilderQueryCriteriaBuilder implements
19
    QueryCriteriaBuilderInterface
20
{
21
    /**
22
     * @inheritDoc
23
     */
24
    public function supportsSearchingContext(
25
        SearchingContextInterface $searchingContext
26
    ) {
27
        return $searchingContext instanceof QueryBuilderSearchingContext;
28
    }
29
30
    /**
31
     * Will do JOIN only if there is no such join already.
32
     *
33
     * @param QueryBuilder $queryBuilder
34
     * @param string $join
35
     * @param string $alias
36
     *
37
     * @return QueryBuilder
38
     */
39
    protected function join(QueryBuilder $queryBuilder, $join, $alias)
40
    {
41
        list($entity) = explode('.', $join);
42
43
        $joinParts = $queryBuilder->getDQLPart('join');
44
        if (!array_key_exists($entity, $joinParts)) {
45
            return $queryBuilder->join($join, $alias);
46
        }
47
48
        return $this->filterExistingJoins(
49
            $queryBuilder,
50
            $joinParts[$entity],
51
            $alias,
52
            $join
53
        );
54
    }
55
56
    /**
57
     * @param QueryBuilder $queryBuilder
58
     * @param mixed        $joinParts
59
     * @param string       $alias
60
     * @param string       $join
61
     *
62
     * @return QueryBuilder|static
63
     */
64
    protected function filterExistingJoins(
65
        QueryBuilder $queryBuilder,
66
        $joinParts,
67
        $alias,
68
        $join
69
    ) {
70
        $existingJoin = array_filter(
71
            $joinParts,
72
            function(Join $joinObj) use ($alias, $join) {
73
                return $joinObj->getAlias() == $alias
74
                && $joinObj->getJoin() == $join;
75
            }
76
        );
77
78
        if ([] != $existingJoin) {
79
            return $queryBuilder;
80
        }
81
82
        return $queryBuilder->join($join, $alias);
83
    }
84
}
85