Passed
Branch master (7b1276)
by Marcel
06:24
created

DataService::read()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 10
nc 8
nop 3
dl 0
loc 16
rs 9.9332
c 1
b 0
f 0
1
<?php
2
/**
3
 * Data 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 2019 Marcel Scherello
10
 */
11
12
namespace OCA\Analytics\Service;
13
14
use OCA\Analytics\Activity\ActivityManager;
15
use OCA\Analytics\Controller\DbController;
16
use OCP\ILogger;
17
18
class DataService
19
{
20
    private $logger;
21
    private $DatasetService;
22
    private $DBController;
23
    private $ActivityManager;
24
25
    public function __construct(
26
        ILogger $logger,
27
        DatasetService $DatasetService,
28
        DbController $DBController,
29
        ActivityManager $ActivityManager
30
    )
31
    {
32
        $this->logger = $logger;
33
        $this->DatasetService = $DatasetService;
34
        $this->DBController = $DBController;
35
        $this->ActivityManager = $ActivityManager;
36
    }
37
38
    /**
39
     * Get the items for the selected category
40
     *
41
     * @NoAdminRequired
42
     * @param $datasetMetadata
43
     * @param $objectDrilldown
44
     * @param $dateDrilldown
45
     * @return array
46
     */
47
    public function read($datasetMetadata, $objectDrilldown, $dateDrilldown)
48
    {
49
        $header = array();
50
        if ($objectDrilldown === 'true') $header['dimension1'] = $datasetMetadata['dimension1'];
51
        if ($dateDrilldown === 'true') $header['dimension2'] = $datasetMetadata['dimension2'];
52
        $header['dimension3'] = $datasetMetadata['dimension3'];
53
54
        $data = $this->DBController->getData($datasetMetadata['id'], $objectDrilldown, $dateDrilldown);
55
56
        $result = empty($data) ? [
57
            'status' => 'nodata'
58
        ] : [
59
            'header' => $header,
60
            'data' => $data
61
        ];
62
        return $result;
63
    }
64
65
    /**
66
     * Get the items for the selected category
67
     *
68
     * @NoAdminRequired
69
     * @param int $datasetId
70
     * @param $dimension1
71
     * @param $dimension2
72
     * @param $dimension3
73
     * @return array
74
     */
75
    public function update($datasetId, $dimension1, $dimension2, $dimension3)
76
    {
77
        $insert = 0;
78
        $update = 0;
79
        //$this->logger->error($dimension3);
80
        $dimension3 = str_replace(',', '.', $dimension3);
81
        $action = $this->DBController->createData($datasetId, $dimension1, $dimension2, $dimension3);
82
        if ($action === 'insert') $insert++;
83
        elseif ($action === 'update') $update++;
84
85
        $result = [
86
            'insert' => $insert,
87
            'update' => $update
88
        ];
89
        $this->ActivityManager->triggerEvent($datasetId, ActivityManager::OBJECT_DATA, ActivityManager::SUBJECT_DATA_ADD);
90
        return $result;
91
    }
92
93
    /**
94
     * Get the items for the selected category
95
     *
96
     * @NoAdminRequired
97
     * @param int $datasetId
98
     * @param $import
99
     * @return array
100
     */
101
    public function import($datasetId, $import)
102
    {
103
        $insert = 0;
104
        $update = 0;
105
        $delimiter = $this->detectDelimiter($import);
106
        $rows = str_getcsv($import, "\n");
107
108
        foreach ($rows as &$row) {
109
            $row = str_getcsv($row, $delimiter);
110
            $action = $this->DBController->createData($datasetId, $row[0], $row[1], $row[2]);
111
            if ($action === 'insert') $insert++;
112
            elseif ($action === 'update') $update++;
113
        }
114
115
        $result = [
116
            'insert' => $insert,
117
            'update' => $update,
118
            'delimiter' => $delimiter
119
        ];
120
121
        $this->ActivityManager->triggerEvent($datasetId, ActivityManager::OBJECT_DATA, ActivityManager::SUBJECT_DATA_ADD);
122
        return $result;
123
    }
124
125
126
    private function detectDelimiter($data)
127
    {
128
        $delimiters = ["\t", ";", "|", ","];
129
        $data_2 = null;
130
        $delimiter = $delimiters[0];
131
        foreach ($delimiters as $d) {
132
            $firstRow = str_getcsv($data, "\n")[0];
133
            $data_1 = str_getcsv($firstRow, $d);
134
            if (sizeof($data_1) > sizeof($data_2)) {
135
                $delimiter = $d;
136
                $data_2 = $data_1;
137
            }
138
        }
139
140
        return $delimiter;
141
    }
142
143
}