Passed
Pull Request — master (#149)
by Zing
10:58 queued 04:58
created

SampleCollector::samples()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 287
Code Lines 117

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 117
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 287
rs 8

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Zing\QueryBuilder\Samples;
6
7
class SampleCollector
8
{
9
    /**
10
     * @return \Zing\QueryBuilder\Samples\Sample[]
11
     */
12
    public function samples(): array
13
    {
14
        return [
15
            new Sample('Basic usage', '', [new CodeSample(
16
                <<<'CODE_SAMPLE'
17
use Zing\QueryBuilder\QueryBuilder;
18
use Zing\QueryBuilder\Tests\Models\User;
19
20
QueryBuilder::fromBuilder(User::class, $request)
21
    ->searchable(['name'])
22
    ->enableFilters(['is_visible', 'status'])
23
    ->enableSorts(['created_at'])
24
    ->enablePaginator()
25
    ->simplePaginate();
26
CODE_SAMPLE
27
                ,
28
                [
29
                    new IOSample(
30
                        '/api/users?search=Harry&status=1,2,3&desc=created_at&per_page=10',
31
                        'select * from "users" where ("name" like "%Harry%") and "status" in ("1", "2", "3") order by "created_at" desc limit 11 offset 0'
32
                    ),
33
                ]
34
            ),
35
            ]),
36
37
            new Sample(
38
                'Search',
39
                '',
40
                [new CodeSample(
41
                    <<<'CODE_SAMPLE'
42
use Zing\QueryBuilder\QueryBuilder;
43
use Zing\QueryBuilder\Tests\Models\User;
44
45
QueryBuilder::fromBuilder(User::class, $request)
46
    ->searchable(['name', 'email'])
47
    ->simplePaginate();
48
CODE_SAMPLE
49
                    ,
50
                    [
51
                        new IOSample(
52
                            '/api/users?search=Harry',
53
                            'select * from "users" where ("name" like "%Harry%" or "email" like "%Harry%") limit 16 offset 0'
54
                        ),
55
                    ]
56
                ),
57
                ]
58
            ),
59
60
            (new Sample(
61
                'Search',
62
                'Composite search',
63
                [new CodeSample(
64
                    <<<'CODE_SAMPLE'
65
use Zing\QueryBuilder\Filter;
66
use Zing\QueryBuilder\QueryBuilder;
67
use Zing\QueryBuilder\Tests\Models\User;
68
69
QueryBuilder::fromBuilder(User::class, $request)
70
    ->searchable(['number', Filter::exact('encoded_id', 'id')])
71
    ->simplePaginate();
72
CODE_SAMPLE
73
                    ,
74
                    [
75
                        new IOSample(
76
                            '/api/users?search=2021',
77
                            'select * from "users" where ("number" like "%2021%" or ("id" = "2021")) limit 16 offset 0'
78
                        ),
79
                    ]
80
                ),
81
                ]
82
            ))->description('⚠️ The filter with default value is not supported yet.'),
83
            new Sample(
84
                'Filter',
85
                '',
86
                [
87
                    new CodeSample(
88
                        <<<'CODE_SAMPLE'
89
use Zing\QueryBuilder\QueryBuilder;
90
use Zing\QueryBuilder\Tests\Models\User;
91
use Zing\QueryBuilder\Filter;
92
93
QueryBuilder::fromBuilder(User::class, $request)
94
    ->enableFilters([
95
        Filter::partial('name')
96
    ])
97
    ->simplePaginate();
98
CODE_SAMPLE
99
                        ,
100
                        [
101
                            new IOSample(
102
                                '/api/users?name=Harry',
103
                                'select * from "users" where "name" like "%Harry%" limit 16 offset 0'
104
                            ),
105
                        ]
106
                    ),
107
                    new CodeSample(
108
                        <<<'CODE_SAMPLE'
109
use Zing\QueryBuilder\QueryBuilder;
110
use Zing\QueryBuilder\Tests\Models\User;
111
use Zing\QueryBuilder\Filter;
112
113
QueryBuilder::fromBuilder(User::class, $request)
114
    ->enableFilters([
115
        Filter::exact('status')
116
    ])
117
    ->simplePaginate();
118
CODE_SAMPLE
119
                        ,
120
                        [
121
                            new IOSample(
122
                                '/api/users?status=1,2,3',
123
                                'select * from "users" where "status" in ("1", "2", "3") limit 16 offset 0'
124
                            ),
125
                        ]
126
                    ),
127
                    new CodeSample(
128
                        <<<'CODE_SAMPLE'
129
use Zing\QueryBuilder\QueryBuilder;
130
use Zing\QueryBuilder\Tests\Models\User;
131
use Zing\QueryBuilder\Filter;
132
133
QueryBuilder::fromBuilder(User::class, $request)
134
    ->enableFilters([
135
        Filter::scope('visible')->default(true)
136
    ])
137
    ->simplePaginate();
138
CODE_SAMPLE
139
                        ,
140
                        [
141
                            new IOSample(
142
                                '/api/users?visible=1',
143
                                'select * from "users" where "is_visible" = true limit 16 offset 0'
144
                            ),
145
                            new IOSample(
146
                                '/api/users',
147
                                'select * from "users" where "is_visible" = true limit 16 offset 0'
148
                            ),
149
                        ]
150
                    ),
151
                ]
152
            ),
153
            (new Sample(
154
                'Filter',
155
                'Typed filter',
156
                [
157
                    new CodeSample(
158
                        <<<'CODE_SAMPLE'
159
use Zing\QueryBuilder\Filter;
160
use Zing\QueryBuilder\QueryBuilder;
161
use Zing\QueryBuilder\Tests\Models\Order;
162
163
QueryBuilder::fromBuilder(Order::class, $request)
164
    ->enableTypedFilter('search_type', 'search_value', [Filter::partial('number'), Filter::partial('user_name', 'user.name')])
165
    ->simplePaginate();
166
CODE_SAMPLE
167
                        ,
168
                        [
169
                            new IOSample(
170
                                '/api/users?search_type=number&search_value=2021',
171
                                'select * from "orders" where "number" like "%2021%" limit 16 offset 0'
172
                            ),
173
                        ]
174
                    ),
175
                ]
176
            ))->description('⚠️ The filter with default value is not supported yet.'),
177
            (new Sample(
178
                'Filter',
179
                'Flagged filter',
180
                [
181
                    new CodeSample(
182
                        <<<'CODE_SAMPLE'
183
use Zing\QueryBuilder\Filter;
184
use Zing\QueryBuilder\QueryBuilder;
185
use Zing\QueryBuilder\Tests\Models\Order;
186
187
QueryBuilder::fromBuilder(Order::class, $request)
188
    ->enableFlaggedFilter([Filter::partial('number'), Filter::partial('user_name', 'user.name')])
189
    ->simplePaginate();
190
CODE_SAMPLE
191
                        ,
192
                        [
193
                            new IOSample(
194
                                '/api/users?number=2021&user_name=Jone',
195
                                'select * from "orders" where (("number" like "%2021%") or (exists (select * from "users" where "orders"."user_id" = "users"."id" and "users"."name" like "%Jone%"))) limit 16 offset 0'
196
                            ),
197
                        ]
198
                    ),
199
                ]
200
            )),
201
            new Sample(
202
                'Filter',
203
                'Cast Input(Skip auto cast)',
204
                [
205
                    new CodeSample(
206
                        <<<'CODE_SAMPLE'
207
use Zing\QueryBuilder\QueryBuilder;
208
use Zing\QueryBuilder\Tests\Models\User;
209
use Zing\QueryBuilder\Filter;
210
use Zing\QueryBuilder\Enums\CastType;
211
212
QueryBuilder::fromBuilder(User::class, $request)
213
    ->enableFilters(Filter::exact('is_visible')->withCast(CastType::BOOLEAN))
214
    ->simplePaginate();
215
CODE_SAMPLE
216
                        ,
217
                        [
218
                            new IOSample(
219
                                '/api/users?is_visible=true',
220
                                'select * from "users" where "is_visible" = true limit 16 offset 0'
221
                            ),
222
                        ]
223
                    ),
224
                    new CodeSample(
225
                        <<<'CODE_SAMPLE'
226
use Zing\QueryBuilder\QueryBuilder;
227
use Zing\QueryBuilder\Filter;
228
use Zing\QueryBuilder\Enums\CastType;
229
use Zing\QueryBuilder\Tests\Models\Order;
230
231
QueryBuilder::fromBuilder(Order::class, $request)
232
    ->enableFilters(Filter::partial('content')->withCast(CastType::STRING))
233
    ->simplePaginate();
234
CODE_SAMPLE
235
                        ,
236
                        [
237
                            new IOSample(
238
                                '/api/orders?content=code,and',
239
                                'select * from "orders" where "content" like "%code,and%" limit 16 offset 0'
240
                            ),
241
                        ]
242
                    ),
243
                ]
244
            ),
245
            new Sample(
246
                'Sort',
247
                '',
248
                [
249
                    new CodeSample(
250
                        <<<'CODE_SAMPLE'
251
use Illuminate\Support\Facades\DB;
252
use Zing\QueryBuilder\QueryBuilder;
253
use Zing\QueryBuilder\Sort;
254
use Zing\QueryBuilder\Tests\Models\Order;
255
256
QueryBuilder::fromBuilder(Order::class, $request)
257
    ->enableSorts([Sort::field('created_date', 'created_at')])
258
    ->simplePaginate();
259
CODE_SAMPLE
260
                        ,
261
                        [
262
                            new IOSample(
263
                                '/api/users?desc=created_date',
264
                                'select * from "orders" order by "created_at" desc limit 16 offset 0'
265
                            ),
266
                        ]
267
                    ),
268
                ]
269
            ),
270
            new Sample(
271
                'Paginator',
272
                '',
273
                [
274
                    new CodeSample(
275
                        <<<'CODE_SAMPLE'
276
use Zing\QueryBuilder\QueryBuilder;
277
use Zing\QueryBuilder\Tests\Models\User;
278
use Zing\QueryBuilder\Paginator;
279
280
QueryBuilder::fromBuilder(User::class, $request)
281
    ->enablePaginator('size')
282
    ->simplePaginate();
283
CODE_SAMPLE
284
                        ,
285
                        [new IOSample('/api/users?size=5', 'select * from "users" limit 6 offset 0')]
286
                    ),
287
                    new CodeSample(
288
                        <<<'CODE_SAMPLE'
289
use Zing\QueryBuilder\QueryBuilder;
290
use Zing\QueryBuilder\Tests\Models\User;
291
use Zing\QueryBuilder\Paginator;
292
293
QueryBuilder::fromBuilder(User::class, $request)
294
    ->enablePaginator(Paginator::name('size')->default(5))
295
    ->simplePaginate();
296
CODE_SAMPLE
297
                        ,
298
                        [new IOSample('/api/users?size=', 'select * from "users" limit 6 offset 0')]
299
                    ),
300
                ]
301
            ),
302
        ];
303
    }
304
}
305