FilterBarFactory   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 6

Importance

Changes 0
Metric Value
wmc 10
lcom 2
cbo 6
dl 0
loc 69
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A createForm() 0 12 1
A createExpression() 0 13 3
A addExpression() 0 16 3
A getFilterDefaults() 0 9 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Psi\Component\Grid;
6
7
use Psi\Component\Grid\Form\Type\FilterType;
8
use Psi\Component\Grid\Metadata\FilterMetadata;
9
use Psi\Component\Grid\Metadata\GridMetadata;
10
use Psi\Component\ObjectAgent\Capabilities;
11
use Psi\Component\ObjectAgent\Query\Composite;
12
use Psi\Component\ObjectAgent\Query\Expression;
13
use Symfony\Component\Form\FormFactoryInterface;
14
use Symfony\Component\Form\FormInterface;
15
16
class FilterBarFactory implements FilterBarFactoryInterface
17
{
18
    const FORM_NAME = 'filter';
19
20
    private $formFactory;
21
    private $filterRegistry;
22
23
    public function __construct(
24
        FormFactoryInterface $formFactory,
25
        FilterRegistry $filterRegistry
26
    ) {
27
        $this->formFactory = $formFactory;
28
        $this->filterRegistry = $filterRegistry;
29
    }
30
31
    public function createForm(GridMetadata $gridMetadata, Capabilities $capabilities): FormInterface
32
    {
33
        $options = [
34
            'grid_metadata' => $gridMetadata,
35
            'capabilities' => $capabilities,
36
        ];
37
38
        $defaults = $this->getFilterDefaults($gridMetadata);
39
        $formBuilder = $this->formFactory->createNamedBuilder(self::FORM_NAME, FilterType::class, $defaults, $options);
40
41
        return $formBuilder->getForm();
42
    }
43
44
    public function createExpression(GridMetadata $gridMetadata, array $data): Expression
45
    {
46
        $expressions = [];
47
        foreach ($gridMetadata->getFilters() as $filterName => $filterMetadata) {
48
            if (!isset($data[$filterName])) {
49
                continue;
50
            }
51
52
            $this->addExpression($expressions, $filterMetadata, $filterName, $data[$filterName]);
53
        }
54
55
        return new Composite(Composite::AND, $expressions);
56
    }
57
58
    private function addExpression(
59
        &$expressions,
60
        FilterMetadata $filterMetadata,
61
        $filterName,
62
        array $filterData
63
    ) {
64
        $field = $filterMetadata->getField() ?: $filterName;
65
66
        $filter = $this->filterRegistry->get($filterMetadata->getType());
67
68
        if (false === $filter->isApplicable($filterData)) {
69
            return;
70
        }
71
72
        $expressions[] = $filter->getExpression($field, $filterData);
73
    }
74
75
    private function getFilterDefaults(GridMetadata  $gridMetadata)
76
    {
77
        $defaults = [];
78
        foreach ($gridMetadata->getFilters() as $filterName => $filterMetadata) {
79
            $defaults[$filterName] = $filterMetadata->getDefaults();
80
        }
81
82
        return $defaults;
83
    }
84
}
85