Skip to content

Commit ab5f6a1

Browse files
committed
- Added RunnableSelect::fetchObjects, RunnableSelect::fetchObjectsLazy, RunnableSelect::fetchObject
1 parent be31cd7 commit ab5f6a1

File tree

1 file changed

+92
-110
lines changed

1 file changed

+92
-110
lines changed

src/Builder/RunnableSelect.php

Lines changed: 92 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -63,153 +63,53 @@ public function setPreserveTypes($preserveTypes = true) {
6363
* @return array[]
6464
*/
6565
public function fetchRows(Closure $callback = null) {
66-
return $this->createTempStatement(function (QueryStatement $statement) use ($callback) {
67-
$statement->setFetchMode(PDO::FETCH_ASSOC);
68-
$data = $statement->fetchAll();
69-
if($this->preserveTypes) {
70-
$columnDefinitions = FieldTypeProvider::getFieldTypes($statement);
71-
foreach($data as &$row) {
72-
$row = FieldValueConverter::convertValues($row, $columnDefinitions);
73-
}
74-
}
75-
if($callback !== null) {
76-
return call_user_func(function ($resultData = []) use ($data, $callback) {
77-
foreach($data as $row) {
78-
$result = $callback($row);
79-
if($result !== null && !($result instanceof DBIgnoreRow)) {
80-
$resultData[] = $result;
81-
} else {
82-
$resultData[] = $row;
83-
}
84-
}
85-
return $resultData;
86-
});
87-
}
88-
return $data;
89-
});
66+
return $this->fetchAll($callback, PDO::FETCH_ASSOC);
9067
}
9168

9269
/**
9370
* @param Closure $callback
9471
* @return array[]|\Generator
9572
*/
9673
public function fetchRowsLazy(Closure $callback = null) {
97-
if(version_compare(PHP_VERSION, '5.5', '<')) {
98-
return new YieldPolyfillIterator($callback, $this->preserveTypes, function () {
99-
$statement = $this->createStatement();
100-
$statement->setFetchMode(PDO::FETCH_ASSOC);
101-
return $statement;
102-
});
103-
}
104-
$statement = $this->createStatement();
105-
$statement->setFetchMode(PDO::FETCH_ASSOC);
106-
$generator = new LazyRowGenerator($this->preserveTypes);
107-
return $generator->generate($statement, $callback);
74+
return $this->fetchLazy($callback, PDO::FETCH_ASSOC);
10875
}
10976

11077
/**
11178
* @param Closure|null $callback
112-
* @return string[]
79+
* @return mixed[]
11380
* @throws \Exception
11481
*/
11582
public function fetchRow(Closure $callback = null) {
116-
return $this->createTempStatement(function (QueryStatement $statement) use ($callback) {
117-
$statement->setFetchMode(PDO::FETCH_ASSOC);
118-
$row = $statement->fetch();
119-
if(!is_array($row)) {
120-
return [];
121-
}
122-
if($this->preserveTypes) {
123-
$columnDefinitions = FieldTypeProvider::getFieldTypes($statement);
124-
$row = FieldValueConverter::convertValues($row, $columnDefinitions);
125-
}
126-
if($callback !== null) {
127-
$result = $callback($row);
128-
if($result !== null) {
129-
$row = $result;
130-
}
131-
}
132-
return $row;
133-
});
83+
return $this->fetch($callback, PDO::FETCH_ASSOC);
13484
}
13585

13686
/**
13787
* @param string $className
13888
* @param Closure $callback
139-
* @return \array[]
89+
* @return object[]
14090
* @throws \Exception
14191
*/
14292
public function fetchObjects($className, Closure $callback = null) {
143-
return $this->createTempStatement(function (QueryStatement $statement) use ($className, $callback) {
144-
$statement->setFetchMode(PDO::FETCH_CLASS, $className);
145-
$data = $statement->fetchAll();
146-
if($this->preserveTypes) {
147-
$columnDefinitions = FieldTypeProvider::getFieldTypes($statement);
148-
foreach($data as &$row) {
149-
$row = FieldValueConverter::convertValues($row, $columnDefinitions);
150-
}
151-
}
152-
if($callback !== null) {
153-
return call_user_func(function ($resultData = []) use ($data, $callback) {
154-
foreach($data as $row) {
155-
$result = $callback($row);
156-
if($result !== null && !($result instanceof DBIgnoreRow)) {
157-
$resultData[] = $result;
158-
} else {
159-
$resultData[] = $row;
160-
}
161-
}
162-
return $resultData;
163-
});
164-
}
165-
return $data;
166-
});
93+
return $this->fetchAll($callback, PDO::FETCH_CLASS, $className);
16794
}
16895

16996
/**
17097
* @param string $className
17198
* @param Closure $callback
172-
* @return array[]|Generator
99+
* @return object[]|Generator
173100
*/
174101
public function fetchObjectsLazy($className, Closure $callback = null) {
175-
if(version_compare(PHP_VERSION, '5.5', '<')) {
176-
return new YieldPolyfillIterator($callback, $this->preserveTypes, function () use ($className) {
177-
$statement = $this->createStatement();
178-
$statement->setFetchMode(PDO::FETCH_CLASS, $className);
179-
return $statement;
180-
});
181-
}
182-
$statement = $this->createStatement();
183-
$statement->setFetchMode(PDO::FETCH_CLASS, $className);
184-
$generator = new LazyRowGenerator($this->preserveTypes);
185-
return $generator->generate($statement, $callback);
102+
return $this->fetchLazy($callback, PDO::FETCH_CLASS, $className);
186103
}
187104

188105
/**
189106
* @param string $className
190107
* @param Closure|null $callback
191-
* @return string[]
108+
* @return object[]
192109
* @throws \Exception
193110
*/
194111
public function fetchObject($className, Closure $callback = null) {
195-
return $this->createTempStatement(function (QueryStatement $statement) use ($className, $callback) {
196-
$statement->setFetchMode(PDO::FETCH_CLASS, $className);
197-
$row = $statement->fetch();
198-
if(!is_array($row)) {
199-
return [];
200-
}
201-
if($this->preserveTypes) {
202-
$columnDefinitions = FieldTypeProvider::getFieldTypes($statement);
203-
$row = FieldValueConverter::convertValues($row, $columnDefinitions);
204-
}
205-
if($callback !== null) {
206-
$result = $callback($row);
207-
if($result !== null) {
208-
$row = $result;
209-
}
210-
}
211-
return $row;
212-
});
112+
return $this->fetch($callback, PDO::FETCH_CLASS, $className);
213113
}
214114

215115
/**
@@ -320,4 +220,86 @@ private function createStatement() {
320220
public function getIterator() {
321221
return $this->fetchRowsLazy();
322222
}
223+
224+
/**
225+
* @param callable $callback
226+
* @param int $mode
227+
* @param mixed $arg0
228+
* @return mixed
229+
* @throws \Exception
230+
*/
231+
private function fetchAll($callback, $mode, $arg0 = null) {
232+
return $this->createTempStatement(function (QueryStatement $statement) use ($callback, $mode, $arg0) {
233+
$statement->setFetchMode($mode, $arg0);
234+
$data = $statement->fetchAll();
235+
if($this->preserveTypes) {
236+
$columnDefinitions = FieldTypeProvider::getFieldTypes($statement);
237+
foreach($data as &$row) {
238+
$row = FieldValueConverter::convertValues($row, $columnDefinitions);
239+
}
240+
}
241+
if($callback !== null) {
242+
return call_user_func(function ($resultData = []) use ($data, $callback) {
243+
foreach($data as $row) {
244+
$result = $callback($row);
245+
if($result !== null && !($result instanceof DBIgnoreRow)) {
246+
$resultData[] = $result;
247+
} else {
248+
$resultData[] = $row;
249+
}
250+
}
251+
return $resultData;
252+
});
253+
}
254+
return $data;
255+
});
256+
}
257+
258+
/**
259+
* @param callable $callback
260+
* @param int $mode
261+
* @param mixed $arg0
262+
* @return Generator|YieldPolyfillIterator|mixed[]
263+
*/
264+
private function fetchLazy($callback, $mode, $arg0 = null) {
265+
if(version_compare(PHP_VERSION, '5.5', '<')) {
266+
return new YieldPolyfillIterator($callback, $this->preserveTypes, function () use ($mode, $arg0) {
267+
$statement = $this->createStatement();
268+
$statement->setFetchMode($mode, $arg0);
269+
return $statement;
270+
});
271+
}
272+
$statement = $this->createStatement();
273+
$statement->setFetchMode($mode, $arg0);
274+
$generator = new LazyRowGenerator($this->preserveTypes);
275+
return $generator->generate($statement, $callback);
276+
}
277+
278+
/**
279+
* @param callable $callback
280+
* @param int $mode
281+
* @param mixed $arg0
282+
* @return mixed
283+
* @throws \Exception
284+
*/
285+
private function fetch($callback, $mode, $arg0 = null) {
286+
return $this->createTempStatement(function (QueryStatement $statement) use ($callback, $mode, $arg0) {
287+
$statement->setFetchMode($mode, $arg0);
288+
$row = $statement->fetch();
289+
if(!is_array($row)) {
290+
return [];
291+
}
292+
if($this->preserveTypes) {
293+
$columnDefinitions = FieldTypeProvider::getFieldTypes($statement);
294+
$row = FieldValueConverter::convertValues($row, $columnDefinitions);
295+
}
296+
if($callback !== null) {
297+
$result = $callback($row);
298+
if($result !== null) {
299+
$row = $result;
300+
}
301+
}
302+
return $row;
303+
});
304+
}
323305
}

0 commit comments

Comments
 (0)