byteferry / rql-parser
A PHP parser for parsing the resource query language(RQL) to php data structure
0.1.2
2021-05-15 15:58 UTC
Requires
- php: >=7.1.0
Requires (Dev)
- orchestra/testbench: ^5.5
- phpunit/phpunit: ^4.8|^5.2|^7.0|^8.0
This package is auto-updated.
Last update: 2024-11-15 23:30:32 UTC
README
ByteFerry RQL-Parser is used for parsing the RQL text to the paramaters with PHP array structure for the calling of php methods.
This library consists of the following parts:
- lexer for tokenization RQL code
- parser for creating abstract syntax tree
- builder using simplized ABNF of RQL
Features
- High performance. The size of source code is less than 60KB.
- It is fully according the compile specification.
- Friendly for development with the checking of RQL grammer.
- Support the both reading and writing query.
- Support
filter
sort
search
andpagination
- Fully tested with phpUnit.
- Zero dependencies.
Why RQL
- For the same data, RQL has much fewer bytes than JSON.
- Simple and easy to learn.
- RQL will make the API interface more flexible
- RQL is more suitable for small and medium-sized projects than GraphQL.
- RQL can save you more development time.
Installation
$ composer requrire byteferry/rql-Parser
Usage
- parser a full query
use ByteFerry/RqlParser/Parser; $rql_string = 'any(User,columns(id,name,age,gender,address),filter(eq(age,19)))'; try{ $query = Parser::parse( $rql_string); }catch(\Exception $e){ // will catch errror of parse or grammer checking. }
if sucess, it will return a QueryInterface.
- parser a query segment of RQL query
use ByteFerry/RqlParser/Parser; $rql_string = 'filter(eq(age,19))'; try{ $query = Parser::parse( $rql_string, true); }catch(\Exception $e){ // will catch errror of parse or grammer checking. }
Here is a complex example. (Not a real query, but returns all properties)
$rql_str= 'all(User,aggr(id,name,age,gender,address,avg(age)),filter(is(created_at, null()), search(Jhon),sort(-id,+age),having(gt(sum(amount),0)),limit(0,20)))'; //, //, $result = Parser::parse($rql_str); // Returns: /** array ( 0 => ByteFerry\RqlParser\Query::__set_state(array( 'container' => array ( 'resource' => 'User', 'columns' => array ( 0 => 'id', 1 => 'name', 2 => 'age', 3 => 'gender', 4 => 'address', 5 => 'avg(age)', ), 'columns_operator' => 'aggr', 'group_by' => array ( 0 => 'id', 1 => 'name', 2 => 'age', 3 => 'gender', 4 => 'address', ), 'filter' => array ( 0 => ' created_at is null ', ), 'paramaters' => array ( 'created_at' => NULL, 'sum(amount)' => '0', ), 'search' => 'Jhon%', 'sort' => array ( 0 => array ( 0 => 'id', 1 => 'DESC', ), 1 => array ( 0 => 'age', 1 => 'ASC', ), ), 'having' => array ( 0 => ' sum(amount) > 0 ', ), 'limit' => array ( 0 => '0', 1 => '20', ), 'operator' => 'all', 'query_type' => 'Q_READ', ), )), ) */
We could see that the parser add groupby automatically, and returns the property parematers for validation.
Documentation
Contribution
- Fork the repository
- Create Feat_xxx branch
- Commit your code
- Create Pull Request
Donation
If you find this project useful, you can buy author a glass of juice 🍹
License
MIT
Copyright [2020] ByteFerry byteferry@qq.com