Completed
Push — master ( 0acfd1...8c96cb )
by Edward
08:27
created

ValueListFetcher::fetchChildren()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 9
nc 3
nop 2
dl 0
loc 16
ccs 0
cts 9
cp 0
crap 12
rs 9.9666
c 1
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
4
namespace Remorhaz\JSON\Path\Runtime;
5
6
use Remorhaz\JSON\Data\Value\ArrayValueInterface;
7
use Remorhaz\JSON\Path\Value\EvaluatedValueInterface;
8
use Remorhaz\JSON\Path\Value\EvaluatedValueList;
9
use Remorhaz\JSON\Path\Value\EvaluatedValueListInterface;
10
use Remorhaz\JSON\Data\Value\NodeValueInterface;
11
use Remorhaz\JSON\Path\Value\NodeValueList;
12
use Remorhaz\JSON\Path\Value\NodeValueListBuilder;
13
use Remorhaz\JSON\Path\Value\NodeValueListInterface;
14
15
final class ValueListFetcher implements ValueListFetcherInterface
16
{
17
18
    private $valueFetcher;
19
20
    public function __construct(ValueFetcherInterface $valueFetcher)
21
    {
22
        $this->valueFetcher = $valueFetcher;
23
    }
24
25
    /**
26
     * @param NodeValueListInterface $source
27
     * @param Matcher\ChildMatcherInterface $matcher
28
     * @return NodeValueListInterface
29
     */
30
    public function fetchChildren(
31
        NodeValueListInterface $source,
32
        Matcher\ChildMatcherInterface $matcher
33
    ): NodeValueListInterface {
34
        $nodesBuilder = new NodeValueListBuilder;
35
        foreach ($source->getValues() as $sourceIndex => $sourceValue) {
36
            $children = $this
37
                ->valueFetcher
38
                ->fetchValueChildren($matcher, $sourceValue);
39
            $outerIndex = $source->getIndexMap()->getOuterIndex($sourceIndex);
40
            foreach ($children as $child) {
41
                $nodesBuilder->addValue($child, $outerIndex);
42
            }
43
        }
44
45
        return $nodesBuilder->build();
46
    }
47
48
    public function fetchChildrenDeep(
49
        NodeValueListInterface $source,
50
        Matcher\ChildMatcherInterface $matcher
51
    ): NodeValueListInterface {
52
        $nodesBuilder = new NodeValueListBuilder;
53
        foreach ($source->getValues() as $sourceIndex => $sourceValue) {
54
            $children = $this
55
                ->valueFetcher
56
                ->fetchValueDeepChildren($matcher, $sourceValue);
57
            $outerIndex = $source->getIndexMap()->getOuterIndex($sourceIndex);
58
            foreach ($children as $child) {
59
                $nodesBuilder->addValue($child, $outerIndex);
60
            }
61
        }
62
63
        return $nodesBuilder->build();
64
    }
65
66
    public function fetchFilterContext(NodeValueListInterface $source): NodeValueListInterface
67
    {
68
        $nodesBuilder = new NodeValueListBuilder;
69
        foreach ($source->getValues() as $sourceIndex => $sourceValue) {
70
            if (!$sourceValue instanceof NodeValueInterface) {
71
                throw new Exception\InvalidContextValueException($sourceValue);
72
            }
73
            $outerIndex = $source->getIndexMap()->getOuterIndex($sourceIndex);
74
            $children = $sourceValue instanceof ArrayValueInterface
75
                ? $this
76
                    ->valueFetcher
77
                    ->fetchValueChildren(new Matcher\AnyChildMatcher, $sourceValue)
78
                : [$sourceValue];
79
            foreach ($children as $child) {
80
                $nodesBuilder->addValue($child, $outerIndex);
81
            }
82
        }
83
84
        return $nodesBuilder->build();
85
    }
86
87
    public function fetchFilteredValues(
88
        NodeValueListInterface $values,
89
        EvaluatedValueListInterface $results
90
    ): NodeValueListInterface {
91
        if (!$values->getIndexMap()->equals($results->getIndexMap())) {
92
            throw new Exception\IndexMapMatchFailedException($values, $results);
93
        }
94
        $nodesBuilder = new NodeValueListBuilder;
95
        foreach ($values->getValues() as $index => $value) {
96
            $evaluatedValue = $results->getValue($index);
97
            if (!$evaluatedValue instanceof EvaluatedValueInterface) {
98
                throw new Exception\InvalidFilterValueException($evaluatedValue);
99
            }
100
            if (!$evaluatedValue->getData()) {
101
                continue;
102
            }
103
            $nodesBuilder->addValue(
104
                $value,
105
                $values->getIndexMap()->getOuterIndex($index)
106
            );
107
        }
108
109
        return $nodesBuilder->build();
110
    }
111
112
    public function splitFilterContext(NodeValueListInterface $values): NodeValueListInterface
113
    {
114
        return new NodeValueList(
115
            $values->getIndexMap()->split(),
116
            ...$values->getValues(),
117
        );
118
    }
119
120
    public function joinFilterResults(
121
        EvaluatedValueListInterface $evaluatedValues,
122
        NodeValueListInterface $contextValues
123
    ): EvaluatedValueListInterface {
124
        return new EvaluatedValueList(
125
            $evaluatedValues->getIndexMap()->join($contextValues->getIndexMap()),
126
            ...$evaluatedValues->getResults()
127
        );
128
    }
129
}
130