Completed
Push — master ( cc27d1...fcdbd4 )
by yuuki
10s
created

QueryResult::yieldData()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 15
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 15
rs 9.2
c 0
b 0
f 0
cc 4
eloc 10
nc 6
nop 0
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
     * @param string $content
133
     *
134
     * @return \stdClass
135
     */
136
    private function parseContent(string $content): \stdClass
137
    {
138
        $parsed = json_decode($content);
139
        if ($parsed === null && json_last_error() !== JSON_ERROR_NONE) {
140
            throw new \RuntimeException;
141
        }
142
143
        return $parsed;
144
    }
145
146
    /**
147
     * @param \stdClass $jsonContent
148
     *
149
     * @return StatementStats
150
     */
151
    private function statsTransfer(\stdClass $jsonContent): StatementStats
152
    {
153
        return new StatementStats($jsonContent);
154
    }
155
156
    /**
157
     * @param \stdClass $jsonContent
158
     *
159
     * @return QueryError
160
     */
161
    private function errorTransfer(\stdClass $jsonContent): QueryError
162
    {
163
        return new QueryError($jsonContent);
164
    }
165
166
    /**
167
     * @param array $columns
168
     */
169
    private function columnTransfer(array $columns)
170
    {
171
        foreach ($columns as $column) {
172
            $this->columns[] = new Column($column);
173
        }
174
    }
175
176
    /**
177
     * @return StatementStats|null
178
     */
179
    public function getStats()
180
    {
181
        return $this->stats;
182
    }
183
184
    /**
185
     * @return Column[]
186
     */
187
    public function getColumns(): array
188
    {
189
        return $this->columns;
190
    }
191
}
192