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