Completed
Pull Request — master (#30)
by Matthew
19:54
created

DoctrineRunManager   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 2

Importance

Changes 0
Metric Value
wmc 14
lcom 2
cbo 2
dl 0
loc 103
rs 10
c 0
b 0
f 0

11 Methods

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