BaseFunction::getSql()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 4
nc 3
nop 1
dl 0
loc 8
ccs 5
cts 5
cp 1
crap 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6
7
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
8
use Doctrine\ORM\Query\AST\Node;
9
use Doctrine\ORM\Query\Lexer;
10
use Doctrine\ORM\Query\Parser;
11
use Doctrine\ORM\Query\SqlWalker;
12
use Doctrine\ORM\Query\TokenType;
13
use MartinGeorgiev\Utils\DoctrineOrm;
14
15
/**
16
 * @since 0.1
17
 *
18
 * @author Martin Georgiev <[email protected]>
19
 */
20
abstract class BaseFunction extends FunctionNode
21
{
22
    protected string $functionPrototype;
23
24
    /**
25
     * @var list<string>
0 ignored issues
show
Bug introduced by
The type MartinGeorgiev\Doctrine\...uery\AST\Functions\list was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
26
     */
27
    protected array $nodesMapping = [];
28
29
    /**
30
     * @var list<Node|null>
31
     */
32
    protected array $nodes = [];
33
34
    /**
35
     * This method is meant for internal use only, and it is not suggested that the forks of the library depend on it.
36
     * It will be made abstract from version 3.0.
37
     *
38
     * @internal
39
     *
40
     * @see customiseFunction()
41
     */
42
    /* abstract */
43
    protected function customizeFunction(): void
44
    {
45
        // Void
46
    }
47
48
    /**
49
     * @deprecated
50
     */
51
    protected function customiseFunction(): void
52
    {
53
        \trigger_error('The internal-use method of `customiseFunction()` is deprecated and is now renamed to `customizeFunction()`. `customiseFunction()` will be removed from version 3.0 onwards.', E_USER_DEPRECATED);
54
        $this->customizeFunction();
55
    }
56
57 189
    protected function setFunctionPrototype(string $functionPrototype): void
58
    {
59 189
        $this->functionPrototype = $functionPrototype;
60
    }
61
62 87
    protected function addNodeMapping(string $parserMethod): void
63
    {
64 87
        $this->nodesMapping[] = $parserMethod;
65
    }
66
67 182
    public function parse(Parser $parser): void
68
    {
69 182
        $shouldUseLexer = DoctrineOrm::isPre219();
70
71 182
        $this->customizeFunction();
72
73 182
        $parser->match($shouldUseLexer ? Lexer::T_IDENTIFIER : TokenType::T_IDENTIFIER);
0 ignored issues
show
Bug introduced by
The constant Doctrine\ORM\Query\Lexer::T_IDENTIFIER was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
74 182
        $parser->match($shouldUseLexer ? Lexer::T_OPEN_PARENTHESIS : TokenType::T_OPEN_PARENTHESIS);
0 ignored issues
show
Bug introduced by
The constant Doctrine\ORM\Query\Lexer::T_OPEN_PARENTHESIS was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
75 182
        $this->feedParserWithNodes($parser);
76 126
        $parser->match($shouldUseLexer ? Lexer::T_CLOSE_PARENTHESIS : TokenType::T_CLOSE_PARENTHESIS);
0 ignored issues
show
Bug introduced by
The constant Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
77
    }
78
79
    /**
80
     * Feeds given parser with previously set nodes.
81
     */
82 82
    protected function feedParserWithNodes(Parser $parser): void
83
    {
84 82
        $nodesMappingCount = \count($this->nodesMapping);
85 82
        $lastNode = $nodesMappingCount - 1;
86 82
        for ($i = 0; $i < $nodesMappingCount; $i++) {
87 82
            $parserMethod = $this->nodesMapping[$i];
88
            // @phpstan-ignore-next-line
89 82
            $this->nodes[$i] = $parser->{$parserMethod}();
90 82
            if ($i < $lastNode) {
91 56
                $parser->match(\class_exists(TokenType::class) ? TokenType::T_COMMA : Lexer::T_COMMA);
0 ignored issues
show
Bug introduced by
The constant Doctrine\ORM\Query\Lexer::T_COMMA was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
92
            }
93
        }
94
    }
95
96 80
    public function getSql(SqlWalker $sqlWalker): string
97
    {
98 80
        $dispatched = [];
99 80
        foreach ($this->nodes as $node) {
100 80
            $dispatched[] = $node instanceof Node ? $node->dispatch($sqlWalker) : 'null';
101
        }
102
103 80
        return \vsprintf($this->functionPrototype, $dispatched);
104
    }
105
}
106