AggregateFilter::find()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 16
ccs 8
cts 8
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 8
nc 3
nop 2
crap 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Rs\XmlFilter\Filter;
6
7
use Rs\XmlFilter\Document\Element;
8
use Symfony\Component\OptionsResolver\OptionsResolver;
9
10
class AggregateFilter extends AbstractFilter implements Filter
11
{
12
    /**
13
     * {@inheritdoc}
14
     */
15 9
    public function find(Element $element, array $options)
16
    {
17 9
        $data = [];
18
19 9
        foreach ($options['mappings'] as $key => $settings) {
20 9
            $value = $this->findValue($element, $settings, $options);
21
22 9
            if (false === $this->checkCondition($key, $value, $options, $element, $this->manager)) {
23 2
                continue;
24
            }
25
26 9
            $data[$key] = $value;
27
        }
28
29 9
        return $this->sort($data, $options);
30
    }
31
32 9
    private function findValue(Element $element, $settings, array $options)
33
    {
34 9
        list($filter, $nestedOptions) = $this->prepareNestedFilter($settings, $options);
35
36 9
        return $this->filter($element, $filter, $options, $nestedOptions);
37
    }
38
39 9
    private function prepareNestedFilter($settings, array $options) : array
40
    {
41 9
        $filter = ScalarFilter::class;
42 9
        $nestedOptions = [];
43
44 9
        if (is_string($settings) || !isset($settings['filter'])) {
45 9
            $nestedOptions = ['path' => $this->preparePath(is_string($settings) ? $settings : $settings['path'], $options)];
46
        }
47
48 9
        if (is_array($settings)) {
49 4
            list($filter, $settings) = $this->splitFilterAndOptions($settings);
50
51 4
            $nestedOptions = array_merge($settings, $nestedOptions ?? []);
52
        }
53
54 9
        return [$filter, $nestedOptions];
55
    }
56
57
    /**
58
     * {@inheritdoc}
59
     */
60 9
    public function getOptions(OptionsResolver $resolver)
61
    {
62 9
        parent::getOptions($resolver);
63
64 9
        $resolver->remove(['cast', 'multiple']);
65
66 9
        $resolver->setRequired('mappings');
67 9
        $resolver->setAllowedTypes('mappings', ['array']);
68 9
    }
69
}
70