Passed
Push — master ( b12609...128f06 )
by Dmitry
10:42 queued 02:42
created

Cleaner::process()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 0
dl 0
loc 20
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
namespace Tarantool\SymfonyLock;
4
5
use Tarantool\Client\Client;
6
use InvalidArgumentException;
7
8
class Cleaner
9
{
10
    use OptionalConstructor;
11
12
    /**
13
     * Dropped rows counter limit
14
     */
15
    protected int $limit = 100;
16
17
    /**
18
     * Space name
19
     */
20
    protected string $space = 'lock';
21
22
    protected function validateOptions()
23
    {
24
        if ($this->limit <= 0) {
25
            $message = sprintf(
26
                'limit expects a strictly positive TTL. Got %d.',
27
                $this->limit
28
            );
29
            throw new InvalidArgumentException($message);
30
        }
31
        if ($this->space == '') {
32
            throw new InvalidArgumentException("Space should be defined");
33
        }
34
    }
35
36
    public function process(): int
37
    {
38
        $script = <<<LUA
39
        local limit, timestamp = ...
40
        local counter = 0
41
        box.begin()
42
        box.space.$this->space.index.expire:pairs()
43
            :take_while(function(tuple) return counter < limit end)
44
            :take_while(function(tuple) return tuple.expire <= timestamp end)
45
            :each(function(tuple)
46
                box.space.$this->space:delete( tuple.key )
47
                counter = counter + 1
48
            end)
49
        box.commit()
50
        return counter
51
        LUA;
52
53
        [$counter] = $this->client->evaluate($script, $this->limit, microtime(true));
54
55
        return $counter;
56
    }
57
}
58