ConditionManager   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 42
Duplicated Lines 0 %

Importance

Changes 10
Bugs 3 Features 4
Metric Value
eloc 16
dl 0
loc 42
rs 10
c 10
b 3
f 4
wmc 7

4 Methods

Rating   Name   Duplication   Size   Complexity  
A executeCondition() 0 5 1
A __construct() 0 3 1
A executeCombine() 0 10 2
A execute() 0 11 3
1
<?php
2
/**
3
 * Copyright © Thomas Klein, All rights reserved.
4
 * See LICENSE bundled with this library for license details.
5
 */
6
declare(strict_types=1);
7
8
namespace LogicTree\Service;
9
10
use LogicTree\DataSource;
11
use LogicTree\Node\CombineInterface;
12
use LogicTree\Node\ConditionInterface;
13
use LogicTree\Node\NodeInterface;
14
use LogicTree\Operator\OperatorPool;
15
16
/**
17
 * @api
18
 */
19
class ConditionManager
20
{
21
    /**
22
     * @var OperatorPool
23
     */
24
    private $operatorPool;
25
26
    public function __construct(?OperatorPool $operatorPool = null)
27
    {
28
        $this->operatorPool = $operatorPool ?? new OperatorPool();
29
    }
30
31
    public function execute(NodeInterface $node, DataSource $dataSource): bool
32
    {
33
        $result = true;
34
35
        if ($node instanceof CombineInterface) {
36
            $result = $this->executeCombine($node, $dataSource);
37
        } elseif ($node instanceof ConditionInterface) {
38
            $result = $this->executeCondition($node, $dataSource->getValue($node->getValueIdentifier()));
39
        }
40
41
        return $result;
42
    }
43
44
    private function executeCombine(CombineInterface $combine, DataSource $dataSource): bool
45
    {
46
        $operator = $this->operatorPool->getOperator(OperatorPool::TYPE_LOGICAL, $combine->getOperator());
47
        $expressions = [];
48
49
        foreach ($combine->getChildren() as $child) {
50
            $expressions[] = $this->execute($child, $dataSource);
51
        }
52
53
        return ($combine->isInvert() xor $operator->execute(...$expressions));
54
    }
55
56
    private function executeCondition(ConditionInterface $condition, $value): bool
57
    {
58
        $operator = $this->operatorPool->getOperator(OperatorPool::TYPE_COMPARATOR, $condition->getOperator());
59
60
        return $operator->execute($value, $condition->getValueCompare());
61
    }
62
}
63