Word   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 46
Duplicated Lines 0 %

Test Coverage

Coverage 94.74%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 17
c 1
b 0
f 1
dl 0
loc 46
ccs 18
cts 19
cp 0.9474
rs 10
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A accept() 0 3 2
A visit() 0 25 6
1
<?php declare(strict_types = 1);
2
3
namespace Apicart\FQL\Generator\SQL;
4
5
use Apicart\FQL\Generator\Common\AbstractVisitor;
6
use Apicart\FQL\Generator\SQL\Resolver\AbstractFilterResolver;
7
use Apicart\FQL\Token\Node\Group as GroupNode;
8
use Apicart\FQL\Token\Node\Term;
9
use Apicart\FQL\Token\Token\Word as WordToken;
10
use Apicart\FQL\Value\AbstractNode;
11
use LogicException;
12
13
final class Word extends AbstractVisitor
14
{
15
16
    /**
17
     * @var AbstractFilterResolver
18
     */
19
    private $filterResolver;
20
21
22 1
    public function __construct(AbstractFilterResolver $filterResolver)
23
    {
24 1
        $this->filterResolver = $filterResolver;
25 1
    }
26
27
28 1
    public function accept(AbstractNode $node): bool
29
    {
30 1
        return $node instanceof Term && $node->getToken() instanceof WordToken;
31
    }
32
33
34 1
    public function visit(AbstractNode $node, ?AbstractVisitor $subVisitor = null, ?array $options = null): string
35
    {
36
        /** @var Term $termNode */
37 1
        $termNode = $node;
38
        /** @var WordToken $token */
39 1
        $token = $termNode->getToken();
40 1
        $domain = $token->getDomain();
41
42 1
        if ($domain === '') {
43 1
            $parent = $options['parent'] ?? false;
44 1
            if ($parent instanceof GroupNode) {
45 1
                $tokenLeft = $parent->getTokenLeft();
46 1
                if ($tokenLeft !== null) {
47 1
                    $domain = $tokenLeft->getDomain();
48
                }
49
            }
50
51 1
            if ($domain === '' || $domain === null) {
52
                throw new LogicException('Missing required domain');
53
            }
54
        }
55
56 1
        $wordEscaped = preg_replace('/([\\\'"+\-!():#@ ])/', '\\\\$1', $token->getWord());
57
58 1
        return $this->filterResolver->resolve($domain, $wordEscaped);
59
    }
60
61
}
62