Passed
Push — master ( 6139d1...678a4c )
by Petr
13:22 queued 10:27
created

MySQL   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 109
Duplicated Lines 0 %

Test Coverage

Coverage 76.47%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 64
c 1
b 0
f 0
dl 0
loc 109
ccs 39
cts 51
cp 0.7647
rs 10
wmc 23

8 Methods

Rating   Name   Duplication   Size   Complexity  
A makeLimits() 0 7 3
A update() 0 7 1
A insert() 0 5 1
A select() 0 11 1
A delete() 0 6 1
A availableJoins() 0 8 1
A describe() 0 3 1
C translateOperation() 0 31 14
1
<?php
2
3
namespace kalanis\kw_mapper\Storage\Database\Dialects;
4
5
6
use kalanis\kw_mapper\Interfaces\IQueryBuilder;
7
use kalanis\kw_mapper\MapperException;
8
use kalanis\kw_mapper\Storage\Shared\QueryBuilder;
9
10
11
/**
12
 * Class MySQL
13
 * @package kalanis\kw_mapper\Storage\Database\Dialects
14
 * Create queries for MySQL / MariaDB / Percona servers
15
 */
16
class MySQL extends ADialect
17
{
18
    use TEscapedDialect;
19
20 1
    public function insert(QueryBuilder $builder)
21
    {
22 1
        return sprintf('INSERT INTO `%s` SET %s;',
23 1
            $builder->getBaseTable(),
24 1
            $this->makeProperty($builder->getProperties())
25
        );
26
    }
27
28 1
    public function select(QueryBuilder $builder)
29
    {
30 1
        return sprintf('SELECT %s FROM `%s` %s %s%s%s%s%s;',
31 1
            $this->makeFullColumns($builder->getColumns()),
32 1
            $builder->getBaseTable(),
33 1
            $this->makeJoin($builder->getJoins()),
34 1
            $this->makeFullConditions($builder->getConditions(), $builder->getRelation()),
35 1
            $this->makeFullGrouping($builder->getGrouping()),
36 1
            $this->makeFullHaving($builder->getHavingCondition(), $builder->getRelation()),
37 1
            $this->makeFullOrdering($builder->getOrdering()),
38 1
            $this->makeLimits($builder->getLimit(), $builder->getOffset())
39
        );
40
    }
41
42 1
    public function update(QueryBuilder $builder)
43
    {
44 1
        return sprintf('UPDATE `%s` SET %s%s%s;',
45 1
            $builder->getBaseTable(),
46 1
            $this->makeProperty($builder->getProperties()),
47 1
            $this->makeFullConditions($builder->getConditions(), $builder->getRelation()),
48 1
            $this->makeLimits($builder->getOffset(), null)
49
        );
50
    }
51
52 1
    public function delete(QueryBuilder $builder)
53
    {
54 1
        return sprintf('DELETE FROM `%s`%s%s;',
55 1
            $builder->getBaseTable(),
56 1
            $this->makeFullConditions($builder->getConditions(), $builder->getRelation()),
57 1
            $this->makeLimits($builder->getLimit(), null)
58
        );
59
    }
60
61 1
    public function describe(QueryBuilder $builder)
62
    {
63 1
        return sprintf('DESCRIBE `%s`;', $builder->getBaseTable() );
64
    }
65
66
    /**
67
     * @param string $operation
68
     * @throws MapperException
69
     * @return string
70
     * @codeCoverageIgnore too many options
71
     */
72 3
    public function translateOperation(string $operation): string
73
    {
74 3
        switch ($operation) {
75
            case IQueryBuilder::OPERATION_NULL:
76
                return 'IS NULL';
77
            case IQueryBuilder::OPERATION_NNULL:
78
                return 'IS NOT NULL';
79
            case IQueryBuilder::OPERATION_EQ:
80 3
                return '<=>';
81
            case IQueryBuilder::OPERATION_NEQ:
82 3
                return '!=';
83
            case IQueryBuilder::OPERATION_GT:
84
                return '>';
85
            case IQueryBuilder::OPERATION_GTE:
86
                return '>=';
87
            case IQueryBuilder::OPERATION_LT:
88
                return '<';
89
            case IQueryBuilder::OPERATION_LTE:
90
                return '<=';
91
            case IQueryBuilder::OPERATION_LIKE:
92
                return 'LIKE';
93
            case IQueryBuilder::OPERATION_NLIKE:
94
                return 'NOT LIKE';
95
            case IQueryBuilder::OPERATION_REXP:
96
                return 'REGEX';
97
            case IQueryBuilder::OPERATION_IN:
98
                return 'IN';
99
            case IQueryBuilder::OPERATION_NIN:
100
                return 'NOT IN';
101
            default:
102
                throw new MapperException(sprintf('Unknown operation *%s*', $operation));
103
        }
104
    }
105
106 3
    protected function makeLimits(?int $limit, ?int $offset): string
107
    {
108 3
        return is_null($limit)
109 1
            ? ''
110 2
            : (is_null($offset)
111 1
                ? sprintf(' LIMIT %d', $limit)
112 3
                : sprintf(' LIMIT %d,%d', $offset, $limit)
113
            )
114
        ;
115
    }
116
117 2
    public function availableJoins(): array
118
    {
119
        return [
120 2
            IQueryBuilder::JOIN_BASIC,
121
            IQueryBuilder::JOIN_INNER,
122
            IQueryBuilder::JOIN_CROSS,
123
            IQueryBuilder::JOIN_LEFT,
124
            IQueryBuilder::JOIN_RIGHT,
125
        ];
126
    }
127
}
128