FourLevelRelationHandler::relationJoin()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 5
c 1
b 0
f 0
nc 1
nop 4
dl 0
loc 11
rs 10
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 FourLevelRelationHandler extends AbstractFilterHandler implements WithRelationInterface
16
{
17
    /**
18
     * @throws ReflectionException
19
     */
20
    public function filterParameter($rootAlias, $rootClass, $relationsAndFieldName, $type): string
21
    {
22
        [$relationAlias, $subRelationAlias, $thirdRelationAlias, $fourthRelationAlias, $subRelationField] = $relationsAndFieldName;
23
24
        $this->validateRelationNames($relationAlias, $rootClass);
25
26
        $relationClass = $this->getRelationClass($rootClass, $relationAlias);
27
        $this->validateRelationNames($subRelationAlias, $relationClass);
28
29
        $subRelationClass = $this->getRelationClass($relationClass, $subRelationAlias);
30
        $this->validateRelationNames($thirdRelationAlias, $subRelationClass);
31
32
        $thirdRelationClass = $this->getRelationClass($subRelationClass, $thirdRelationAlias);
33
34
        $this->validateRelationNames($fourthRelationAlias, $thirdRelationClass);
35
36
        $fourthRelationClass = $this->getRelationClass($thirdRelationClass, $fourthRelationAlias);
37
        $this->validateFieldNames($subRelationField, $thirdRelationClass);
38
39
        $this->fieldType = $this->getFieldTypeFromAnnotation($subRelationField, $fourthRelationClass);
40
41
        return $this->createParameterName($fourthRelationAlias, $subRelationField);
42
    }
43
44
    public function filterWhereClause(
45
        $rootAlias,
46
        $relationsAndFieldName,
47
        $filterParameter,
48
        $strategy,
49
        $value
50
    ): string {
51
        [$relationAlias, $subRelationAlias, $thirdRelationAlias, $fourthRelationAlias, $subRelationField] = $relationsAndFieldName;
52
53
        return TypeFactory::createTypeHandler($this->fieldType)
54
            ->filterWhereClause($fourthRelationAlias, $subRelationField, $filterParameter, $strategy, $value);
55
    }
56
57
    public function relationJoin($relationJoins, $rootAlias, $rootClass, $relationsAndFieldName): array
58
    {
59
        [$relationAlias, $subRelationAlias, $thirdRelationAlias, $fourthRelationAlias] = $relationsAndFieldName;
60
61
        $relationJoins = $this->addRelationJoin($relationJoins, $rootAlias, $relationAlias);
62
63
        $relationJoins = $this->addRelationJoin($relationJoins, $relationAlias, $subRelationAlias);
64
65
        $relationJoins = $this->addRelationJoin($relationJoins, $subRelationAlias, $thirdRelationAlias);
66
67
        return $this->addRelationJoin($relationJoins, $thirdRelationAlias, $fourthRelationAlias);
68
    }
69
}
70