Skip to content

Commit 039b4b7

Browse files
committed
completed Parser
1 parent 965db6b commit 039b4b7

File tree

3 files changed

+84
-63
lines changed

3 files changed

+84
-63
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@
2828
"PhpPlatform\\Tests\\" : "tests/"
2929
}
3030
},
31-
"minimum-stability" : "stable"
31+
"minimum-stability" : "stable",
32+
"license" : "Apache-2.0"
3233
}

composer.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/SearchQueryParser/Parser.php

Lines changed: 75 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use PhpPlatform\Errors\Exceptions\Application\BadInputException;
1111
use PhpPlatform\Persist\RelationalMappingUtil;
1212
use PhpPlatform\SearchQueryParser\FindParams;
13-
use PhpPlatform\Persist\Reflection;
1413

1514
class Parser {
1615

@@ -26,49 +25,13 @@ static public function parse($request,$modelClassName,$excludeFromFullTextSearch
2625
try{
2726
// full text search query
2827
$findParams->where = self::parseFullTextSearch($request, $modelClassName, $excludeFromFullTextSearch);
29-
30-
// filters
31-
32-
33-
// sort
34-
$sort = array();
35-
$sortParams = $request->getQueryParam('s');
36-
if($sortParams!= null){
37-
$sortParams= base64_decode($sortParams);
38-
$sortParams= json_decode($sortParams,true);
39-
if(!is_array($sortParams)){
40-
throw new BadInputException("query parameter s is invalid");
41-
}
42-
43-
foreach ($sortParams as $field=>$value){
44-
if(in_array($field, $fields)){
45-
if($value != Model::SORTBY_ASC && $value != Model::SORTBY_DESC){
46-
throw new BadRequest("query parameter s is invalid");
47-
}
48-
$sort[$field] = $value;
49-
}else{
50-
throw new BadRequest("query parameter s is invalid");
51-
}
52-
}
53-
}
54-
55-
// pagination
56-
$pagination = null;
57-
$paginationParam = $request->getQueryParam('p');
58-
if($paginationParam != null){
59-
$paginationParam = preg_split('/-/', $paginationParam);
60-
if(count($paginationParam) != 2 ||
61-
(!is_numeric($paginationParam[0]) || !is_int($paginationParam[0]+0)) ||
62-
(!is_numeric($paginationParam[0]) || !is_int($paginationParam[1]+0)) ){
63-
throw new BadRequest('query parameter p is invalid');
64-
}
65-
$pagination = array('pageNumber'=>$paginationParam[0],'pageSize'=>$paginationParam[1]);
66-
}
67-
28+
$findParams->filters = self::parseFilters($request, $modelClassName);
29+
$findParams->sort = self::parseSort($request, $modelClassName);
30+
$findParams->pagination = self::parsePagination($request);
6831
}catch (\Exception $e){
6932
throw new BadRequest("Bad Search Params");
7033
}
71-
return ["filters" => $filters,"sort"=>$sort,"pagination"=>$pagination,"where"=>$whereExpression];
34+
$findParams;
7235
}
7336

7437
private static function parseFullTextSearch($request,$modelClassName,$excludeFromFullTextSearch){
@@ -99,26 +62,83 @@ private static function parseFilters($request,$modelClassName){
9962
throw new BadInputException("query parameter f is invalid");
10063
}
10164

102-
foreach ($fieldSpecificFilters as $field=>$value){
103-
Reflection::hasProperty($modelClassName, $field);
104-
if(in_array($field, $fields)){
105-
if(is_scalar($value)){
106-
$filters[$field] = $value;
107-
}else if(is_array($value)){
108-
foreach ($value as $operator=>$operands){
109-
// expression validates for the valid expression syntax
110-
new Expression($operator, [new Field($modelClassName, $field), $operands]);
65+
$classList = RelationalMappingUtil::getClassConfiguration($modelClassName);
66+
67+
foreach ($classList as $className=>$class){
68+
foreach ($class['fields'] as $fieldName=>$field){
69+
if(RelationalMappingUtil::_isGet($field) && in_array($fieldName, $fieldSpecificFilters)){
70+
$filterValue = $fieldSpecificFilters[$fieldName];
71+
if(is_scalar($filterValue)){
72+
$filters[$fieldName]=$filterValue;
73+
}else if (is_array($filterValue) && count($filterValue) == 1){
74+
foreach ($filterValue as $operator=>$operands){
75+
// expression validates for the valid expression syntax
76+
try{
77+
new Expression($operator, [new Field($className, $field), $operands]);
78+
}catch (\Exception $e){
79+
throw new BadRequest("query parameter f is invalid");
80+
}
81+
}
82+
$filters[$fieldName] = $filterValue;
83+
}else{
84+
throw new BadRequest("query parameter f is invalid");
11185
}
112-
$filters[$field] = $value;
113-
}else{
114-
throw new BadRequest("query parameter f is invalid");
86+
unset($fieldSpecificFilters[$fieldName]);
11587
}
116-
}else{
117-
throw new BadRequest("query parameter f is invalid");
11888
}
11989
}
90+
91+
if(count($fieldSpecificFilters) != 0){
92+
throw new BadRequest("query parameter f is invalid");
93+
}
12094
}
12195
return $filters;
12296
}
12397

98+
private static function parseSort($request,$modelClassName){
99+
$sort = array();
100+
$sortParams = $request->getQueryParam('s');
101+
if($sortParams!= null){
102+
$sortParams= base64_decode($sortParams);
103+
$sortParams= json_decode($sortParams,true);
104+
if(!is_array($sortParams)){
105+
throw new BadInputException("query parameter s is invalid");
106+
}
107+
108+
$classList = RelationalMappingUtil::getClassConfiguration($modelClassName);
109+
110+
foreach ($classList as $class){
111+
foreach ($class['fields'] as $fieldName=>$field){
112+
if(RelationalMappingUtil::_isGet($field) && in_array($fieldName, $sortParams)){
113+
$sortValue = $sortParams[$fieldName];
114+
if($sortValue != Model::SORTBY_ASC && $sortValue != Model::SORTBY_DESC){
115+
throw new BadRequest("query parameter s is invalid");
116+
}
117+
$sort[$field] = $sortValue;
118+
unset($sortParams[$fieldName]);
119+
}
120+
}
121+
}
122+
if(count($sortParams) != 0){
123+
throw new BadRequest("query parameter s is invalid");
124+
}
125+
}
126+
return $sort;
127+
}
128+
129+
private static function parsePagination($request){
130+
$pagination = null;
131+
$paginationParam = $request->getQueryParam('p');
132+
if($paginationParam != null){
133+
$paginationParam = preg_split('/-/', $paginationParam);
134+
if(count($paginationParam) != 2 ||
135+
(!is_numeric($paginationParam[0]) || !is_int($paginationParam[0]+0)) ||
136+
(!is_numeric($paginationParam[0]) || !is_int($paginationParam[1]+0)) ){
137+
throw new BadRequest('query parameter p is invalid');
138+
}
139+
$pagination = array('pageNumber'=>$paginationParam[0],'pageSize'=>$paginationParam[1]);
140+
}
141+
return $pagination;
142+
}
143+
124144
}

0 commit comments

Comments
 (0)