Passed
Push — master ( 77b70f...ae1a26 )
by Petr
08:45
created

TStore   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 10
eloc 27
c 2
b 0
f 0
dl 0
loc 88
ccs 27
cts 27
cp 1
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A loadSource() 0 15 3
A saveSource() 0 19 4
A generateKeyFromPks() 0 7 3
1
<?php
2
3
namespace kalanis\kw_mapper\Mappers;
4
5
6
use kalanis\kw_mapper\MapperException;
7
use kalanis\kw_mapper\Records;
8
9
10
/**
11
 * Trait TStore
12
 * @package kalanis\kw_mapper\Mappers
13
 * Abstract for manipulation with file content as table
14
 */
15
trait TStore
16
{
17
    use TTranslate;
18
19
    /**
20
     * @param Records\ARecord $record
21
     * @throws MapperException
22
     * @return Records\ARecord[]
23
     */
24 5
    protected function loadSource(Records\ARecord $record): array
25
    {
26 5
        $lines = $this->loadFromStorage();
27 5
        $records = [];
28 5
        foreach ($lines as &$line) {
29
30 5
            $item = clone $record;
31
32 5
            foreach ($this->getRelations() as $objectKey => $recordKey) {
33 5
                $entry = $item->getEntry($objectKey);
34 5
                $entry->setData($this->translateTypeFrom($entry->getType(), $line[$recordKey]), true);
35
            }
36 5
            $records[] = $item;
37
        }
38 5
        return $records;
39
    }
40
41
    /**
42
     * @param Records\ARecord[] $records
43
     * @throws MapperException
44
     * @return bool
45
     */
46 5
    protected function saveSource(array $records): bool
47
    {
48 5
        $lines = [];
49 5
        foreach ($records as &$record) {
50 5
            $dataLine = [];
51
52 5
            foreach ($this->getRelations() as $objectKey => $recordKey) {
53 5
                $entry = $record->getEntry($objectKey);
54 5
                $dataLine[$recordKey] = $this->translateTypeTo($entry->getType(), $entry->getData());
55
            }
56
57 5
            $linePk = $this->generateKeyFromPks($record);
58 5
            if ($linePk) {
59 4
                $lines[$linePk] = $dataLine;
60
            } else {
61 1
                $lines[] = $dataLine;
62
            }
63
        }
64 5
        return $this->saveToStorage($lines);
65
    }
66
67
    /**
68
     * @param Records\ARecord $record
69
     * @throws MapperException
70
     * @return string|null
71
     */
72 5
    private function generateKeyFromPks(Records\ARecord $record): ?string
73
    {
74 5
        $toComplete = [];
75 5
        foreach ($this->getPrimaryKeys() as $key) {
76 4
            $toComplete[] = $record->offsetGet($key);
77
        }
78 5
        return (count(array_filter($toComplete))) ? implode('_', $toComplete) : null ;
79
    }
80
81
    /**
82
     * @throws MapperException
83
     * @return array<string|int, array<string|int, string|int|array<string|int, string|int>>>
84
     */
85
    abstract protected function loadFromStorage(): array;
86
87
    /**
88
     * @param array<string|int, array<string|int, string|int|array<string|int, string|int>>> $content
89
     * @throws MapperException
90
     * @return bool
91
     */
92
    abstract protected function saveToStorage(array $content): bool;
93
94
    /**
95
     * @return string[]
96
     */
97
    abstract public function getPrimaryKeys(): array;
98
99
    /**
100
     * @return array<string|int, string|int>
101
     */
102
    abstract public function getRelations(): array;
103
}
104