Passed
Push — main ( 303b6c...b49db2 )
by Sammy
01:47 queued 15s
created

Query   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 141
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 49
dl 0
loc 141
rs 10
c 0
b 0
f 0
wmc 23

15 Methods

Rating   Name   Duplication   Size   Complexity  
A addBindings() 0 7 2
A table() 0 3 1
A alias() 0 3 1
A add() 0 4 1
A clause() 0 3 1
A addBinding() 0 10 1
A set() 0 4 1
A __toString() 0 3 1
A getBindingNames() 0 3 1
A tableLabel() 0 3 1
A __debugInfo() 0 21 4
A bindLabel() 0 3 1
A compare() 0 14 4
A tableAlias() 0 7 2
A bindings() 0 3 1
1
<?php
2
3
namespace HexMakina\Crudites\Grammar\Query;
4
5
use HexMakina\BlackBox\Database\QueryInterface;
6
use HexMakina\Crudites\Grammar\Clause\Clause;
7
8
abstract class Query implements QueryInterface
9
{
10
11
    
12
    protected array $bindings = [];
13
    protected array $binding_names = [];
14
    
15
    protected string $table;
16
    protected ?string $alias = null;
17
    
18
    protected $table_alias = null;
19
    
20
    protected array $clauses = [];
21
    
22
    abstract public function statement(): string;
23
    
24
    /**
25
     * Provides debugging information about the object.
26
     * This method returns an array of object properties and their values,
27
     * excluding properties that are not set.
28
     */
29
    public function __debugInfo(): array
30
    {
31
        $dbg = get_object_vars($this);
32
33
        foreach (array_keys($dbg) as $k) {
34
            if (!isset($dbg[$k])) {
35
                unset($dbg[$k]);
36
            }
37
        }
38
39
        $dbg['statement()'] = $this->statement();
40
41
        
42
        if (empty($this->bindings)) {
43
            unset($dbg['bindings']);
44
        }
45
        else{
46
            $dbg['bindings'] = json_encode($dbg['bindings']);
47
        }
48
49
        return $dbg;
50
    }
51
52
    public function __toString()
53
    {
54
        return $this->statement();
55
    }
56
57
    public function table(): string
58
    {
59
        return $this->table;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->table returns the type string which is incompatible with the return type mandated by HexMakina\BlackBox\Datab...QueryInterface::table() of HexMakina\BlackBox\Database\TableInterface.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
60
    }
61
62
    public function alias(): string
63
    {
64
        return $this->alias ?? $this->table;
65
    }
66
67
    public function clause(string $name): ?Clause
68
    {
69
        return $this->clauses[$name] ?? null;
70
    }
71
72
    public function add(Clause $clause): self
73
    {
74
        $this->clauses[$clause->name()] = $clause;
75
        return $this;
76
    }
77
78
    public function set(Clause $clause): self
79
    {
80
        unset($this->clauses[$clause->name()]);
81
        return $this->add($clause);
82
    }
83
84
    //------------------------------------------------------------  PREP::FIELDS
85
    public function tableLabel(string $force = null)
86
    {
87
        return $force ?? $this->tableAlias();
88
    }
89
90
    public function tableAlias($setter = null): string
91
    {
92
        if ($setter !== null) {
93
            $this->table_alias = $setter;
94
        }
95
96
        return $this->table_alias ?? $this->table;
97
    }
98
99
    public function bindings(): array
100
    {
101
        return $this->bindings;
102
    }
103
104
    public function getBindingNames(): array
105
    {
106
        return $this->binding_names;
107
    }
108
109
    public function addBinding($field, $value, $table_name = null, $bind_label = null): string
110
    {
111
        $table_label = $this->tableLabel($table_name);
112
        $bind_label ??= $this->bindLabel($field, $table_name);
113
114
        $this->binding_names[$table_label] ??= [];
115
        $this->binding_names[$table_label][$field] = $bind_label;
116
        $this->bindings[$bind_label] = $value;
117
118
        return $bind_label;
119
    }
120
121
    public function bindLabel($field, $table_name = null): string
122
    {
123
        return ':' . $this->tableLabel($table_name) . '_' . $field;
124
    }
125
126
    public function addBindings($assoc_data): array
127
    {
128
        $ret = [];
129
        foreach ($assoc_data as $column_name => $value) {
130
            $ret[$column_name] = $this->addBinding($column_name, $value, $this->table);
131
        }
132
        return $ret;
133
    }
134
135
    public function compare($query)
136
    {
137
        if ($this->statement() !== $query->statement()) {
138
            return 'statement';
139
        }
140
141
        if (!empty(array_diff($this->bindings(), $query->bindings()))) {
142
            return 'bindings';
143
        }
144
        if (!empty(array_diff($query->bindings(), $this->bindings()))) {
145
            return 'bindings';
146
        }
147
148
        return true;
149
    }
150
}
151