1010use PhpPlatform \Errors \Exceptions \Application \BadInputException ;
1111use PhpPlatform \Persist \RelationalMappingUtil ;
1212use PhpPlatform \SearchQueryParser \FindParams ;
13- use PhpPlatform \Persist \Reflection ;
1413
1514class 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