Passed
Push — master ( f9389a...e0bec9 )
by Mihail
04:05
created

CacheItemPool   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 131
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 17
c 1
b 0
f 0
dl 0
loc 131
ccs 48
cts 48
cp 1
rs 10
eloc 49

16 Methods

Rating   Name   Duplication   Size   Complexity  
A hp$0 ➔ deleteItems() 0 6 2
clear() 0 7 ?
getItem() 0 21 ?
A hp$0 ➔ saveDeferred() 0 13 3
deleteItem() 0 11 ?
hasItem() 0 6 ?
A getItems() 0 8 2
A commit() 0 9 3
A hp$0 ➔ clear() 0 7 2
A __destruct() 0 3 1
saveDeferred() 0 13 ?
A hp$0 ➔ getItem() 0 21 4
A hp$0 ➔ hasItem() 0 6 3
A save() 0 4 1
deleteItems() 0 6 ?
A hp$0 ➔ deleteItem() 0 11 3
1
<?php
2
3
namespace Koded\Caching;
4
5
use Exception;
6
use Psr\Cache\{CacheItemInterface, CacheItemPoolInterface};
7
use function Koded\Stdlib\now;
8
9
10
abstract class CacheItemPool implements CacheItemPoolInterface
11
{
12
    /** @var Cache */
13
    protected $client;
14
15
    /** @var CacheItemInterface[] */
16
    private $deferred = [];
17
18
19
    abstract public function __construct(string $client, array $parameters);
20
21
    // @codeCoverageIgnoreStart
22
    public function __destruct()
23
    {
24
        $this->commit();
25
    }
26
    // @codeCoverageIgnoreEnd
27
28 56
    public function commit(): bool
29
    {
30 56
        foreach ($this->deferred as $key => $item) {
31 35
            if (true === $this->save($item)) {
32 35
                unset($this->deferred[$key]);
33
            }
34
        }
35
36 56
        return empty($this->deferred);
37
    }
38
39
40 216
    public function save(CacheItemInterface $item): bool
41
    {
42
        /** @var CacheItem $item */
43 216
        return $this->client->set($item->getKey(), $item->get(), $item->getExpiresAt());
0 ignored issues
show
Bug introduced by
The method getExpiresAt() does not exist on Psr\Cache\CacheItemInterface. Did you maybe mean expiresAt()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

43
        return $this->client->set($item->getKey(), $item->get(), $item->/** @scrutinizer ignore-call */ getExpiresAt());

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
44
    }
45
46
47 133
    public function getItems(array $keys = []): array
48
    {
49 133
        $items = [];
50 133
        foreach ($keys as $key) {
51 126
            $items[$key] = $this->getItem($key);
52
        }
53
54 21
        return $items;
55
    }
56
57
58 483
    public function getItem($key): CacheItemInterface
59
    {
60
        try {
61
            $item = new class($key, $this->client->getTtl()) extends CacheItem {};
62
63 483
            if (false === $this->client->has($key)) {
64 371
                if (isset($this->deferred[$key])) {
65 49
                    return clone $this->deferred[$key];
66
                }
67 364
                return $item;
68
            }
69
70
            (function() {
71 175
                $this->isHit = true;
0 ignored issues
show
Bug Best Practice introduced by
The property isHit does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
72 175
                return $this;
73 175
            })->call($item);
74
75 175
            return $item->set($this->client->get($key));
76
77 224
        } catch (Exception $e) {
78 224
            throw CachePoolException::from($e);
79
        }
80
    }
81
82
83 174
    public function hasItem($key): bool
84
    {
85
        try {
86 174
            return isset($this->deferred[$key]) || $this->client->has($key);
87 112
        } catch (Exception $e) {
88 112
            throw CachePoolException::from($e);
89
        }
90
    }
91
92
93 818
    public function clear(): bool
94
    {
95 818
        if ($cleared = $this->client->clear()) {
96 818
            $this->deferred = [];
97
        }
98
99 818
        return $cleared;
100
    }
101
102
103 119
    public function deleteItems(array $keys): bool
104
    {
105
        try {
106 119
            return $this->client->deleteMultiple($keys);
107 112
        } catch (Exception $e) {
108 112
            throw CachePoolException::from($e);
109
        }
110
    }
111
112
113 140
    public function deleteItem($key): bool
114
    {
115
        try {
116 140
            if ($deleted = $this->client->delete($key)) {
117 28
                unset($this->deferred[$key]);
118
            }
119
120 28
            return $deleted;
121
122 112
        } catch (Exception $e) {
123 112
            throw CachePoolException::from($e);
124
        }
125
    }
126
127
128 70
    public function saveDeferred(CacheItemInterface $item): bool
129
    {
130
        /** @var CacheItem $item */
131 70
        if (null !== $item->getExpiresAt() && $item->getExpiresAt() <= now()->getTimestamp()) {
132 14
            return false;
133
        }
134
135
        $this->deferred[$item->getKey()] = (function() {
136 56
            $this->isHit = true;
0 ignored issues
show
Bug Best Practice introduced by
The property isHit does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
137 56
            return $this;
138 56
        })->call($item);
139
140 56
        return true;
141
    }
142
}