Skip to content

Commit c0c186e

Browse files
Query Field.
1 parent f9ca70d commit c0c186e

File tree

3 files changed

+125
-30
lines changed

3 files changed

+125
-30
lines changed

Fields/QueryField.php

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php namespace RestExtension\Fields;
2+
3+
class QueryField {
4+
5+
public $ignoreAuto = false;
6+
public ?string $fieldName;
7+
8+
public static function parse($field) {
9+
$item = new QueryField();
10+
11+
if ($field == "") {
12+
$item->fieldName = null;
13+
} else {
14+
$item->fieldName = $field;
15+
}
16+
17+
return $item;
18+
}
19+
20+
public function isRelationField(): bool {
21+
return strpos($this->fieldName, '.') !== false;
22+
}
23+
24+
}

QueryParser.php

+83-30
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?php namespace RestExtension;
2+
23
use CodeIgniter\HTTP\IncomingRequest;
34
use CodeIgniter\HTTP\Request;
5+
use RestExtension\Fields\QueryField;
46
use RestExtension\Filter\Operators;
57
use RestExtension\Filter\QueryFilter;
68
use RestExtension\Includes\QueryInclude;
@@ -17,6 +19,7 @@
1719
* @property QueryFilter[][] $searchFilters
1820
* @property QueryInclude[] $includes
1921
* @property QueryOrder[] $ordering
22+
* @property QueryField[] $fields
2023
* @property int $limit
2124
* @property int $offset
2225
* @property int $count
@@ -116,11 +119,21 @@ public function parseRequest(Request $request) {
116119

117120
if ($request instanceof IncomingRequest) {
118121
$includes = $request->getGet('include');
119-
if($includes) $this->parseInclude($request->getGet('include'));
122+
if ($includes) {
123+
$this->parseInclude($request->getGet('include'));
124+
}
120125
$filter = $request->getGet('filter');
121-
if($filter) $this->parseFilter($request->getGet('filter'));
126+
if ($filter) {
127+
$this->parseFilter($request->getGet('filter'));
128+
}
122129
$ordering = $request->getGet('ordering');
123-
if($ordering) $this->parseOrdering($request->getGet('ordering'));
130+
if ($ordering) {
131+
$this->parseOrdering($request->getGet('ordering'));
132+
}
133+
$fields = $request->getGet('fields');
134+
if ($fields) {
135+
$this->parseFields($request->getGet('fields'));
136+
}
124137

125138
$this->limit = $request->getGet('limit');
126139
$this->offset = $request->getGet('offset');
@@ -132,52 +145,72 @@ public static function parse($line) {
132145
$item = new QueryParser();
133146
parse_str($line, $params);
134147

135-
if(isset($params['include'])) $item->parseInclude($params['include']);
136-
if(isset($params['filter'])) $item->parseFilter($params['filter']);
137-
if(isset($params['ordering'])) $item->parseOrdering($params['ordering']);
148+
if (isset($params['include'])) {
149+
$item->parseInclude($params['include']);
150+
}
151+
if (isset($params['filter'])) {
152+
$item->parseFilter($params['filter']);
153+
}
154+
if (isset($params['ordering'])) {
155+
$item->parseOrdering($params['ordering']);
156+
}
157+
if (isset($params['fields'])) {
158+
$item->parseFields($params['fields']);
159+
}
138160

139-
if(isset($params['limit'])) $item->limit = $params['limit'];
140-
if(isset($params['offset'])) $item->offset = $params['offset'];
141-
if(isset($params['count'])) $item->count = $params['count'];
161+
if (isset($params['limit'])) {
162+
$item->limit = $params['limit'];
163+
}
164+
if (isset($params['offset'])) {
165+
$item->offset = $params['offset'];
166+
}
167+
if (isset($params['count'])) {
168+
$item->count = $params['count'];
169+
}
142170

143171
return $item;
144172
}
145173

146174

147175
public function parseInclude(string $value) {
148-
foreach(explode(',', $value) as $line) {
176+
foreach (explode(',', $value) as $line) {
149177
$this->includes[] = QueryInclude::parse($line);
150178
}
151179
}
152180

153181
public function parseOrdering(string $value) {
154-
foreach(explode(',', $value) as $line) {
182+
foreach (explode(',', $value) as $line) {
155183
$this->ordering[] = QueryOrder::parse($line);
156184
}
157185
}
158186

187+
public function parseFields(string $value) {
188+
foreach (explode(',', $value) as $line) {
189+
$this->fields[] = QueryField::parse($line);
190+
}
191+
}
159192

160193
public function parseFilter(string $line) {
161194
$filters = [];
162195
$buffer = '';
163196
$inSquareBracket = false;
164197
$inString = false;
165-
for($i = 0 ; $i < strlen($line) ; $i++) {
198+
for ($i = 0; $i < strlen($line); $i++) {
166199
$char = substr($line, $i, 1);
167200

168-
if(in_array($char, ['[', ']'])) $inSquareBracket = !$inSquareBracket;
169-
if(in_array($char, ['"', "'"])) $inString = !$inString;
201+
if (in_array($char, ['[', ']'])) $inSquareBracket = !$inSquareBracket;
202+
if (in_array($char, ['"', "'"])) $inString = !$inString;
170203

171-
if($char == ',' &! $inSquareBracket &! $inString) {
204+
if ($char == ',' & !$inSquareBracket & !$inString) {
172205
$filters[] = $buffer;
173206
$buffer = '';
174207
} else
175208
$buffer .= $char;
176209
}
177-
if(strlen($buffer))
210+
if (strlen($buffer))
178211
$filters[] = $buffer;
179212

180-
foreach($filters as $filter) {
213+
foreach ($filters as $filter) {
181214
$item = QueryFilter::parse($filter);
182215
$this->pushFilter($item->property, $item);
183216
}
@@ -188,13 +221,13 @@ public function parseFilter(string $line) {
188221
* @param Filter\QueryFilter $filter
189222
*/
190223
private function pushFilter($name, $filter) {
191-
switch($filter->operator) {
224+
switch ($filter->operator) {
192225
case Operators::Search:
193-
if(!isset($this->searchFilters[$name])) $this->searchFilters[$name] = [];
226+
if (!isset($this->searchFilters[$name])) $this->searchFilters[$name] = [];
194227
$this->searchFilters[$name][] = $filter;
195228
break;
196229
default:
197-
if(!isset($this->filters[$name])) $this->filters[$name] = [];
230+
if (!isset($this->filters[$name])) $this->filters[$name] = [];
198231
$this->filters[$name][] = $filter;
199232
}
200233
}
@@ -220,8 +253,8 @@ public function getFilter($name) {
220253
*/
221254
public function getFilters() {
222255
$all = [];
223-
foreach($this->filters as $name => $filters)
224-
foreach($filters as $filter)
256+
foreach ($this->filters as $name => $filters)
257+
foreach ($filters as $filter)
225258
$all[] = $filter;
226259
return $all;
227260
}
@@ -231,8 +264,8 @@ public function getFilters() {
231264
*/
232265
public function getSearchFilters() {
233266
$all = [];
234-
foreach($this->searchFilters as $name => $filters)
235-
foreach($filters as $filter)
267+
foreach ($this->searchFilters as $name => $filters)
268+
foreach ($filters as $filter)
236269
$all[] = $filter;
237270
return $all;
238271
}
@@ -286,25 +319,45 @@ public function getOrdering() {
286319
return $this->ordering;
287320
}
288321

322+
public function getFields() {
323+
return $this->fields;
324+
}
325+
326+
public function getFieldsArray() {
327+
$fields_arr = [];
328+
foreach ($this->getFields() as $field) {
329+
$fields_arr[] = $field->fieldName;
330+
}
331+
return $fields_arr;
332+
}
333+
334+
public function getFieldsImplode() {
335+
$fields_arr = array();
336+
foreach ($this->getFields() as $field) {
337+
$fields_arr[] = $field->fieldName;
338+
}
339+
return implode(',', $fields_arr);
340+
}
341+
289342
public function hasInclude(string $name): bool {
290-
foreach($this->includes as $include) {
291-
if($include->property == $name)
343+
foreach ($this->includes as $include) {
344+
if ($include->property == $name)
292345
return true;
293346
}
294347
return false;
295348
}
296349

297350
public function getInclude(string $name): ?QueryInclude {
298-
foreach($this->includes as $include) {
299-
if($include->property == $name)
351+
foreach ($this->includes as $include) {
352+
if ($include->property == $name)
300353
return $include;
301354
}
302355
return null;
303356
}
304357

305358
public function delInclude(string $name) {
306-
for($i = 0 ; $i < count($this->includes) ; $i++) {
307-
if($this->includes[$i]->property == $name) {
359+
for ($i = 0; $i < count($this->includes); $i++) {
360+
if ($this->includes[$i]->property == $name) {
308361
array_splice($this->includes, $i, 1);
309362
return;
310363
}

ResourceModelTrait.php

+18
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use OrmExtension\DataMapper\RelationDef;
44
use OrmExtension\Extensions\Entity;
55
use OrmExtension\Extensions\Model;
6+
use RestExtension\Fields\QueryField;
67
use RestExtension\Filter\Operators;
78
use RestExtension\Filter\QueryFilter;
89
use RestExtension\Includes\QueryInclude;
@@ -43,6 +44,11 @@ public function restGet($primaryKey, $queryParser) {
4344
$this->applyFilter($filter);
4445
}
4546
}
47+
foreach ($queryParser->getFields() as $field) {
48+
if (!$field->ignoreAuto) {
49+
$this->applyField($field);
50+
}
51+
}
4652
$searchFilters = $queryParser->getSearchFilters();
4753
if(count($searchFilters)) {
4854
$this->groupStart();
@@ -255,6 +261,18 @@ public function applyFilter(QueryFilter $filter) {
255261

256262
}
257263

264+
265+
/**
266+
* @param QueryField $field
267+
*/
268+
public function applyField(QueryField $field) {
269+
if ($field->isRelationField()) {
270+
// TODO Not yet implemented
271+
} else {
272+
$this->select($field->fieldName);
273+
}
274+
}
275+
258276
/**
259277
* @param Entity $item
260278
*/

0 commit comments

Comments
 (0)