Completed
Push — master ( 82eb41...4f6b0a )
by Alexander
03:49
created

Parser::createDefaultNodeParser()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 46
Code Lines 39

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 38
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 46
ccs 38
cts 38
cp 1
rs 8.9411
cc 1
eloc 39
nc 1
nop 0
crap 1
1
<?php
2
namespace Xiag\Rql\Parser;
3
4
use Xiag\Rql\Parser\Exception\SyntaxErrorException;
5
use Xiag\Rql\Parser\NodeParser\Query\LogicalOperator;
6
use Xiag\Rql\Parser\NodeParser\Query\ComparisonOperator;
7
8
class Parser
9
{
10
    /**
11
     * @var NodeParserInterface
12
     */
13
    protected $nodeParser;
14
15
    /**
16
     * @param NodeParserInterface $nodeParser
17
     */
18 64
    public function __construct(NodeParserInterface $nodeParser = null)
19
    {
20 64
        $this->nodeParser = $nodeParser ?: static::createDefaultNodeParser();
21 64
    }
22
23
    /**
24
     * @param NodeParserInterface $nodeParser
25
     * @return $this
26
     * @codeCoverageIgnore
27
     */
28
    public function setNodeParser(NodeParserInterface $nodeParser)
29
    {
30
        $this->nodeParser = $nodeParser;
31
        return $this;
32
    }
33
34
    /**
35
     * @return NodeParserInterface
36
     * @codeCoverageIgnore
37
     */
38
    public function getNodeParser()
39
    {
40
        return $this->nodeParser;
41
    }
42
43
    /**
44
     * @return NodeParserInterface
45
     */
46 64
    public static function createDefaultNodeParser()
47
    {
48 64
        $scalarParser = (new ValueParser\ScalarParser())
49 64
            ->registerTypeCaster('string', new TypeCaster\StringTypeCaster())
50 64
            ->registerTypeCaster('integer', new TypeCaster\IntegerTypeCaster())
51 64
            ->registerTypeCaster('float', new TypeCaster\FloatTypeCaster())
52 64
            ->registerTypeCaster('boolean', new TypeCaster\BooleanTypeCaster());
53 64
        $arrayParser = new ValueParser\ArrayParser($scalarParser);
54 64
        $globParser = new ValueParser\GlobParser();
55 64
        $fieldParser = new ValueParser\FieldParser();
56 64
        $integerParser = new ValueParser\IntegerParser();
57
58 64
        $queryNodeParser = new NodeParser\QueryNodeParser();
59
        $queryNodeParser
60 64
            ->addNodeParser(new NodeParser\Query\GroupNodeParser($queryNodeParser))
61
62 64
            ->addNodeParser(new LogicalOperator\AndNodeParser($queryNodeParser))
63 64
            ->addNodeParser(new LogicalOperator\OrNodeParser($queryNodeParser))
64 64
            ->addNodeParser(new LogicalOperator\NotNodeParser($queryNodeParser))
65
66 64
            ->addNodeParser(new ComparisonOperator\Rql\InNodeParser($fieldParser, $arrayParser))
67 64
            ->addNodeParser(new ComparisonOperator\Rql\OutNodeParser($fieldParser, $arrayParser))
68 64
            ->addNodeParser(new ComparisonOperator\Rql\EqNodeParser($fieldParser, $scalarParser))
69 64
            ->addNodeParser(new ComparisonOperator\Rql\NeNodeParser($fieldParser, $scalarParser))
70 64
            ->addNodeParser(new ComparisonOperator\Rql\LtNodeParser($fieldParser, $scalarParser))
71 64
            ->addNodeParser(new ComparisonOperator\Rql\GtNodeParser($fieldParser, $scalarParser))
72 64
            ->addNodeParser(new ComparisonOperator\Rql\LeNodeParser($fieldParser, $scalarParser))
73 64
            ->addNodeParser(new ComparisonOperator\Rql\GeNodeParser($fieldParser, $scalarParser))
74 64
            ->addNodeParser(new ComparisonOperator\Rql\LikeNodeParser($fieldParser, $globParser))
75
76 64
            ->addNodeParser(new ComparisonOperator\Fiql\InNodeParser($fieldParser, $arrayParser))
77 64
            ->addNodeParser(new ComparisonOperator\Fiql\OutNodeParser($fieldParser, $arrayParser))
78 64
            ->addNodeParser(new ComparisonOperator\Fiql\EqNodeParser($fieldParser, $scalarParser))
79 64
            ->addNodeParser(new ComparisonOperator\Fiql\NeNodeParser($fieldParser, $scalarParser))
80 64
            ->addNodeParser(new ComparisonOperator\Fiql\LtNodeParser($fieldParser, $scalarParser))
81 64
            ->addNodeParser(new ComparisonOperator\Fiql\GtNodeParser($fieldParser, $scalarParser))
82 64
            ->addNodeParser(new ComparisonOperator\Fiql\LeNodeParser($fieldParser, $scalarParser))
83 64
            ->addNodeParser(new ComparisonOperator\Fiql\GeNodeParser($fieldParser, $scalarParser))
84 64
            ->addNodeParser(new ComparisonOperator\Fiql\LikeNodeParser($fieldParser, $globParser));
85
86 64
        return (new NodeParserChain())
87 64
            ->addNodeParser($queryNodeParser)
88 64
            ->addNodeParser(new NodeParser\SelectNodeParser($fieldParser))
89 64
            ->addNodeParser(new NodeParser\SortNodeParser($fieldParser))
90 64
            ->addNodeParser(new NodeParser\LimitNodeParser($integerParser));
91
    }
92
93
    /**
94
     * @param TokenStream $tokenStream
95
     * @return Query
96
     * @throws SyntaxErrorException
97
     */
98 64
    public function parse(TokenStream $tokenStream)
99
    {
100 64
        $queryBuilder = $this->createQueryBuilder();
101 64
        while (!$tokenStream->isEnd()) {
102 64
            $queryBuilder->addNode($this->nodeParser->parse($tokenStream));
103 48
            $tokenStream->nextIf(Token::T_AMPERSAND);
104 48
        }
105
106 48
        return $queryBuilder->getQuery();
107
    }
108
109
    /**
110
     * @return QueryBuilder
111
     */
112 64
    protected function createQueryBuilder()
113
    {
114 64
        return new QueryBuilder();
115
    }
116
}
117