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

SearchTextFieldHandler   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 10
c 1
b 0
f 0
lcom 1
cbo 3
dl 0
loc 72
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A handle() 0 13 4
A handleFilterCondition() 0 9 2
A findFieldByName() 0 10 3
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