Passed
Pull Request — master (#116)
by Zing
05:30
created

QueryBuilderFactory::create()   A

Complexity

Conditions 5
Paths 8

Size

Total Lines 19
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 9
nc 8
nop 2
dl 0
loc 19
ccs 0
cts 10
cp 0
crap 30
rs 9.6111
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Zing\QueryBuilder;
6
7
use Illuminate\Database\Eloquent\Model;
8
use Illuminate\Http\Request;
9
10
class QueryBuilderFactory
11
{
12
    /**
13
     * @var array<class-string, class-string<\Zing\QueryBuilder\QueryBuilder>>
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<class-string, clas...yBuilder\QueryBuilder>> at position 2 could not be parsed: Unknown type name 'class-string' at position 2 in array<class-string, class-string<\Zing\QueryBuilder\QueryBuilder>>.
Loading history...
14
     */
15
    protected $builders = [];
16
17
    /**
18
     * QueryBuilderFactory constructor.
19
     *
20
     * @param array<class-string, class-string<\Zing\QueryBuilder\QueryBuilder>> $builders
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<class-string, clas...yBuilder\QueryBuilder>> at position 2 could not be parsed: Unknown type name 'class-string' at position 2 in array<class-string, class-string<\Zing\QueryBuilder\QueryBuilder>>.
Loading history...
21
     */
22
    public function __construct(array $builders)
23
    {
24
        $this->builders = $builders;
25
    }
26
27
    /**
28
     * @param class-string<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Builder $baseQuery
0 ignored issues
show
Documentation Bug introduced by
The doc comment class-string<\Illuminate...tabase\Eloquent\Builder at position 0 could not be parsed: Unknown type name 'class-string' at position 0 in class-string<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Builder.
Loading history...
29
     */
30
    public function create($baseQuery, Request $request): QueryBuilder
31
    {
32
        if (is_subclass_of($baseQuery, Model::class)) {
33
            $baseQuery = forward_static_call([$baseQuery, 'query']);
34
        }
35
36
        $class = get_class($baseQuery);
37
38
        if (isset($this->builders[$class])) {
39
            return $this->resolveBuilder($this->builders[$class], $baseQuery, $request);
40
        }
41
42
        foreach ($this->builders as $expected => $builder) {
43
            if (is_subclass_of($class, $expected)) {
44
                return $this->resolveBuilder($builder, $baseQuery, $request);
45
            }
46
        }
47
48
        return new QueryBuilder($baseQuery, $request);
49
    }
50
51
    /**
52
     * @param class-string<\Zing\QueryBuilder\QueryBuilder> $builder
0 ignored issues
show
Documentation Bug introduced by
The doc comment class-string<\Zing\QueryBuilder\QueryBuilder> at position 0 could not be parsed: Unknown type name 'class-string' at position 0 in class-string<\Zing\QueryBuilder\QueryBuilder>.
Loading history...
53
     * @param class-string<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Builder|bool $baseQuery
54
     */
55
    public function resolveBuilder($builder, $baseQuery, Request $request): QueryBuilder
56
    {
57
        return new $builder($baseQuery, $request);
58
    }
59
60
    /**
61
     * @param mixed $builder
62
     * @param mixed $queryBuilder
63
     *
64
     * @return string[]|mixed[]
65
     */
66
    public function queryBy($builder, $queryBuilder): array
67
    {
68
        $this->builders[$builder] = $queryBuilder;
69
70
        return $this->builders;
71
    }
72
}
73