Completed
Push — master ( 16d212...b7b31c )
by Matthew
07:34 queued 05:11
created

BaseRunManager   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 130
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 4

Test Coverage

Coverage 90.16%

Importance

Changes 0
Metric Value
wmc 18
lcom 2
cbo 4
dl 0
loc 130
ccs 55
cts 61
cp 0.9016
rs 10
c 0
b 0
f 0

14 Methods

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