Completed
Push — master ( 9fa596...e14f7e )
by Marco
02:55
created

ChainCache::doSaveMultiple()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 6
cts 6
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 5
nc 3
nop 2
crap 3
1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the MIT license. For more information, see
17
 * <http://www.doctrine-project.org>.
18
 */
19
20
namespace Doctrine\Common\Cache;
21
22
/**
23
 * Cache provider that allows to easily chain multiple cache providers
24
 *
25
 * @author Michaël Gallego <[email protected]>
26
 */
27
class ChainCache extends CacheProvider
28
{
29
    /**
30
     * @var CacheProvider[]
31
     */
32
    private $cacheProviders = [];
33
34
    /**
35
     * Constructor
36
     *
37
     * @param CacheProvider[] $cacheProviders
38
     */
39 84
    public function __construct($cacheProviders = [])
40
    {
41 84
        $this->cacheProviders = $cacheProviders instanceof \Traversable
42 84
            ? iterator_to_array($cacheProviders, false)
43 84
            : array_values($cacheProviders);
44 84
    }
45
46
    /**
47
     * {@inheritDoc}
48
     */
49 3
    public function setNamespace($namespace)
50
    {
51 3
        parent::setNamespace($namespace);
52
53 3
        foreach ($this->cacheProviders as $cacheProvider) {
54 3
            $cacheProvider->setNamespace($namespace);
55 3
        }
56 3
    }
57
58
    /**
59
     * {@inheritDoc}
60
     */
61 79
    protected function doFetch($id)
62
    {
63 79
        foreach ($this->cacheProviders as $key => $cacheProvider) {
64 79
            if ($cacheProvider->doContains($id)) {
65 62
                $value = $cacheProvider->doFetch($id);
66
67
                // We populate all the previous cache layers (that are assumed to be faster)
68 62
                for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) {
0 ignored issues
show
Coding Style introduced by
Space found before first semicolon of FOR loop
Loading history...
Coding Style introduced by
Space found before second semicolon of FOR loop
Loading history...
69 1
                    $this->cacheProviders[$subKey]->doSave($id, $value);
70 1
                }
71
72 62
                return $value;
73
            }
74 79
        }
75
76 79
        return false;
77
    }
78
79
    /**
80
     * {@inheritdoc}
81
     */
82 4
    protected function doFetchMultiple(array $keys)
83
    {
84
        /* @var $traversedProviders CacheProvider[] */
85 4
        $traversedProviders = [];
86 4
        $keysCount          = count($keys);
87 4
        $fetchedValues      = [];
88
89 4
        foreach ($this->cacheProviders as $key => $cacheProvider) {
90 4
            $fetchedValues = $cacheProvider->doFetchMultiple($keys);
91
92
            // We populate all the previous cache layers (that are assumed to be faster)
93 4
            if (count($fetchedValues) === $keysCount) {
94 4
                foreach ($traversedProviders as $previousCacheProvider) {
95 1
                    $previousCacheProvider->doSaveMultiple($fetchedValues);
96 4
                }
97
98 4
                return $fetchedValues;
99
            }
100
101 2
            $traversedProviders[] = $cacheProvider;
102 2
        }
103
104 1
        return $fetchedValues;
105
    }
106
107
    /**
108
     * {@inheritDoc}
109
     */
110 68
    protected function doContains($id)
111
    {
112 68
        foreach ($this->cacheProviders as $cacheProvider) {
113 68
            if ($cacheProvider->doContains($id)) {
114 64
                return true;
115
            }
116 50
        }
117
118 50
        return false;
119
    }
120
121
    /**
122
     * {@inheritDoc}
123
     */
124 72
    protected function doSave($id, $data, $lifeTime = 0)
125
    {
126 72
        $stored = true;
127
128 72
        foreach ($this->cacheProviders as $cacheProvider) {
129 72
            $stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored;
130 72
        }
131
132 72
        return $stored;
133
    }
134
135
    /**
136
     * {@inheritdoc}
137
     */
138 2
    protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
139
    {
140 2
        $stored = true;
141
142 2
        foreach ($this->cacheProviders as $cacheProvider) {
143 2
            $stored = $cacheProvider->doSaveMultiple($keysAndValues, $lifetime) && $stored;
144 2
        }
145
146 2
        return $stored;
147
    }
148
149
    /**
150
     * {@inheritDoc}
151
     */
152 45
    protected function doDelete($id)
153
    {
154 45
        $deleted = true;
155
156 45
        foreach ($this->cacheProviders as $cacheProvider) {
157 45
            $deleted = $cacheProvider->doDelete($id) && $deleted;
158 45
        }
159
160 45
        return $deleted;
161
    }
162
163
    /**
164
     * {@inheritdoc}
165
     */
166 2
    protected function doDeleteMultiple(array $keys)
167
    {
168 2
        $deleted = true;
169
170 2
        foreach ($this->cacheProviders as $cacheProvider) {
171 2
            $deleted = $cacheProvider->doDeleteMultiple($keys) && $deleted;
172 2
        }
173
174 2
        return $deleted;
175
    }
176
177
    /**
178
     * {@inheritDoc}
179
     */
180 3
    protected function doFlush()
181
    {
182 3
        $flushed = true;
183
184 3
        foreach ($this->cacheProviders as $cacheProvider) {
185 3
            $flushed = $cacheProvider->doFlush() && $flushed;
186 3
        }
187
188 3
        return $flushed;
189
    }
190
191
    /**
192
     * {@inheritDoc}
193
     */
194 1
    protected function doGetStats()
195
    {
196
        // We return all the stats from all adapters
197 1
        $stats = [];
198
199 1
        foreach ($this->cacheProviders as $cacheProvider) {
200 1
            $stats[] = $cacheProvider->doGetStats();
201 1
        }
202
203 1
        return $stats;
204
    }
205
}
206