Passed
Push — master ( edd22d...b6b87b )
by Marcel
03:18
created

DatasetMapper::update()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 22
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 20
c 1
b 0
f 0
nc 2
nop 14
dl 0
loc 22
rs 9.6

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
/**
3
 * Analytics
4
 *
5
 * This file is licensed under the Affero General Public License version 3 or
6
 * later. See the LICENSE.md file.
7
 *
8
 * @author Marcel Scherello <[email protected]>
9
 * @copyright 2021 Marcel Scherello
10
 */
11
12
namespace OCA\Analytics\Db;
13
14
use OCP\IDBConnection;
15
use OCP\IL10N;
16
use OCP\ILogger;
17
18
class DatasetMapper
19
{
20
    private $userId;
21
    private $l10n;
22
    private $db;
23
    private $logger;
24
    const TABLE_NAME = 'analytics_dataset';
25
26
    public function __construct(
27
        $userId,
28
        IL10N $l10n,
29
        IDBConnection $db,
30
        ILogger $logger
31
    )
32
    {
33
        $this->userId = $userId;
34
        $this->l10n = $l10n;
35
        $this->db = $db;
36
        $this->logger = $logger;
37
        self::TABLE_NAME;
38
    }
39
40
    /**
41
     * get datasets
42
     * @return array
43
     */
44
    public function index()
45
    {
46
        $sql = $this->db->getQueryBuilder();
47
        $sql->from(self::TABLE_NAME)
48
            ->select('id')
49
            ->addSelect('name')
50
            ->addSelect('type')
51
            ->addSelect('parent')
52
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
53
            ->orderBy('parent', 'ASC')
54
            ->addOrderBy('name', 'ASC');
55
        $statement = $sql->execute();
56
        $result = $statement->fetchAll();
57
        $statement->closeCursor();
58
        return $result;
59
    }
60
61
    /**
62
     * create dataset
63
     * @return int
64
     */
65
    public function create()
66
    {
67
        $sql = $this->db->getQueryBuilder();
68
        $sql->insert(self::TABLE_NAME)
69
            ->values([
70
                'user_id' => $sql->createNamedParameter($this->userId),
71
                'name' => $sql->createNamedParameter($this->l10n->t('New')),
72
                'type' => $sql->createNamedParameter(2),
73
                'parent' => $sql->createNamedParameter(0),
74
                'dimension1' => $sql->createNamedParameter($this->l10n->t('Object')),
75
                'dimension2' => $sql->createNamedParameter($this->l10n->t('Date')),
76
                //'dimension3' => $sql->createNamedParameter($this->l10n->t('Value')),
77
                //'dimension4' => $sql->createNamedParameter($this->l10n->t('Value')),
78
                //'timestamp' => $sql->createNamedParameter($this->l10n->t('Date')),
79
                //'unit' => $sql->createNamedParameter($this->l10n->t('Value')),
80
                'value' => $sql->createNamedParameter($this->l10n->t('Value')),
81
            ]);
82
        $sql->execute();
83
        return (int)$this->db->lastInsertId(self::TABLE_NAME);
84
    }
85
86
    /**
87
     * get single dataset
88
     * @param int $id
89
     * @param string|null $user_id
90
     * @return array
91
     */
92
    public function read(int $id, string $user_id = null)
93
    {
94
        if ($user_id) $this->userId = $user_id;
95
96
        $sql = $this->db->getQueryBuilder();
97
        $sql->from(self::TABLE_NAME)
98
            ->select('*')
99
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)))
100
            ->andWhere($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
101
            ->orderBy('parent', 'ASC')
102
            ->addOrderBy('name', 'ASC');
103
        $statement = $sql->execute();
104
        $result = $statement->fetch();
105
        $statement->closeCursor();
106
        return $result;
107
    }
108
109
    /**
110
     * update dataset
111
     * @param $id
112
     * @param $name
113
     * @param $subheader
114
     * @param $parent
115
     * @param $type
116
     * @param $link
117
     * @param $visualization
118
     * @param $chart
119
     * @param $chartoptions
120
     * @param $dataoptions
121
     * @param $dimension1
122
     * @param $dimension2
123
     * @param $value
124
     * @param $filteroptions
125
     * @return bool
126
     */
