TransactSQL   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 94
Duplicated Lines 0 %

Test Coverage

Coverage 97.87%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 36
c 1
b 0
f 0
dl 0
loc 94
ccs 46
cts 47
cp 0.9787
rs 10
wmc 16

8 Methods

Rating   Name   Duplication   Size   Complexity  
A insert() 0 6 1
A delete() 0 6 1
A makeLimit() 0 3 2
A describe() 0 3 1
A makeOffset() 0 5 2
A availableJoins() 0 8 1
B select() 0 12 7
A update() 0 7 1
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 TransactSQL
13
 * @package kalanis\kw_mapper\Storage\Database\Dialects
14
 * Create queries for TransactSQL - MSSQL, MS Azure and Sybase servers
15
 */
16
class TransactSQL extends ADialect
17
{
18
    use TSimpleDialect;
19
20
    /**
21
     * @param QueryBuilder $builder
22
     * @throws MapperException
23
     * @return string
24
     * @link https://docs.microsoft.com/en-us/sql/t-sql/statements/insert-transact-sql?view=sql-server-ver15
25
     */
26 1
    public function insert(QueryBuilder $builder)
27
    {
28 1
        return sprintf('INSERT INTO %s (%s) VALUES (%s);',
29 1
            $builder->getBaseTable(),
30 1
            $this->makeSimplePropertyList($builder->getProperties()),
31 1
            $this->makePropertyEntries($builder->getProperties())
32 1
        );
33
    }
34
35
    /**
36
     * @param QueryBuilder $builder
37
     * @return string
38
     * @link https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15
39
     */
40 1
    public function select(QueryBuilder $builder)
41
    {
42 1
        $joins = $builder->getJoins();
43 1
        return sprintf('SELECT %s FROM %s %s %s%s%s%s%s;',
44 1
            empty($joins) ? $this->makeSimpleColumns($builder->getColumns()) : $this->makeFullColumns($builder->getColumns()),
45 1
            $builder->getBaseTable(),
46 1
            empty($joins) ? '' : $this->makeJoin($builder->getJoins()),
47 1
            empty($joins) ? $this->makeSimpleConditions($builder->getConditions(), $builder->getRelation()) : $this->makeFullConditions($builder->getConditions(), $builder->getRelation()),
48 1
            empty($joins) ? $this->makeSimpleGrouping($builder->getGrouping()) : $this->makeFullGrouping($builder->getGrouping()),
49 1
            empty($joins) ? $this->makeSimpleHaving($builder->getHavingCondition(), $builder->getRelation()) : $this->makeFullHaving($builder->getHavingCondition(), $builder->getRelation()),
50 1
            empty($joins) ? $this->makeSimpleOrdering($builder->getOrdering()) : $this->makeFullOrdering($builder->getOrdering()),
51 1
            $this->makeOffset($builder->getOffset(), $builder->getLimit())
52 1
        );
53
    }
54
55
    /**
56
     * @param QueryBuilder $builder
57
     * @return string
58
     * @link https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql?view=sql-server-ver15
59
     */
60 1
    public function update(QueryBuilder $builder)
61
    {
62 1
        return sprintf('UPDATE %s %s SET %s%s;',
63 1
            $this->makeLimit($builder->getLimit()),
64 1
            $builder->getBaseTable(),
65 1
            $this->makeProperty($builder->getProperties()),
66 1
            $this->makeSimpleConditions($builder->getConditions(), $builder->getRelation())
67 1
        );
68
    }
69
70
    /**
71
     * @param QueryBuilder $builder
72
     * @return string
73
     * @link https://docs.microsoft.com/en-us/sql/t-sql/statements/delete-transact-sql?view=sql-server-ver15
74
     */
75 1
    public function delete(QueryBuilder $builder)
76
    {
77 1
        return sprintf('DELETE %s FROM %s%s;',
78 1
            $this->makeLimit($builder->getLimit()),
79 1
            $builder->getBaseTable(),
80 1
            $this->makeSimpleConditions($builder->getConditions(), $builder->getRelation())
81 1
        );
82
    }
83
84 1
    public function describe(QueryBuilder $builder)
85
    {
86 1
        return sprintf('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = \'%s\';', $builder->getBaseTable() );
87
    }
88
89 2
    protected function makeLimit(?int $limit): string
90
    {
91 2
        return is_null($limit) ? '' : sprintf('TOP(%d)', $limit);
92
    }
93
94 1
    protected function makeOffset(?int $offset, ?int $limit): string
95
    {
96 1
        return is_null($limit)
97
            ? ''
98 1
            : sprintf(' OFFSET %d ROWS FETCH NEXT %d ROWS ONLY', intval($offset), $limit)
99 1
        ;
100
    }
101
102 1
    public function availableJoins(): array
103
    {
104 1
        return [
105 1
            IQueryBuilder::JOIN_INNER,
106 1
            IQueryBuilder::JOIN_LEFT,
107 1
            IQueryBuilder::JOIN_RIGHT,
108 1
            IQueryBuilder::JOIN_FULL,
109 1
            IQueryBuilder::JOIN_CROSS,
110 1
        ];
111
    }
112
}
113