Completed
Pull Request — master (#30)
by Matthew
13:27 queued 10:46
created

DoctrineRunManager::pruneArchivedRuns()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 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 17
    public function __construct(ObjectManager $objectManager, $runClass, $runArchiveClass)
19
    {
20 17
        $this->runArchiveClass = $runArchiveClass;
21 17
        $this->objectManager = $objectManager;
22 17
        parent::__construct($runClass);
23 17
    }
24
25
    /**
26
     * @return ObjectManager
27
     */
28 16
    public function getObjectManager()
29
    {
30 16
        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 19
    public function getRunArchiveClass()
45
    {
46 19
        return $this->runArchiveClass;
47
    }
48
49 1
    public function pruneStalledRuns()
50
    {
51 1
        $runs = $this->getOldLiveRuns();
52
        /** @var Run $run */
53 1
        $delete = [];
54
55 1
        foreach ($runs as $run) {
56 1
            $lastHeartbeat = $run->getLastHeartbeatAt();
57 1
            $time = time() - 3600;
58 1
            $processTimeout = $run->getProcessTimeout();
59 1
            $time -= $processTimeout;
60 1
            $oldDate = new \DateTime("@$time");
61 1
            if (null === $lastHeartbeat || $oldDate > $lastHeartbeat) {
62 1
                $delete[] = $run;
63
            }
64
        }
65
66 1
        return $this->deleteOldRuns($delete);
67
    }
68
69
    /**
70
     * @param array $delete
71
     *
72
     * @return int
73
     */
74 1
    protected function deleteOldRuns(array $delete)
75
    {
76 1
        $count = count($delete);
77 1
        $objectManager = $this->getObjectManager();
78 1
        for ($i = 0; $i < $count; $i += 100) {
79 1
            $deleteList = array_slice($delete, $i, 100);
80 1
            foreach ($deleteList as $object) {
81 1
                $objectManager->remove($object);
82
            }
83 1
            $this->flush();
84
        }
85
86 1
        return $count;
87
    }
88
89 1
    protected function flush()
90
    {
91 1
        $this->getObjectManager()->flush();
92 1
    }
93
94 1
    protected function persistRun(Run $run, $action = 'persist')
95
    {
96 1
        $objectManager = $this->getObjectManager();
97 1
        $objectManager->$action($run);
98 1
        $objectManager->flush();
99 1
    }
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