QueueScheduler::checkRunDate()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.8333
c 0
b 0
f 0
cc 2
nc 2
nop 2
1
<?php
2
3
namespace Glooby\TaskBundle\Queue;
4
5
use Doctrine\Common\Persistence\ManagerRegistry;
6
use Doctrine\ORM\NoResultException;
7
use Glooby\TaskBundle\Entity\QueuedTask;
8
use Glooby\TaskBundle\Entity\QueuedTaskRepository;
9
use Glooby\TaskBundle\Manager\TaskManager;
10
use Glooby\TaskBundle\Model\ScheduleInterface;
11
12
/**
13
 * @author Emil Kilhage
14
 */
15
class QueueScheduler
16
{
17
    /**
18
     * @var ManagerRegistry
19
     */
20
    protected $doctrine;
21
22
    /**
23
     * @param ManagerRegistry $doctrine
24
     */
25
    public function setDoctrine($doctrine)
26
    {
27
        $this->doctrine = $doctrine;
28
    }
29
30
    /**
31
     * @var TaskManager
32
     */
33
    private $taskManager;
34
35
    /**
36
     * @param TaskManager $taskManager
37
     */
38
    public function setTaskManager(TaskManager $taskManager)
39
    {
40
        $this->taskManager = $taskManager;
41
    }
42
43
    /**
44
     *
45
     */
46
    public function schedule()
47
    {
48
        $queueRepo = $this->doctrine->getManager()
49
            ->getRepository('GloobyTaskBundle:QueuedTask');
50
51
        $scheduleRepo = $this->doctrine->getManager()
52
            ->getRepository('GloobyTaskBundle:Schedule');
53
54
        foreach ($scheduleRepo->findActive() as $schedule) {
55
            if (!$queueRepo->isQueued($schedule->getName())) {
56
                $this->queue($schedule);
57
            }
58
        }
59
60
        $this->doctrine->getManager()->flush();
61
    }
62
63
    /**
64
     * @param ScheduleInterface $schedule
65
     */
66
    private function queue(ScheduleInterface $schedule)
67
    {
68
        $executeAt = $this->getExecuteAt($schedule);
69
70
        if (null !== $executeAt) {
71
            $this->taskManager->queue($schedule->getName(), $executeAt, $schedule->getParams());
72
        }
73
    }
74
75
    /**
76
     * @param ScheduleInterface $schedule
77
     * @return \DateTime|null
78
     */
79
    private function checkNextRunDate(ScheduleInterface $schedule)
80
    {
81
        return $this->checkRunDate($schedule, $schedule->parseExpression()->getNextRunDate());
82
    }
83
84
    /**
85
     * @param ScheduleInterface $schedule
86
     * @return \DateTime|null
87
     */
88
    private function checkPreviousRunDate(ScheduleInterface $schedule)
89
    {
90
        return $this->checkRunDate($schedule, $schedule->parseExpression()->getPreviousRunDate());
91
    }
92
93
    /**
94
     * @param ScheduleInterface $schedule
95
     * @param \DateTime $date
96
     * @return \DateTime|null
97
     */
98
    private function checkRunDate(ScheduleInterface $schedule, \DateTime $date)
99
    {
100
        $queueRepo = $this->getQueuedTaskRepo();
101
        $executeAt = null;
102
103
        try {
104
            $queueRepo->getByNameAndExecuteAt($schedule->getName(), $date);
105
        } catch (NoResultException $e) {
106
            $executeAt = $date;
107
        }
108
109
        return $executeAt;
110
    }
111
112
    /**
113
     * @param ScheduleInterface $schedule
114
     * @return \DateTime|null
115
     */
116
    private function checkExecutedBeforeNow(ScheduleInterface $schedule)
117
    {
118
        $queueRepo = $this->getQueuedTaskRepo();
119
        $executeAt = null;
120
121
        try {
122
            $queueRepo->getByNameAndExecuteAtBeforeNow($schedule->getName());
123
        } catch (NoResultException $e) {
124
            $executeAt = $schedule->parseExpression()->getPreviousRunDate();
125
        }
126
127
        return $executeAt;
128
    }
129
130
    /**
131
     * @return QueuedTaskRepository
132
     */
133
    private function getQueuedTaskRepo()
134
    {
135
        return $this->doctrine->getManager()
136
            ->getRepository('GloobyTaskBundle:QueuedTask');
137
    }
138
139
    /**
140
     * @param ScheduleInterface $schedule
141
     * @return \DateTime|null
142
     */
143
    private function getExecuteAt(ScheduleInterface $schedule)
144
    {
145
        $executeAt = $this->checkExecutedBeforeNow($schedule);
146
147
        if (null === $executeAt) {
148
            $executeAt = $this->checkPreviousRunDate($schedule);
149
        }
150
151
        if (null === $executeAt) {
152
            $executeAt = $this->checkNextRunDate($schedule);
153
        }
154
155
        return $executeAt;
156
    }
157
}
158