Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 69
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
ScheduleQueue
0.00% covered (danger)
0.00%
0 / 69
0.00% covered (danger)
0.00%
0 / 6
462
0.00% covered (danger)
0.00%
0 / 1
 get
0.00% covered (danger)
0.00%
0 / 54
0.00% covered (danger)
0.00%
0 / 1
132
 insert
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 pop
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 bumpHold
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 adjustPriority
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 remove
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   phpOMS\Scheduling
8 * @copyright Dennis Eichhorn
9 * @license   OMS License 2.0
10 * @version   1.0.0
11 * @link      https://jingga.app
12 */
13declare(strict_types=1);
14
15namespace phpOMS\Scheduling;
16
17/**
18 * Scheduler.
19 *
20 * @package phpOMS\Scheduling
21 * @license OMS License 2.0
22 * @link    https://jingga.app
23 * @since   1.0.0
24 */
25final class ScheduleQueue
26{
27    public array $queue = [];
28
29    public function get(int $size = 1, int $type = PriorityMode::FIFO) : array
30    {
31        $jobs = [];
32        $keys = \array_keys($this->queue);
33
34        switch ($type) {
35            case PriorityMode::FIFO:
36                for ($i = 0; $i < $size; ++$i) {
37                    $jobs[$i] = $this->queue[$keys[$i]];
38                }
39
40                break;
41            case PriorityMode::LIFO:
42                for ($i = \count($this->queue) - $size - 1; $i < $size; ++$i) {
43                    $jobs[$i] = $this->queue[$keys[$i]];
44                }
45
46                break;
47            case PriorityMode::PRIORITY:
48                $queue = $this->queue;
49                \uasort($queue, function (Job $a, Job $b) {
50                    return $a->priority <=> $b->priority;
51                });
52
53                $jobs = \array_slice($queue, 0, $size, true);
54
55                break;
56            case PriorityMode::VALUE:
57                $queue = $this->queue;
58                \uasort($queue, function (Job $a, Job $b) {
59                    return $b->value <=> $a->value;
60                });
61
62                $jobs = \array_slice($queue, 0, $size, true);
63
64                break;
65            case PriorityMode::COST:
66                $queue = $this->queue;
67                \uasort($queue, function (Job $a, Job $b) {
68                    return $a->cost <=> $b->cost;
69                });
70
71                $jobs = \array_slice($queue, 0, $size, true);
72
73                break;
74            case PriorityMode::PROFIT:
75                $queue = $this->queue;
76                \uasort($queue, function (Job $a, Job $b) {
77                    return $b->getProfit() <=> $a->getProfit();
78                });
79
80                $jobs = \array_slice($queue, 0, $size, true);
81
82                break;
83            case PriorityMode::HOLD:
84                $queue = $this->queue;
85                \uasort($queue, function (Job $a, Job $b) {
86                    return $b->onhold <=> $a->onhold;
87                });
88
89                $jobs = \array_slice($queue, 0, $size, true);
90
91                break;
92            case PriorityMode::EARLIEST_DEADLINE:
93                $queue = $this->queue;
94                \uasort($queue, function (Job $a, Job $b) {
95                    return $a->deadline->getTimestamp() <=> $b->deadline->getTimestamp();
96                });
97
98                $jobs = \array_slice($queue, 0, $size, true);
99
100                break;
101        }
102
103        return $jobs;
104    }
105
106    public function insert(int $id, Job $job) : void
107    {
108        $this->queue[$id] = $job;
109    }
110
111    public function pop(int $size = 1, int $type = PriorityMode::FIFO) : array
112    {
113        $jobs = $this->get($size, $type);
114        foreach ($jobs as $id => $_) {
115            unset($this->queue[$id]);
116        }
117
118        return $jobs;
119    }
120
121    public function bumpHold(int $id = 0) : void
122    {
123        if ($id === 0) {
124            foreach ($this->queue as $job) {
125                ++$job->onhold;
126            }
127        } else {
128            ++$this->queue[$id]->onhold;
129        }
130    }
131
132    public function adjustPriority(int $id = 0, float $priority = 0.1) : void
133    {
134        if ($id === 0) {
135            foreach ($this->queue as $job) {
136                $job->priority += $priority;
137            }
138        } else {
139            $this->queue[$id]->priority += $priority;
140        }
141    }
142
143    public function remove(string $id) : void
144    {
145        unset($this->queue[$id]);
146    }
147}