Passed
Push — main ( e63e41...5facba )
by Mojtaba
02:10
created

ThreeLevelRelationHandler   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 18
c 1
b 0
f 0
dl 0
loc 53
rs 10
wmc 3

3 Methods

Rating   Name   Duplication   Size   Complexity  
A relationJoin() 0 9 1
A filterParameter() 0 18 1
A filterWhereClause() 0 11 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Bugloos\QueryFilterBundle\FilterHandler;
6
7
use Bugloos\QueryFilterBundle\FilterHandler\Contract\AbstractFilterHandler;
8
use Bugloos\QueryFilterBundle\FilterHandler\Contract\WithRelationInterface;
9
use Bugloos\QueryFilterBundle\TypeHandler\Factory\TypeFactory;
10
use ReflectionException;
11
12
/**
13
 * @author Milad Ghofrani <[email protected]>
14
 */
15
class ThreeLevelRelationHandler extends AbstractFilterHandler implements WithRelationInterface
16
{
17
    /**
18
     * @param mixed $rootAlias
19
     * @param mixed $rootClass
20
     * @param mixed $relationsAndFieldName
21
     * @param mixed $type
22
     *
23
     * @throws ReflectionException
24
     */
25
    public function filterParameter($rootAlias, $rootClass, $relationsAndFieldName, $type): string
26
    {
27
        [$relationAlias, $subRelationAlias, $thirdRelationAlias, $subRelationField] = $relationsAndFieldName;
28
29
        $this->validateRelationNames($relationAlias, $rootClass);
30
31
        $relationClass = $this->getRelationClass($rootClass, $relationAlias);
32
        $this->validateRelationNames($subRelationAlias, $relationClass);
33
34
        $subRelationClass = $this->getRelationClass($relationClass, $subRelationAlias);
35
        $this->validateRelationNames($thirdRelationAlias, $subRelationClass);
36
37
        $thirdRelationClass = $this->getRelationClass($subRelationClass, $thirdRelationAlias);
38
        $this->validateFieldNames($subRelationField, $thirdRelationClass);
39
40
        $this->fieldType = $this->getFieldTypeFromAnnotation($subRelationField, $thirdRelationClass);
41
42
        return $this->createParameterName($thirdRelationAlias, $subRelationField);
43
    }
44
45
    public function filterWhereClause(
46
        $rootAlias,
47
        $relationsAndFieldName,
48
        $filterParameter,
49
        $strategy,
50
        $value
51
    ): string {
52
        [$relationAlias, $subRelationAlias, $thirdRelationAlias, $subRelationField] = $relationsAndFieldName;
53
54
        return TypeFactory::createTypeHandler($this->fieldType)
55
            ->filterWhereClause($thirdRelationAlias, $subRelationField, $filterParameter, $strategy, $value)
56
        ;
57
    }
58
59
    public function relationJoin($relationJoins, $rootAlias, $rootClass, $relationsAndFieldName): array
60
    {
61
        [$relationAlias, $subRelationAlias, $thirdRelationAlias] = $relationsAndFieldName;
62
63
        $relationJoins = $this->addRelationJoin($relationJoins, $rootAlias, $relationAlias);
64
65
        $relationJoins = $this->addRelationJoin($relationJoins, $relationAlias, $subRelationAlias);
66
67
        return $this->addRelationJoin($relationJoins, $subRelationAlias, $thirdRelationAlias);
68
    }
69
}
70