-
Notifications
You must be signed in to change notification settings - Fork 15
/
01-only-fiql-operator.php
51 lines (43 loc) · 2.5 KB
/
01-only-fiql-operator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
namespace Graviton\RqlParserExample01;
use Graviton\RqlParser\Lexer;
use Graviton\RqlParser\Parser;
use Graviton\RqlParser\NodeParserChain;
use Graviton\RqlParser\ValueParser;
use Graviton\RqlParser\TypeCaster;
use Graviton\RqlParser\NodeParser;
require __DIR__ . '/../vendor/autoload.php';
$scalarParser = (new ValueParser\ScalarParser())
->registerTypeCaster('string', new TypeCaster\StringTypeCaster())
->registerTypeCaster('integer', new TypeCaster\IntegerTypeCaster())
->registerTypeCaster('float', new TypeCaster\FloatTypeCaster())
->registerTypeCaster('boolean', new TypeCaster\BooleanTypeCaster());
$arrayParser = new ValueParser\ArrayParser($scalarParser);
$globParser = new ValueParser\GlobParser();
$fieldParser = new ValueParser\FieldParser();
$integerParser = new ValueParser\IntegerParser();
$queryNodeParser = new NodeParser\QueryNodeParser();
$queryNodeParser
->addNodeParser(new NodeParser\Query\GroupNodeParser($queryNodeParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\InNodeParser($fieldParser, $arrayParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\OutNodeParser($fieldParser, $arrayParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\EqNodeParser($fieldParser, $scalarParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\NeNodeParser($fieldParser, $scalarParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\LtNodeParser($fieldParser, $scalarParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\GtNodeParser($fieldParser, $scalarParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\LeNodeParser($fieldParser, $scalarParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\GeNodeParser($fieldParser, $scalarParser))
->addNodeParser(new NodeParser\Query\ComparisonOperator\Fiql\LikeNodeParser($fieldParser, $globParser));
$nodeParser = (new NodeParserChain())
->addNodeParser($queryNodeParser)
->addNodeParser(new NodeParser\SelectNodeParser($fieldParser))
->addNodeParser(new NodeParser\SortNodeParser($fieldParser))
->addNodeParser(new NodeParser\LimitNodeParser($integerParser));
$lexer = new Lexer();
$parser = new Parser($nodeParser);
// ok
$tokenStream = $lexer->tokenize('((a==true()|b!=str)&c>=10&d=in=(1,value,null()))');
var_dump($parser->parse($tokenStream));
// error
$tokenStream = $lexer->tokenize('or(eq(a,true),ne(b,str))>e(c,10)&in(d,(1,value,null()))');
var_dump($parser->parse($tokenStream));