Completed
Push — master ( 01653d...13c111 )
by Matthew
06:19
created

BaseRunManager::getRepository()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 2
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
    /**
21
     * @return ObjectManager
22
     */
23 5
    public function getObjectManager()
24
    {
25 5
        return $this->objectManager;
26
    }
27
28
    /**
29
     * @param ObjectManager $objectManager
30
     */
31 10
    public function setObjectManager(ObjectManager $objectManager)
32
    {
33 10
        $this->objectManager = $objectManager;
34 10
    }
35
36
    /**
37
     * @return ObjectRepository
38
     */
39
    public function getRepository()
40
    {
41
        return $this->objectManager->getRepository($this->getRunClass());
42
    }
43
44
    /**
45
     * @return null|string
46
     */
47 9
    public function getRunArchiveClass()
48
    {
49 9
        return $this->runArchiveClass;
50
    }
51
52
    /**
53
     * @param null|string $runArchiveClass
54
     */
55 10
    public function setRunArchiveClass($runArchiveClass)
56
    {
57 10
        $this->runArchiveClass = $runArchiveClass;
58 10
    }
59
60 2
    public function recordJobRun(Job $job)
61
    {
62 2
        parent::recordJobRun($job);
63
64 2
        $finishedAt = $job->getFinishedAt();
65 2
        if (null === $finishedAt) {
66
            $finishedAt = new \DateTime();
67
        }
68
        /** @var JobTiming $jobTiming */
69 2
        $jobTiming = new $this->jobTimingClass();
70 2
        $jobTiming->setFinishedAt($finishedAt);
71 2
        $this->objectManager->persist($jobTiming);
72 2
        $this->objectManager->flush();
73 2
    }
74
75 2
    public function pruneStalledRuns()
76
    {
77 2
        $runs = $this->getOldLiveRuns();
78
        /** @var Run $run */
79 2
        $delete = [];
80
81 2
        foreach ($runs as $run) {
82 2
            $lastHeartbeat = $run->getLastHeartbeatAt();
83 2
            $time = time() - 3600;
84 2
            $processTimeout = $run->getProcessTimeout();
85 2
            $time -= $processTimeout;
86 2
            $oldDate = new \DateTime("@$time");
87 2
            if (null === $lastHeartbeat || $oldDate > $lastHeartbeat) {
88 2
                $delete[] = $run;
89
            }
90
        }
91
92 2
        return $this->deleteOldRuns($delete);
93
    }
94
95
    /**
96
     * @param array $delete
97
     *
98
     * @return int
99
     */
100 2
    protected function deleteOldRuns(array $delete)
101
    {
102 2
        $count = count($delete);
103 2
        $objectManager = $this->getObjectManager();
104 2
        for ($i = 0; $i < $count; $i += 100) {
105 2
            $deleteList = array_slice($delete, $i, 100);
106 2
            foreach ($deleteList as $object) {
107 2
                $objectManager->remove($object);
108
            }
109 2
            $objectManager->flush();
110
        }
111
112 2
        return $count;
113
    }
114
115
    /**
116
     * @return array
117
     */
118
    abstract protected function getOldLiveRuns();
119
120
    abstract protected function removeOlderThan(ObjectManager $objectManager, $objectName, $field, \DateTime $olderThan);
121
122 1
    public function pruneArchivedRuns(\DateTime $olderThan)
123
    {
124
        /** @var ObjectManager $objectManager */
125 1
        $objectManager = $this->getObjectManager();
126
127 1
        return $this->removeOlderThan($objectManager, $this->getRunArchiveClass(), 'endedAt', $olderThan);
128
    }
129
130
    public function pruneJobTimings(\DateTime $olderThan)
131
    {
132
        /** @var ObjectManager $objectManager */
133
        $objectManager = $this->getObjectManager();
134
135
        return $this->removeOlderThan($objectManager, $this->getJobTimingClass(), 'createdAt', $olderThan);
136
    }
137
}
138