Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 181
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
Location
0.00% covered (danger)
0.00%
0 / 181
0.00% covered (danger)
0.00%
0 / 8
1190
0.00% covered (danger)
0.00%
0 / 1
 fetchId
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
42
 fetchList
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 1
20
 fetchListByOffice
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
12
 fetchFromCsv
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
12
 fetchGeoJsonLocations
0.00% covered (danger)
0.00%
0 / 34
0.00% covered (danger)
0.00%
0 / 1
20
 fetchGeoJson
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
72
 readSearchResultList
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
6
 fetchLocationsForCompilation
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3/**
4 * @package ClientDldb
5 * @copyright BerlinOnline Stadtportal GmbH & Co. KG
6 **/
7
8namespace BO\Zmsdldb\MySQL;
9
10use BO\Zmsdldb\MySQL\Entity\Location as Entity;
11use BO\Zmsdldb\MySQL\Collection\Locations as Collection;
12use BO\Zmsdldb\Elastic\Location as Base;
13
14/**
15 * @SuppressWarnings(Coupling)
16 */
17class Location extends Base
18{
19    #[\Override]
20    public function fetchId($itemId)
21    {
22        try {
23            if ($itemId) {
24                $sqlArgs = [$this->locale, (int)$itemId];
25                $sql = 'SELECT data_json FROM location WHERE locale = ? AND id = ?';
26
27                $stm = $this->access()->prepare($sql);
28                $stm->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, '\\BO\\Zmsdldb\\MySQL\\Entity\\Location');
29                $stm->execute($sqlArgs);
30                if (!$stm || ($stm && $stm->rowCount() == 0)) {
31                    return false;
32                }
33                $service = $stm->fetch();
34                return $service;
35            }
36            return false;
37        } catch (\Exception $e) {
38            throw $e;
39        }
40    }
41
42    #[\Override]
43    public function fetchList($service_csv = false, $mixLanguages = false)
44    {
45        # COALESCE(l2.data_json, l.data_json) AS data_json
46        # IF(l2.id, l2.data_json, l.data_json) AS data_json
47        try {
48            $sqlArgs = [$this->locale];
49            $where = [];
50            $join = [];
51            $groupBy = '';
52            if (false === $mixLanguages) {
53                $where[] = 'l.locale = ?';
54                $sql = 'SELECT data_json FROM location AS l';
55            } else {
56                $where[] = "l.locale='de'";
57                $sql = "SELECT 
58                COALESCE(l2.data_json, l.data_json) AS data_json
59                FROM location AS l
60                LEFT JOIN location AS l2 ON l2.id = l.id AND l2.locale = ?
61                ";
62            }
63
64            if (!empty($service_csv)) {
65                #$sqlArgs[] = $this->locale;
66                $ids = explode(',', $service_csv);
67                $questionMarks = array_fill(0, count($ids), '?');
68                $join[] = 'LEFT JOIN location_service AS ls ON ls.location_id = l.id';# AND ls.locale = ?';
69
70                $where[] = "ls.service_id IN (" . implode(', ', $questionMarks) . ")";
71                $groupBy = 'GROUP BY l.id';
72                array_push($sqlArgs, ...$ids);
73            }
74            $sql .= " " . implode(' ', $join);
75            $sql .= " WHERE " . implode(' AND ', $where);
76            $sql .= " " . $groupBy;
77
78            $locationList = new Collection();
79
80            $stm = $this->access()->prepare($sql);
81            $stm->execute($sqlArgs);
82            $stm->fetchAll(\PDO::FETCH_FUNC, function ($data_json) use ($locationList) {
83                $location = new \BO\Zmsdldb\MySQL\Entity\Location();
84                $location->offsetSet('data_json', $data_json);
85
86                $locationList[$location['id']] = $location;
87            });
88
89            return $locationList;
90        } catch (\Exception $e) {
91            throw $e;
92        }
93    }
94
95    #[\Override]
96    public function fetchListByOffice($office, $mixLanguages = false)
97    {
98        try {
99            $sqlArgs = [$this->locale];
100            $where = [];
101            $join = [];
102            $groupBy = '';
103            if (false === $mixLanguages) {
104                $where[] = 'l.locale = ?';
105                $sql = 'SELECT data_json FROM location AS l';
106            } else {
107                $where[] = "l.locale='de'";
108                $sql = "SELECT 
109                COALESCE(l2.data_json, l.data_json) AS data_json
110                FROM location AS l
111                LEFT JOIN location AS l2 ON l2.id = l.id AND l2.locale = ?
112                ";
113            }
114            $where[] = "l.category_identifier = ?";
115            $sqlArgs[] = $office;
116
117            $sql .= " " . implode(' ', $join);
118            $sql .= " WHERE " . implode(' AND ', $where);
119
120            $sql .= " " . $groupBy;
121
122            $locationList = new Collection();
123            $stm = $this->access()->prepare($sql);
124            $stm->execute($sqlArgs);
125            $stm->fetchAll(\PDO::FETCH_FUNC, function ($data_json) use ($locationList) {
126                $location = new \BO\Zmsdldb\MySQL\Entity\Location();
127                $location->offsetSet('data_json', $data_json);
128
129                $locationList[$location['id']] = $location;
130            });
131
132            return $locationList;
133        } catch (\Exception $e) {
134            throw $e;
135        }
136    }
137
138    /**
139     *
140     * @return Collection
141     */
142    #[\Override]
143    public function fetchFromCsv($location_csv, $mixLanguages = false)
144    {
145        try {
146            $sqlArgs = [$this->locale];
147            $where = [];
148            if (false === $mixLanguages) {
149                $where[] = 'l.locale = ?';
150                $sql = 'SELECT data_json FROM location AS l';
151            } else {
152                $where[] = "l.locale='de'";
153                $sql = "SELECT 
154                COALESCE(l2.data_json, l.data_json) AS data_json
155                FROM location AS l
156                LEFT JOIN location AS l2 ON l2.id = l.id AND l2.locale = ?
157                ";
158            }
159
160            $ids = explode(',', $location_csv);
161            $questionMarks = array_fill(0, count($ids), '?');
162            $where[] = 'l.id IN (' . implode(', ', $questionMarks) . ')';
163            array_push($sqlArgs, ...$ids);
164
165            $sql .= " WHERE " . implode(' AND ', $where);
166
167            $locationList = new Collection();
168
169            $stm = $this->access()->prepare($sql);
170            $stm->execute($sqlArgs);
171            $stm->fetchAll(\PDO::FETCH_FUNC, function ($data_json) use ($locationList) {
172                $location = new \BO\Zmsdldb\MySQL\Entity\Location();
173                $location->offsetSet('data_json', $data_json);
174
175                $locationList[$location['id']] = $location;
176            });
177
178            return $locationList;
179        } catch (\Exception $e) {
180            throw $e;
181        }
182    }
183
184    #[\Override]
185    protected function fetchGeoJsonLocations($category, $getAll)
186    {
187        try {
188            $sqlArgs = [$this->locale, $this->locale, $this->locale];
189            $sql = 'SELECT 
190                l.id, l.name, l.authority_name, l.category_json, 
191                c.contact_json, c.address_json, c.geo_json,
192                m.url AS meta__url
193            FROM 
194                location AS l
195            LEFT JOIN 
196                contact AS c ON c.object_id = l.id AND c.locale = ?
197            LEFT JOIN 
198                meta AS m ON m.object_id = l.id AND m.locale = ?
199            WHERE l.locale = ?';
200
201            if (!empty($category) && false === $getAll) {
202                $sqlArgs[] = $category;
203                $sql .= ' AND category_identifier = ?';
204            }
205            $sql .= ' ORDER BY l.category_identifier, l.name';
206
207            $locationList = new Collection();
208
209            $stm = $this->access()->prepare($sql);
210            $stm->execute($sqlArgs);
211            $stm->fetchAll(\PDO::FETCH_FUNC, function (
212                $id,
213                $name,
214                $authority_name,
215                $category_json,
216                $contact_json,
217                $address_json,
218                $geo_json,
219                $meta__url
220            ) use ($locationList) {
221                $location = new \BO\Zmsdldb\MySQL\Entity\Location();
222                $location->offsetSet('id', $id);
223                $location->offsetSet('name', $name);
224                $location->offsetSet('authority_name', $authority_name);
225                $location->offsetSet('category_json', $category_json);
226                $location->offsetSet('contact_json', $contact_json);
227                $location->offsetSet('address_json', $address_json);
228                $location->offsetSet('geo_json', $geo_json);
229                $location->offsetSet('meta__url', $meta__url);
230
231                $locationList[$location['id']] = $location;
232            });
233
234            return $locationList;
235        } catch (\Exception $e) {
236            throw $e;
237        }
238    }
239
240    /**
241     * @todo Refactoring required, functions in this class should return entities, not JSON data
242     */
243    #[\Override]
244    public function fetchGeoJson($category = null, $getAll = false)
245    {
246        $locationList = $this->fetchGeoJsonLocations($category, $getAll);
247        $geoJson = [];
248        // TODO check refactoring: the following lines were ineffective cause the line $geoJson=[] happened afterwards
249        //if (!empty($category) && false === $getAll) {
250        //    $geoJson['category'] = $category;
251        //}
252        foreach ($locationList as $location) {
253            if (empty($location['category']['identifier'])) {
254                continue;
255            }
256            if (!isset($geoJson[$location['category']['identifier']])) {
257                $geoJson[$location['category']['identifier']] = [
258                    'name' => $location['category']['name'],
259                    'type' => 'cluster',
260                    'active' => (
261                        !empty($category)
262                        && $category == $location['category']['identifier'] ? true : (
263                            !empty($category) && $category != $location['category']['identifier'] ? false : true
264                        )
265                    ),
266                    'data' => ['type' => 'FeatureCollection', 'features' => []]
267                ];
268            }
269            $geoJson[$location['category']['identifier']]['data']['features'][] = $location->getGeoJson();
270        }
271        return $geoJson;
272    }
273
274    #[\Override]
275    public function readSearchResultList($query, $service_csv = null)
276    {
277        try {
278            #$query = '+' . implode(' +', explode(' ', $query));
279            $sqlArgs = [$this->locale, $this->locale, $query];
280            $sql = "SELECT l.data_json 
281            FROM search AS se
282            LEFT JOIN location AS l ON l.id = se.object_id AND l.locale = ?
283            WHERE 
284                se.locale = ? AND MATCH (search_value) AGAINST (? IN BOOLEAN MODE)
285                AND (search_type IN ('name', 'keywords', 'address')) AND entity_type='location'
286             GROUP BY se.object_id
287            ";
288            /*
289            if (!empty($service_csv)) {
290                $ids = explode(',', $service_csv);
291                $qm = array_fill(0, count($ids), '?');
292                $sql .= ' AND se.object_id IN (' . implode(', ', $qm) . ')';
293                array_push($sqlArgs, ...$ids);
294            }*/
295            #print_r($sql);exit;
296
297            $locationList = new Collection();
298
299            $stm = $this->access()->prepare($sql);
300            $stm->execute($sqlArgs);
301            $stm->fetchAll(\PDO::FETCH_FUNC, function ($data_json) use ($locationList) {
302                $location = new \BO\Zmsdldb\MySQL\Entity\Location();
303                $location->offsetSet('data_json', $data_json);
304
305                $locationList[$location['id']] = $location;
306            });
307
308            return $locationList;
309        } catch (\Exception $e) {
310            throw $e;
311        }
312    }
313
314    #[\Override]
315    public function fetchLocationsForCompilation($authoritys = [], $locations = [])
316    {
317        try {
318            $sqlArgs = [$this->locale];
319
320            $sql = "SELECT 
321                l.data_json
322            FROM location AS l
323            ";
324            $where = ['l.locale = ?'];
325
326            if (!empty($authoritys)) {
327                $where[] = 'l.authority_id IN (' . implode(',', $authoritys) . ')';
328            }
329
330            if (!empty($locations)) {
331                $where[] = 'l.id IN (' . implode(',', $locations) . ')';
332            }
333
334            $sql .= ' WHERE ' . implode(' AND ', $where);
335
336            $locationList = new Collection();
337
338            $stm = $this->access()->prepare($sql);
339            $stm->execute($sqlArgs);
340            $stm->fetchAll(\PDO::FETCH_FUNC, function ($data_json) use ($locationList) {
341                $location = new \BO\Zmsdldb\MySQL\Entity\Location();
342                $location->offsetSet('data_json', $data_json);
343
344                $locationList[$location['id']] = $location;
345            });
346
347            return $locationList;
348        } catch (\Exception $e) {
349            throw $e;
350        }
351    }
352}