Completed
Push — master ( aa2dbb...5f8e8d )
by
unknown
02:19
created

SearchTextFieldHandler::findFieldByName()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 10
rs 9.4285
cc 3
eloc 5
nc 3
nop 2
1
<?php
2
namespace Netdudes\DataSourceryBundle\Query;
3
4
use Netdudes\DataSourceryBundle\DataSource\Configuration\Field;
5
use Netdudes\DataSourceryBundle\DataType\SearchTextDataType;
6
7
class SearchTextFieldHandler
8
{
9
    /**
10
     * @var SearchTextFilterConditionTransformer
11
     */
12
    private $subTransformer;
13
14
    /**
15
     * @param SearchTextFilterConditionTransformer $subTransformer
16
     */
17
    public function __construct(SearchTextFilterConditionTransformer $subTransformer)
18
    {
19
        $this->subTransformer = $subTransformer;
20
    }
21
22
    /**
23
     * @param Filter  $filter
24
     * @param Field[] $dataSourceFields
25
     *
26
     * @return Filter
27
     */
28
    public function handle(Filter $filter, array $dataSourceFields)
29
    {
30
        foreach ($filter as $index => $subFilterOrFilterCondition) {
31
            if ($subFilterOrFilterCondition instanceof Filter) {
32
                $this->handle($subFilterOrFilterCondition, $dataSourceFields);
33
                continue;
34
            }
35
36
            if ($subFilterOrFilterCondition instanceof FilterCondition) {
37
                $this->handleFilterCondition($filter, $index, $subFilterOrFilterCondition, $dataSourceFields);
38
            }
39
        }
40
    }
41
42
    /**
43
     * @param Filter          $filter
44
     * @param int             $index
45
     * @param FilterCondition $filterCondition
46
     * @param Field[]         $dataSourceFields
47
     *
48
     * @throws \Exception
49
     */
50
    private function handleFilterCondition(Filter $filter, $index, FilterCondition $filterCondition, array $dataSourceFields)
51
    {
52
        $fieldName = $filterCondition->getFieldName();
53
        $field = $this->findFieldByName($dataSourceFields, $fieldName);
54
55
        if ($field->getDataType() instanceof SearchTextDataType) {
56
            $filter[$index] = $this->subTransformer->transform($filterCondition, $dataSourceFields);
57
        }
58
    }
59
60
    /**
61
     * @param Field[] $dataSourceFields
62
     * @param string  $fieldName
63
     *
64
     * @return Field
65
     *
66
     * @throws \Exception
67
     */
68
    private function findFieldByName(array $dataSourceFields, $fieldName)
69
    {
70
        foreach ($dataSourceFields as $field) {
71
            if ($field->getUniqueName() === $fieldName) {
72
                return $field;
73
            }
74
        }
75
76
        throw new \Exception("The $fieldName was not found in data source");
77
    }
78
}
79