Completed
Pull Request — master (#53)
by Matthew
12:05
created

DoctrineRunManager   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 108
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 3

Test Coverage

Coverage 95.12%

Importance

Changes 0
Metric Value
wmc 14
lcom 2
cbo 3
dl 0
loc 108
ccs 39
cts 41
cp 0.9512
rs 10
c 0
b 0
f 0

11 Methods

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