GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Pull Request — 2.2 (#156)
by Simone
03:17 queued 14s
created

BaseRepository::getLastQuery()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 0
cts 3
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
3
namespace Mado\QueryBundle\Repositories;
4
5
use Doctrine\ORM\EntityRepository;
6
use Hateoas\Configuration\Route;
0 ignored issues
show
Bug introduced by
The type Hateoas\Configuration\Route was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
7
use Hateoas\Representation\Factory\PagerfantaFactory;
0 ignored issues
show
Bug introduced by
The type Hateoas\Representation\Factory\PagerfantaFactory was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
use Mado\QueryBundle\Objects\MetaDataAdapter;
9
use Mado\QueryBundle\Queries\QueryBuilderFactory;
10
use Mado\QueryBundle\Queries\QueryBuilderOptions;
11
use Pagerfanta\Adapter\DoctrineORMAdapter;
12
use Pagerfanta\Pagerfanta;
13
use Symfony\Component\HttpFoundation\Request;
14
15
class BaseRepository extends EntityRepository
16
{
17
    protected $request;
18
19
    protected $use_result_cache = false;
20
21
    protected $route_name;
22
23
    protected $currentEntityAlias;
24
25
    protected $embeddedFields;
26
27
    protected $joins = [];
28
29
    protected $queryBuilderFactory;
30
31
    protected $queryOptions;
32
33
    protected $metadata;
34
35
    public function __construct($manager, $class)
36
    {
37
        parent::__construct($manager, $class);
38
39
        $this->metadata = new MetaDataAdapter();
40
        $this->metadata->setClassMetadata($this->getClassMetadata());
41
        $this->metadata->setEntityName($this->getEntityName());
42
43
        $this->queryBuilderFactory = new QueryBuilderFactory($this->getEntityManager());
44
    }
45
46
    public function initFromQueryBuilderOptions(QueryBuilderOptions $options)
47
    {
48
        $this->queryBuilderFactory->createQueryBuilder(
49
            $this->getEntityName(),
50
            $this->metadata->getEntityAlias()
51
        );
52
53
        $this->queryBuilderFactory->loadMetadataAndOptions(
54
            $this->metadata,
55
            $options
56
        );
57
    }
58
59
    public function getQueryBuilderFactory()
60
    {
61
        $this->initFromQueryBuilderOptions($this->queryOptions);
62
63
        return $this->queryBuilderFactory;
64
    }
65
66
    public function useResultCache($bool)
67
    {
68
        $this->use_result_cache = $bool;
69
    }
70
71
    public function setRequest(Request $request)
72
    {
73
        return $this->setQueryOptionsFromRequest($request);
74
    }
75
76
    public function setRequestWithFilter(Request $request, $filter)
77
    {
78
        return $this->setQueryOptionsFromRequestWithCustomFilter($request, $filter);
79
    }
80
81
    public function setRequestWithOrFilter(Request $request, $orFilter)
82
    {
83
        return $this->setQueryOptionsFromRequestWithCustomOrFilter($request, $orFilter);
84
    }
85
86
    public function setQueryOptions(QueryBuilderOptions $options)
87
    {
88
        $this->queryOptions = $options;
89
    }
90
91
    public function setQueryOptionsFromRequest(Request $request = null)
92
    {
93
        $requestAttributes = [];
94
        foreach ($request->attributes->all() as $attributeName => $attributeValue) {
95
            $requestAttributes[$attributeName] = $request->attributes->get(
96
                $attributeName,
97
                $attributeValue
98
            );
99
        }
100
101
        $filters     = $request->query->get('filtering', []);
102
        $orFilters   = $request->query->get('filtering_or', []);
103
        $sorting     = $request->query->get('sorting', []);
104
        $printing    = $request->query->get('printing', []);
105
        $rel         = $request->query->get('rel', '');
106
        $page        = $request->query->get('page', '');
107
        $select      = $request->query->get('select', $this->metadata->getEntityAlias());
108
        $pageLength  = $request->query->get('limit', 666);
0 ignored issues
show
Unused Code introduced by
The assignment to $pageLength is dead and can be removed.
Loading history...
109
        $filtering   = $request->query->get('filtering', '');
110
        $limit       = $request->query->get('limit', '');
111
112
        $filterOrCorrected = [];
113
114
        $count = 0;
115
        foreach ($orFilters as $key => $filter) {
116
            if (is_array($filter)) {
117
                foreach ($filter as $keyInternal => $internal) {
118
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
119
                    $count = $count + 1;
120
                }
121
            } else {
122
                $filterOrCorrected[$key] = $filter;
123
            }
124
        }
125
126
        $requestProperties = [
127
            'filtering'   => $filtering,
128
            'orFiltering' => $filterOrCorrected,
129
            'limit'       => $limit,
130
            'page'        => $page,
131
            'filters'     => $filters,
132
            'orFilters'   => $filterOrCorrected,
133
            'sorting'     => $sorting,
134
            'rel'         => $rel,
135
            'printing'    => $printing,
136
            'select'      => $select,
137
        ];
138
139
        $options = array_merge(
140
            $requestAttributes,
141
            $requestProperties
142
        );
143
144
        $this->queryOptions = QueryBuilderOptions::fromArray($options);
145
146
        return $this;
147
    }
148
149
    public function setQueryOptionsFromRequestWithCustomFilter(Request $request = null, $filter)
150
    {
151
        $filters = $request->query->get('filtering', []);
152
        $orFilters = $request->query->get('filtering_or', []);
153
        $sorting = $request->query->get('sorting', []);
154
        $printing = $request->query->get('printing', []);
155
        $rel = $request->query->get('rel', '');
156
        $page = $request->query->get('page', '');
157
        $select = $request->query->get('select', $this->metadata->getEntityAlias());
158
        $pageLength = $request->query->get('limit', 666);
0 ignored issues
show
Unused Code introduced by
The assignment to $pageLength is dead and can be removed.
Loading history...
159
        $filtering = $request->query->get('filtering', '');
160
        $limit = $request->query->get('limit', '');
161
162
        $filters = array_merge($filters, $filter);
163
164
        $filterOrCorrected = [];
165
166
        $count = 0;
167
        foreach ($orFilters as $key => $filter) {
0 ignored issues
show
introduced by
$filter is overwriting one of the parameters of this function.
Loading history...
168
            if (is_array($filter)) {
169
                foreach ($filter as $keyInternal => $internal) {
170
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
171
                    $count = $count + 1;
172
                }
173
            } else {
174
                $filterOrCorrected[$key] = $filter;
175
            }
176
        }
177
178
        $this->queryOptions = QueryBuilderOptions::fromArray([
179
            '_route' => $request->attributes->get('_route'),
180
            'customer_id' => $request->attributes->get('customer_id'),
181
            'id' => $request->attributes->get('id'),
182
            'filtering' => $filtering,
183
            'limit' => $limit,
184
            'page' => $page,
185
            'filters' => $filters,
186
            'orFilters' => $filterOrCorrected,
187
            'sorting' => $sorting,
188
            'rel' => $rel,
189
            'printing' => $printing,
190
            'select' => $select,
191
        ]);
192
193
        return $this;
194
    }
195
196
    public function setQueryOptionsFromRequestWithCustomOrFilter(Request $request = null, $orFilter)
197
    {
198
        $filters = $request->query->get('filtering', []);
199
        $orFilters = $request->query->get('filtering_or', []);
200
        $sorting = $request->query->get('sorting', []);
201
        $printing = $request->query->get('printing', []);
202
        $rel = $request->query->get('rel', '');
203
        $page = $request->query->get('page', '');
204
        $select = $request->query->get('select', $this->metadata->getEntityAlias());
205
        $pageLength = $request->query->get('limit', 666);
0 ignored issues
show
Unused Code introduced by
The assignment to $pageLength is dead and can be removed.
Loading history...
206
        $filtering = $request->query->get('filtering', '');
207
        $limit = $request->query->get('limit', '');
208
209
        $orFilters = array_merge($orFilters, $orFilter);
210
211
        $filterOrCorrected = [];
212
213
        $count = 0;
214
        foreach ($orFilters as $key => $filter) {
215
            if (is_array($filter)) {
216
                foreach ($filter as $keyInternal => $internal) {
217
                    $filterOrCorrected[$keyInternal . '|' . $count] = $internal;
218
                    $count = $count + 1;
219
                }
220
            } else {
221
                $filterOrCorrected[$key] = $filter;
222
            }
223
        }
224
225
        $this->queryOptions = QueryBuilderOptions::fromArray([
226
            '_route' => $request->attributes->get('_route'),
227
            'customer_id' => $request->attributes->get('customer_id'),
228
            'id' => $request->attributes->get('id'),
229
            'filtering' => $filtering,
230
            'limit' => $limit,
231
            'page' => $page,
232
            'filters' => $filters,
233
            'orFilters' => $filterOrCorrected,
234
            'sorting' => $sorting,
235
            'rel' => $rel,
236
            'printing' => $printing,
237
            'select' => $select,
238
        ]);
239
240
        return $this;
241
    }
242
243
    public function getRequest()
244
    {
245
        return $this->request;
246
    }
247
248
    public function setRouteName($route_name = '')
249
    {
250
        $this->route_name = $route_name;
251
        return $this;
252
    }
253
254
    public function findAllPaginated()
255
    {
256
        $this->initFromQueryBuilderOptions($this->queryOptions);
257
258
        $this->queryBuilderFactory->filter();
259
        $this->queryBuilderFactory->sort();
260
261
        $queryBuilder = $this->queryBuilderFactory->getQueryBuilder();
262
263
        $this->lastQuery = $queryBuilder->getQuery()->getSql();
0 ignored issues
show
Bug Best Practice introduced by
The property lastQuery does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
264
        $this->lastParameters = $queryBuilder->getQuery()->getParameters();
0 ignored issues
show
Bug Best Practice introduced by
The property lastParameters does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
265
266
        return $this->paginateResults($queryBuilder);
267
    }
268
269
    public function getLastQuery()
270
    {
271
        return [
272
            'query' => $this->lastQuery,
273
            'params' =>  $this->lastParameters,
274
        ];
275
    }
276
277
    protected function paginateResults(
278
        \Doctrine\ORM\QueryBuilder $queryBuilder
279
    ) {
280
        $limit = $this->queryOptions->get('limit', 10);
281
        $page = $this->queryOptions->get('page', 1);
282
283
284
        $pagerAdapter = new DoctrineORMAdapter($queryBuilder);
285
286
        $query = $pagerAdapter->getQuery();
287
        if (isset($this->use_result_cache) and $this->use_result_cache) {
288
            $query->useResultCache(true, 600);
289
        }
290
291
        $pager = new Pagerfanta($pagerAdapter);
292
        $pager->setNormalizeOutOfRangePages(true);
293
        $pager->setMaxPerPage($limit);
294
        $pager->setCurrentPage($page);
295
296
        $pagerFactory = new PagerfantaFactory();
297
298
        $router = $this->createRouter();
299
300
        $results = $pagerFactory->createRepresentation($pager, $router);
301
302
        return $results;
303
    }
304
305
    protected function customQueryStringValues()
306
    {
307
        return [];
308
    }
309
310
    protected function createRouter()
311
    {
312
        $request = $this->getRequest();
0 ignored issues
show
Unused Code introduced by
The assignment to $request is dead and can be removed.
Loading history...
313
        $params = [];
314
315
        $list = array_merge([
316
            'filtering',
317
            'limit',
318
            'page',
319
            'sorting',
320
        ], $this->customQueryStringValues());
321
322
        foreach ($list as $itemKey => $itemValue) {
323
            $params[$itemValue] = $this->queryOptions->get($itemValue);
324
        }
325
326
        if (!isset($this->route_name)) {
327
            $this->route_name = $this->queryOptions->get('_route');
328
        }
329
330
        return new Route($this->route_name, $params);
331
    }
332
333
    protected function getCurrentEntityAlias() : string
334
    {
335
        return $this->currentEntityAlias;
336
    }
337
338
    protected function setCurrentEntityAlias(string $currentEntityAlias) 
339
    {
340
        $this->currentEntityAlias = $currentEntityAlias;
341
    }
342
343
    protected function getEmbeddedFields() : array
344
    {
345
        return $this->embeddedFields;
346
    }
347
348
    protected function setEmbeddedFields(array $embeddedFields) 
349
    {
350
        $this->embeddedFields = $embeddedFields;
351
    }
352
353
    public function getEntityAlias() : string
354
    {
355
        return $this->metadata->getEntityAlias();
356
    }
357
358
    protected function relationship($queryBuilder)
359
    {
360
        return $queryBuilder;
361
    }
362
363
    public function getQueryBuilderFactoryWithoutInitialization()
364
    {
365
        return $this->queryBuilderFactory;
366
    }
367
}
368