Completed
Push — master ( 7d470a...9bd53b )
by ARCANEDEV
24s queued 10s
created

Factory::make()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 5
cts 5
cp 1
rs 9.9332
c 0
b 0
f 0
cc 2
nc 2
nop 4
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Arcanedev\LaravelMetrics\Expressions;
6
7
use Arcanedev\LaravelMetrics\Exceptions\ExpressionNotFound;
8
use Illuminate\Database\Eloquent\Builder;
9
use Illuminate\Support\Arr;
10
use Illuminate\Support\Traits\Macroable;
11
12
/**
13
 * Class     Factory
14
 *
15
 * @package  Arcanedev\LaravelMetrics\Expressions
16
 * @author   ARCANEDEV <[email protected]>
17
 */
18
class Factory
19
{
20
    /* -----------------------------------------------------------------
21
     |  Traits
22
     | -----------------------------------------------------------------
23
     */
24
25
    use Macroable;
26
27
    /* -----------------------------------------------------------------
28
     |  Properties
29
     | -----------------------------------------------------------------
30
     */
31
32
    /**
33
     * The registered expressions.
34
     *
35
     * @var array
36
     */
37
    protected static $expressions = [
38
        'if_null' => [
39
            'mariadb' => IfNull\MySqlExpression::class,
40
            'mysql'   => IfNull\MySqlExpression::class,
41
            'pgsql'   => IfNull\PostgresExpression::class,
42
            'sqlite'  => IfNull\SqliteExpression::class,
43
            'sqlsrv'  => IfNull\SqlServerExpression::class,
44
        ],
45
46
        'trend_date_format' => [
47
            'mariadb' => TrendDateFormat\MySqlExpression::class,
48
            'mysql'   => TrendDateFormat\MySqlExpression::class,
49
            'pgsql'   => TrendDateFormat\PostgresExpression::class,
50
            'sqlite'  => TrendDateFormat\SqliteExpression::class,
51
            'sqlsrv'  => TrendDateFormat\SqlServerExpression::class,
52
        ],
53
    ];
54
55
    /* -----------------------------------------------------------------
56
     |  Properties
57
     | -----------------------------------------------------------------
58
     */
59
60
    /**
61
     * Make an expression.
62
     *
63
     * @param  string  $driver
64
     * @param  string  $name
65
     * @param  mixed   $value
66
     * @param  array   $params
67
     *
68
     * @return \Arcanedev\LaravelMetrics\Expressions\Expression|mixed
69
     */
70 408
    public static function make(string $driver, string $name, $value, array $params = []): Expression
71
    {
72 408
        $expression = Arr::get(static::$expressions, "{$name}.{$driver}");
73
74 408
        if (is_null($expression))
75 12
            throw ExpressionNotFound::make($name, $driver);
76
77
78 396
        return new $expression($value, ...$params);
79
    }
80
81
    /**
82
     * Resolve the expression.
83
     *
84
     * @param  \Illuminate\Database\Eloquent\Builder  $query
85
     * @param  string                                 $name
86
     * @param  mixed                                  $value
87
     * @param  array                                  $params
88
     *
89
     * @return \Arcanedev\LaravelMetrics\Expressions\Expression|mixed
90
     */
91 66
    public static function resolveExpression(Builder $query, string $name, $value, array $params = [])
92
    {
93 66
        $driver = $query->getConnection()->getDriverName();
94
95 66
        if (static::hasMacro($driver)) {
96 6
            return static::$driver($name, $value, $params);
97
        }
98
99 60
        return static::make($driver, $name, $value, $params);
100
    }
101
}
102