127
    public function update($id, $name, $subheader, $parent, $type, $link, $visualization, $chart, $chartoptions, $dataoptions, $dimension1, $dimension2, $value, $filteroptions = null)
128
    {
129
        $name = $this->truncate($name, 64);
130
        $sql = $this->db->getQueryBuilder();
131
        $sql->update(self::TABLE_NAME)
132
            ->set('name', $sql->createNamedParameter($name))
133
            ->set('subheader', $sql->createNamedParameter($subheader))
134
            ->set('type', $sql->createNamedParameter($type))
135
            ->set('link', $sql->createNamedParameter($link))
136
            ->set('visualization', $sql->createNamedParameter($visualization))
137
            ->set('chart', $sql->createNamedParameter($chart))
138
            ->set('chartoptions', $sql->createNamedParameter($chartoptions))
139
            ->set('dataoptions', $sql->createNamedParameter($dataoptions))
140
            ->set('parent', $sql->createNamedParameter($parent))
141
            ->set('dimension1', $sql->createNamedParameter($dimension1))
142
            ->set('dimension2', $sql->createNamedParameter($dimension2))
143
            ->set('value', $sql->createNamedParameter($value))
144
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
145
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
146
        if ($filteroptions !== null) $sql->set('filteroptions', $sql->createNamedParameter($filteroptions));
147
        $sql->execute();
148
        return true;
149
    }
150
151
    /**
152
     * update dataset options
153
     * @param $id
154
     * @param $chartoptions
155
     * @param $dataoptions
156
     * @param $filteroptions
157
     * @return bool
158
     */
159
    public function updateOptions($id, $chartoptions, $dataoptions, $filteroptions)
160
    {
161
        $sql = $this->db->getQueryBuilder();
162
        $sql->update(self::TABLE_NAME)
163
            ->set('chartoptions', $sql->createNamedParameter($chartoptions))
164
            ->set('dataoptions', $sql->createNamedParameter($dataoptions))
165
            ->set('filteroptions', $sql->createNamedParameter($filteroptions))
166
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
167
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
168
        $sql->execute();
169
        return true;
170
    }
171
172
    /**
173
     * read dataset options
174
     * @param $id
175
     * @return array
176
     */
177
    public function readOptions($id)
178
    {
179
        $sql = $this->db->getQueryBuilder();
180
        $sql->from(self::TABLE_NAME)
181
            ->select('name')
182
            ->addSelect('visualization')
183
            ->addSelect('chart')
184
            ->addSelect('user_id')
185
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
186
        $statement = $sql->execute();
187
        $result = $statement->fetch();
188
        $statement->closeCursor();
189
        return $result;
190
    }
191
192
    /**
193
     * delete dataset
194
     * @param $id
195
     * @return bool
196
     */
197
    public function delete($id)
198
    {
199
        $sql = $this->db->getQueryBuilder();
200
        $sql->delete(self::TABLE_NAME)
201
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
202
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
203
        $sql->execute();
204
        return true;
205
    }
206
207
    /**
208
     * search datasets by searchstring
209
     * @param $searchString
210
     * @return array
211
     */
212
    public function search($searchString)
213
    {
214
        $sql = $this->db->getQueryBuilder();
215
        $sql->from(self::TABLE_NAME)
216
            ->select('id')
217
            ->addSelect('name')
218
            ->addSelect('type')
219
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
220
            ->andWhere($sql->expr()->iLike('name', $sql->createNamedParameter('%' . $this->db->escapeLikeParameter($searchString) . '%')))
221
            ->orderBy('name', 'ASC');
222
        $statement = $sql->execute();
223
        $result = $statement->fetchAll();
224
        $statement->closeCursor();
225
        return $result;
226
    }
227
228
    /**
229
     * truncates fiels do DB-field size
230
     *
231
     * @param $string
232
     * @param $length
233
     * @param $dots
234
     * @return string
235
     */
236
    private function truncate($string, $length, $dots = "...")
237
    {
238
        return (strlen($string) > $length) ? mb_strcut($string, 0, $length - strlen($dots)) . $dots : $string;
239
    }
240
}