QueueDecider::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 9
nc 1
nop 3
1
<?php
2
namespace Workana\AsyncJobs\Dispatcher;
3
4
use Bernard\QueueFactory;
5
use Workana\AsyncJobs\Job;
6
use Workana\AsyncJobs\JobManager;
7
8
/**
9
 * @author Carlos Frutos <[email protected]>
10
 */
11
class QueueDecider
12
{
13
    /**
14
     * @var DispatchingRuleSet
15
     */
16
    protected $rules;
17
18
    /**
19
     * @var string
20
     */
21
    protected $defaultQueueName;
22
23
    /**
24
     * @var QueueFactory
25
     */
26
    protected $queueFactory;
27
28
    /**
29
     * @param QueueFactory $queueFactory
30
     * @param string $defaultQueueName
31
     * @param Callable[]|array $rules 
32
     */
33
    public function __construct(QueueFactory $queueFactory, $defaultQueueName, array $rules = [])
34
    {
35
        $this->queueFactory = $queueFactory;
36
        $this->defaultQueueName = $defaultQueueName;
37
        $this->rules = new DispatchingRuleSet();
38
39
        $this->addRule(function(Job $job) {
40
            if ($job->hasPreferredQueue()) {
41
                return $job->getPreferredQueueName();
42
            }
43
        }, DispatchingRule::PRIORITY_HIGH);
44
45
        $this->addRules($rules);
46
    }
47
48
    /**
49
     * Decides queue
50
     *
51
     * @param Job $job
52
     *
53
     * @return \Bernard\Queue
54
     */
55
    public function decide(Job $job)
56
    {
57
        $queueName = null;
58
        foreach (clone $this->rules as $currentRule) {
59
            $queueName = $currentRule($job);
60
61
            if (!empty($queueName)) {
62
                break;
63
            }
64
        }
65
66
        $queueName = !empty($queueName) ? $queueName : $this->defaultQueueName;
67
68
        return $this->queueFactory->create($queueName);
69
    }
70
71
    /**
72
     * Add dispatching rule
73
     *
74
     * @param Callable $rule Rule
75
     * @param int $priority
76
     *
77
     * @return void
78
     */
79
    public function addRule(Callable $rule, $priority = DispatchingRule::PRIORITY_NORMAL)
80
    {
81
        if ($rule instanceof DispatchingRule) {
82
            $priority = $rule->getPriority();
83
        }
84
85
        $this->rules->insert($rule, (int) $priority);
86
    }
87
88
    /**
89
     * Add multiple rules
90
     *
91
     * @param Callable[]|array $rules
92
     */
93
    public function addRules(array $rules)
94
    {
95
        foreach ($rules as $rule) {
96
            if (is_array($rule)) {
97
                list($rule, $priority) = $rule;
98
                $this->addRule($rule, $priority);
99
            } else {
100
                $this->addRule($rule);
101
            }
102
        }
103
    }
104
}