Completed
Push — master ( 4c6c98...8c8647 )
by James Ekow Abaka
02:34
created

QueryParameters   B

Complexity

Total Complexity 38

Size/Duplication

Total Lines 161
Duplicated Lines 0 %

Coupling/Cohesion

Components 5
Dependencies 1

Test Coverage

Coverage 82.14%

Importance

Changes 0
Metric Value
wmc 38
c 0
b 0
f 0
lcom 5
cbo 1
dl 0
loc 161
ccs 69
cts 84
cp 0.8214
rs 8.3999

19 Methods

Rating   Name   Duplication   Size   Complexity  
A getFields() 0 9 2
A getEagerLoad() 0 3 1
A setFields() 0 4 1
A getTable() 0 3 1
A __construct() 0 3 1
A setTable() 0 4 1
A getLimit() 0 3 2
A getOffset() 0 3 2
B getWhereClause() 0 14 5
B getBoundData() 0 15 5
B setBoundData() 0 15 6
A getSorts() 0 3 2
A addFilter() 0 17 3
A setRawFilter() 0 4 1
A setFirstOnly() 0 4 1
A getFirstOnly() 0 3 1
A setLimit() 0 3 1
A setOffset() 0 3 1
A addSort() 0 3 1
1
<?php
2
3
namespace ntentan\nibii;
4
5
/**
6
 * Description of QueryParameters
7
 *
8
 * @author ekow
9
 */
10
class QueryParameters {
11
12
    private $whereClause;
13
    private $and = '';
14
    private $boundData = [];
15
    private $preparedBoundData = false;
16
    private $boundArrays = [];
17
    private $fields = [];
18
    private $table;
19
    private $firstOnly = false;
20
    private $eagerLoad = [];
21
    private $limit;
22
    private $offset;
23
    private $sorts = [];
24
25
    /**
26
     *
27
     * @param string $table The name of the table
28
     */
29 33
    public function __construct($table = null) {
30 33
        $this->table = $table;
31 33
    }
32
33 25
    public function getFields() {
34 25
        $fields = '*';
35
36 25
        if (count($this->fields) > 0) {
37 12
            $fields = implode(', ', $this->fields);
38
        }
39
40 25
        return $fields;
41
    }
42
43
    public function getEagerLoad() {
44
        return $this->eagerLoad;
45
    }
46
47 12
    public function setFields($fields) {
48 12
        $this->fields = $fields;
49 12
        return $this;
50
    }
51
52 33
    public function getTable() {
53 33
        return $this->table;
54
    }
55
    
56 12
    public function setTable($table) {
57 12
        $this->table = $table;
58 12
        return $this;
59
    }
60
61 25
    public function getLimit() {
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
62 25
        return $this->limit > 0 ? " LIMIT {$this->limit}" : null;
63
    }
64
65 25
    public function getOffset() {
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
66 25
        return $this->offset > 0 ? " OFFSET {$this->offset}" : null;
67
    }
68
69 33
    public function getWhereClause() {
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
70 33
        if($this->whereClause) {
71 30
            foreach($this->boundArrays as $boundArray) {
72 8
                $where = "";
73 8
                $comma = "";
74 8
                for($i = 0; $i < count($this->boundData[$boundArray]); $i++) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
75 8
                    $where .= "{$comma}:{$boundArray}_{$i}";
76 8
                    $comma = ', ';
77
                }
78 8
                $this->whereClause = str_replace("%{$boundArray}%", $where, $this->whereClause);
79
            }
80
        }
81 33
        return $this->whereClause ? " WHERE {$this->whereClause}" : '';
82
    }
83
84 33
    public function getBoundData() {
85 33
        if($this->preparedBoundData === false) {
86 33
            $this->preparedBoundData = [];
0 ignored issues
show
Documentation Bug introduced by
It seems like array() of type array is incompatible with the declared type boolean of property $preparedBoundData.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
87 33
            foreach($this->boundData as $key => $value) {
88 30
                if(in_array($key, $this->boundArrays)) {
89 8
                    foreach($value as $i => $v) {
90 8
                        $this->preparedBoundData["{$key}_{$i}"] = $v;
91
                    }
92
                } else {
93 30
                    $this->preparedBoundData[$key] = $value;
94
                }
95
            }
96
        }        
97 33
        return $this->preparedBoundData;
98
    }
99
100 4
    public function setBoundData($key, $value) {
101 4
        if(isset($this->boundData[$key])){
102 4
            $isArray = is_array($value);
103 4
            $boundArray = in_array($key, $this->boundArrays);
104 4
            if($isArray && !$boundArray) {
105
                throw new NibiiException("{$key} cannot be bound to an array");
106 4
            } else if (!$isArray && $boundArray) {
107
                throw new NibiiException("{$key} must be bound to an array");
108
            }
109 4
            $this->boundData[$key] = $value;
110 4
            $this->preparedBoundData = false;
111 4
            return $this;
112
        }
113
        throw new NibiiException("{$key} has not been bound to the current query");
114
    }
115
116 25
    public function getSorts() {
117 25
        return count($this->sorts) ? " ORDER BY " . implode(", ", $this->sorts) : null;
118
    }
119
120 24
    public function addFilter($field, $values = null) {
121 24
        $this->whereClause .= $this->and;
122 24
        $this->boundData[$field] = $values;
123
124 24
        if (is_array($values)) {
125 8
            $this->whereClause .= "{$field} IN (%{$field}%)";
126 8
            $this->boundArrays[] = $field;
127
        } else {
128 22
            if ($values === null) {
129
                $this->whereClause .= "{$field} is NULL";
130
            } else {
131 22
                $this->whereClause .= "{$field} = :$field";
132
            }
133
        }
134 24
        $this->and = ' AND ';
135 24
        return $this;
136
    }
137
138 6
    public function setRawFilter($filter, $values) {
139 6
        $this->whereClause .= "{$this->and}$filter";
140 6
        $this->boundData += $values;
141 6
    }
142
143
    /**
144
     * @param boolean $firstOnly
145
     */
146 24
    public function setFirstOnly($firstOnly) {
147 24
        $this->firstOnly = $firstOnly;
148 24
        return $this;
149
    }
150
151 25
    public function getFirstOnly() {
152 25
        return $this->firstOnly;
153
    }
154
155
    public function setLimit($numItems) {
156
        $this->limit = $numItems;
157
    }
158
159
    public function setOffset($offset) {
160
        $this->offset = $offset;
161
    }
162
163
    /**
164
     * @param string $field
165
     */
166
    public function addSort($field, $direction = 'ASC') {
167
        $this->sorts[] = "$field $direction";
168
    }
169
170
}
171