Completed
Pull Request — master (#30)
by Matthew
48:21 queued 02:09
created

DoctrineRunManager   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 2

Test Coverage

Coverage 95.24%

Importance

Changes 0
Metric Value
wmc 14
lcom 2
cbo 2
dl 0
loc 103
ccs 40
cts 42
cp 0.9524
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A getRepository() 0 4 1
A getRunArchiveClass() 0 4 1
getOldLiveRuns() 0 1 ?
removeOlderThan() 0 1 ?
A getObjectManager() 0 4 1
A pruneStalledRuns() 0 19 4
A deleteOldRuns() 0 14 3
A flush() 0 4 1
A persistRun() 0 6 1
A pruneArchivedRuns() 0 4 1
1
<?php
2
3
namespace Dtc\QueueBundle\Doctrine;
4
5
use Doctrine\Common\Persistence\ObjectManager;
6
use Doctrine\Common\Persistence\ObjectRepository;
7
use Dtc\QueueBundle\Model\Run;
8
use Dtc\QueueBundle\Manager\RunManager;
9
10
abstract class DoctrineRunManager extends RunManager
11
{
12
    /** @var ObjectManager */
13
    protected $objectManager;
14
15
    /** @var string|null */
16
    protected $runArchiveClass;
17
18 19
    public function __construct(ObjectManager $objectManager, $runClass, $runArchiveClass)
19
    {
20 19
        $this->runArchiveClass = $runArchiveClass;
21 19
        $this->objectManager = $objectManager;
22 19
        parent::__construct($runClass);
23 19
    }
24
25
    /**
26
     * @return ObjectManager
27
     */
28 18
    public function getObjectManager()
29
    {
30 18
        return $this->objectManager;
31
    }
32
33
    /**
34
     * @return ObjectRepository
35
     */
36
    public function getRepository()
37
    {
38
        return $this->objectManager->getRepository($this->getRunClass());
39
    }
40
41
    /**
42
     * @return null|string
43
     */
44 21
    public function getRunArchiveClass()
45
    {
46 21
        return $this->runArchiveClass;
47
    }
48
49 2
    public function pruneStalledRuns()
50
    {
51 2
        $runs = $this->getOldLiveRuns();
52
        /** @var Run $run */
53 2
        $delete = [];
54
55 2
        foreach ($runs as $run) {
56 2
            $lastHeartbeat = $run->getLastHeartbeatAt();
57 2
            $time = time() - 3600;
58 2
            $processTimeout = $run->getProcessTimeout();
59 2
            $time -= $processTimeout;
60 2
            $oldDate = new \DateTime("@$time");
61 2
            if (null === $lastHeartbeat || $oldDate > $lastHeartbeat) {
62 2
                $delete[] = $run;
63
            }
64
        }
65
66 2
        return $this->deleteOldRuns($delete);
67
    }
68
69
    /**
70
     * @param array $delete
71
     *
72
     * @return int
73
     */
74 2
    protected function deleteOldRuns(array $delete)
75
    {
76 2
        $count = count($delete);
77 2
        $objectManager = $this->getObjectManager();
78 2
        for ($i = 0; $i < $count; $i += 100) {
79 2
            $deleteList = array_slice($delete, $i, 100);
80 2
            foreach ($deleteList as $object) {
81 2
                $objectManager->remove($object);
82
            }
83 2
            $this->flush();
84
        }
85
86 2
        return $count;
87
    }
88
89 2
    protected function flush()
90
    {
91 2
        $this->getObjectManager()->flush();
92 2
    }
93
94 2
    protected function persistRun(Run $run, $action = 'persist')
95
    {
96 2
        $objectManager = $this->getObjectManager();
97 2
        $objectManager->$action($run);
98 2
        $objectManager->flush();
99 2
    }
100
101
    /**
102
     * @return array
103
     */
104
    abstract protected function getOldLiveRuns();
105
106
    abstract protected function removeOlderThan($objectName, $field, \DateTime $olderThan);
107
108 1
    public function pruneArchivedRuns(\DateTime $olderThan)
109
    {
110 1
        return $this->removeOlderThan($this->getRunArchiveClass(), 'endedAt', $olderThan);
111
    }
112
}
113