Word::visit()   A
last analyzed

Complexity

Conditions 6
Paths 7

Size

Total Lines 25
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 6.0131

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 6
eloc 13
c 1
b 0
f 1
nc 7
nop 3
dl 0
loc 25
ccs 13
cts 14
cp 0.9286
crap 6.0131
rs 9.2222
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