QueryResult::set()   A
last analyzed

Complexity

Conditions 4
Paths 8

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 15
rs 9.7666
c 0
b 0
f 0
cc 4
nc 8
nop 1
1
<?php
2
declare(strict_types=1);
3
4
/**
5
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16
 */
17
18
namespace Ytake\PrestoClient;
19
20
/**
21
 * Class QueryResult
22
 *
23
 * @author Yuuki Takezawa <[email protected]>
24
 */
25
final class QueryResult
26
{
27
    /** @var string */
28
    private $id;
29
30
    /** @var string */
31
    private $infoUri;
32
33
    /** @var string */
34
    private $partialCancelUri;
35
36
    /** @var string */
37
    private $nextUri;
38
39
    /** @var \stdClass[] */
40
    private $columns = [];
41
42
    /** @var array */
43
    private $data = [];
44
45
    /** @var StatementStats|null */
46
    private $stats;
47
48
    /** @var QueryError|null */
49
    private $error;
50
51
    /**
52
     * QueryResult constructor.
53
     *
54
     * @param string $content
55
     */
56
    public function set(string $content)
57
    {
58
        $parsed = $this->parseContent($content);
59
        $this->id = $parsed->id;
60
        $this->infoUri = $parsed->infoUri;
61
        $this->partialCancelUri = $parsed->partialCancelUri ?? null;
62
        $this->nextUri = $parsed->nextUri ?? null;
63
        $this->columns = [];
64
        if (isset($parsed->columns)) {
65
            $this->columnTransfer($parsed->columns);
66
        }
67
        $this->data = $parsed->data ?? [];
68
        $this->stats = isset($parsed->stats) ? $this->statsTransfer($parsed->stats) : null;
69
        $this->error = isset($parsed->error) ? $this->errorTransfer($parsed->error) : null;
70
    }
71
72
    /**
73
     * @return string|null
74
     */
75
    public function getId()
76
    {
77
        return $this->id;
78
    }
79
80
    /**
81
     * @return string|null
82
     */
83
    public function getInfoUri()
84
    {
85
        return $this->infoUri;
86
    }
87
88
    /**
89
     * @return string|null
90
     */
91
    public function getNextUri()
92
    {
93
        return $this->nextUri;
94
    }
95
96
    /**
97
     * @return QueryError|null
98
     */
99
    public function getError()
100
    {
101
        return $this->error;
102
    }
103
104
    /**
105
     * @return string|null
106
     */
107
    public function getPartialCancelUri()
108
    {
109
        return $this->partialCancelUri;
110
    }
111
112
    /**
113
     * @return \Generator
114
     */
115
    public function yieldData(): \Generator
116
    {
117
        if (!count($this->data)) {
118
            yield;
119
        }
120
        $column = $this->getColumns();
121
        $columnCount = count($column);
122
        foreach ($this->data as $data) {
123
            $fixData = new FixData();
124
            for ($i = 0; $i < $columnCount; $i++) {
125
                $fixData->add($column[$i]->getName(), $data[$i]);
126
            }
127
            yield $fixData;
128
        }
129
    }
130
131
    /**
132
     * @return \Generator
133
     */
134
    public function yieldDataArray(): \Generator
135
    {
136
        if (!count($this->data)) {
137
            yield;
138
        }
139
        $columns = array_map(function (Column $item) {
140
            return $item->getName();
141
        }, $this->getColumns());
142
        foreach ($this->data as $data) {
143
            yield array_combine($columns, $data);
144
        }
145
    }
146
147
    /**
148
     * @param string $fetchClassName
149
     *
150
     * @return \Generator
151
     */
152
    public function yieldObject(string $fetchClassName)
153
    {
154
        if (!count($this->data)) {
155
            yield;
156
        }
157
        $column = $this->getColumns();
158
        $columnCount = count($column);
159
        foreach ($this->data as $data) {
160
            $reflectionClass = new \ReflectionClass($fetchClassName);
161
            $newInstance = $reflectionClass->newInstanceWithoutConstructor();
162
            for ($i = 0; $i < $columnCount; $i++) {
163
                if ($reflectionClass->hasProperty($column[$i]->getName())) {
164
                    $property = $reflectionClass->getProperty($column[$i]->getName());
165
                    $property->setAccessible(true);
166
                    $property->setValue($newInstance, $data[$i]);
167
                }
168
            }
169
            yield $newInstance;
170
        }
171
    }
172
173
    /**
174
     * @param string $content
175
     *
176
     * @return \stdClass
177
     */
178
    private function parseContent(string $content): \stdClass
179
    {
180
        $parsed = json_decode($content);
181
        if ($parsed === null && json_last_error() !== JSON_ERROR_NONE) {
182
            throw new \RuntimeException;
183
        }
184
185
        return $parsed;
186
    }
187
188
    /**
189
     * @param \stdClass $jsonContent
190
     *
191
     * @return StatementStats
192
     */
193
    private function statsTransfer(\stdClass $jsonContent): StatementStats
194
    {
195
        return new StatementStats($jsonContent);
196
    }
197
198
    /**
199
     * @param \stdClass $jsonContent
200
     *
201
     * @return QueryError
202
     */
203
    private function errorTransfer(\stdClass $jsonContent): QueryError
204
    {
205
        return new QueryError($jsonContent);
206
    }
207
208
    /**
209
     * @param array $columns
210
     */
211
    private function columnTransfer(array $columns)
212
    {
213
        foreach ($columns as $column) {
214
            $this->columns[] = new Column($column);
215
        }
216
    }
217
218
    /**
219
     * @return StatementStats|null
220
     */
221
    public function getStats()
222
    {
223
        return $this->stats;
224
    }
225
226
    /**
227
     * @return Column[]
228
     */
229
    public function getColumns(): array
230
    {
231
        return $this->columns;
232
    }
233
}
234