Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 131
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
Service
0.00% covered (danger)
0.00%
0 / 131
0.00% covered (danger)
0.00%
0 / 6
552
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
12
 fetchList
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
12
 fetchFromCsv
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
6
 searchAll
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 1
42
 readSearchResultList
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
20
 fetchServicesForCompilation
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3/**
4 * @package ClientDldb
5 * @copyright BerlinOnline Stadtportal GmbH & Co. KG
6 **/
7
8namespace BO\Zmsdldb\Elastic;
9
10use BO\Zmsdldb\Entity\Service as Entity;
11use BO\Zmsdldb\Collection\Services as Collection;
12use BO\Zmsdldb\File\Service as Base;
13
14/**
15 * @SuppressWarnings(Coupling)
16 */
17class Service extends Base
18{
19    /**
20     *
21     * @return Entity
22     */
23    #[\Override]
24    public function fetchId($itemId)
25    {
26        if ($itemId) {
27            $query = Helper::boolFilteredQuery();
28            $filter = new \Elastica\Filter\Ids();
29            $filter->setIds($this->locale . $itemId);
30            $query->getFilter()->addMust($filter);
31            $result = $this->access()
32                ->getIndex()
33                ->getType('service')
34                ->search($query);
35            if ($result->count() == 1) {
36                $locationList = $result->getResults();
37                return new Entity($locationList[0]->getData());
38            }
39        }
40        return false;
41    }
42
43    /**
44     *
45     * @return Collection
46     */
47    #[\Override]
48    public function fetchList($location_csv = false)
49    {
50        $boolquery = Helper::boolFilteredQuery();
51        $boolquery->getFilter()->addMust(Helper::localeFilter($this->locale));
52        $query = \Elastica\Query::create($boolquery);
53        if ($location_csv) {
54            $filter = new \Elastica\Filter\Terms('locations.location', explode(',', $location_csv));
55            $filter->setExecution('and');
56            $query->setPostFilter($filter);
57        }
58        $resultList = $this->access()
59            ->getIndex()
60            ->getType('service')
61            ->search($query, 10000);
62        $serviceList = new Collection();
63        foreach ($resultList as $result) {
64            $service = new Entity($result->getData());
65            $serviceList[$service['id']] = $service;
66        }
67        return $serviceList;
68    }
69
70    /**
71     *
72     * @return Collection
73     */
74    #[\Override]
75    public function fetchFromCsv($service_csv)
76    {
77        $query = Helper::boolFilteredQuery();
78        $filter = new \Elastica\Filter\Ids();
79        $ids = explode(',', $service_csv);
80        $ids = array_map(function ($value) {
81            return $this->locale . $value;
82        }, $ids);
83        $filter->setIds($ids);
84        $query->getFilter()->addMust($filter);
85        $resultList = $this->access()
86            ->getIndex()
87            ->getType('service')
88            ->search($query, 10000);
89        $serviceList = new Collection();
90        foreach ($resultList as $result) {
91            $service = new Entity($result->getData());
92            $serviceList[$service['id']] = $service;
93        }
94        return $serviceList;
95    }
96
97    /**
98     *
99     * @return Collection
100     */
101    #[\Override]
102    public function searchAll($querystring, $service_csv = '', $location_csv = '')
103    {
104        $query = new \Elastica\Query();
105        $locationsCsvByUser = false;
106        if (! $location_csv) {
107            $location_csv = $this->fetchLocationCsv($service_csv);
108        } else {
109            $locationsCsvByUser = true;
110        }
111
112        $boolquery = new \Elastica\Query\BoolQuery();
113        $searchquery = new \Elastica\Query\QueryString();
114        if ('' === trim($querystring)) {
115            $searchquery->setQuery('*');
116        } else {
117            $searchquery->setQuery($querystring);
118        }
119        $searchquery->setFields([
120            'name^9',
121            'keywords^5'
122        ]);
123
124        $boolquery->addShould($searchquery);
125        $filter = new \Elastica\Filter\BoolFilter();
126        $filter->addMust(Helper::localeFilter($this->locale));
127        if ($location_csv) {
128            $filter->addMust(new \Elastica\Filter\Terms('locations.location', explode(',', $location_csv)));
129        }
130        $filteredQuery = new \Elastica\Query\Filtered($boolquery, $filter);
131        $query->setQuery($filteredQuery);
132        $query->addSort(['sort' => 'asc']);
133        $resultList = $this->access()
134        ->getIndex()
135        ->getType('service')
136        ->search($query, 1000);
137        $serviceList = new Collection();
138        foreach ($resultList as $result) {
139            $service = new Entity($result->getData());
140            $serviceList[$service['id']] = $service;
141        }
142        if ($locationsCsvByUser) {
143            $serviceList = $serviceList->containsLocation($location_csv);
144        }
145        return $serviceList;
146    }
147
148    /**
149     * this function is similar to self::searchAll() but it might get different boosts in the future
150     * additionally, a restriction by locale is missing
151     *
152     * @return Collection
153     */
154    #[\Override]
155    public function readSearchResultList($query, $service_csv = '')
156    {
157        $boolquery = Helper::boolFilteredQuery();
158        $boolquery->getFilter()->addMust(Helper::localeFilter($this->locale));
159        $searchquery = new \Elastica\Query\QueryString();
160        if ('' === trim($query)) {
161            $searchquery->setQuery('*');
162        } else {
163            $searchquery->setQuery($query);
164        }
165        $searchquery->setFields([
166            'name^9',
167            'keywords^5'
168        ]);
169        $boolquery->getQuery()->addShould($searchquery);
170        $filter = null;
171        if ($service_csv) {
172            $filter = new \Elastica\Filter\Terms('services.service', explode(',', $service_csv));
173        }
174        $query = new \Elastica\Query\Filtered($boolquery, $filter);
175        $resultList = $this->access()
176            ->getIndex()
177            ->getType('service')
178            ->search($query, 1000);
179        $serviceList = new Collection();
180        foreach ($resultList as $result) {
181            $service = new Entity($result->getData());
182            $serviceList[$service['id']] = $service;
183        }
184        return $serviceList;
185    }
186
187    public function fetchServicesForCompilation($authoritys = [], $locations = [], $services = [])
188    {
189        $limit = 1000;
190
191        $localeFilter = new \Elastica\Query\Term(array(
192            'meta.locale' => $this->locale
193        ));
194
195        $boolquery = new \Elastica\Query\BoolQuery();
196        $boolquery->addMust($localeFilter);
197
198        if (!empty($authoritys)) {
199            $authorityFilter = new \Elastica\Query\Terms('authorities.id', $authoritys);
200            $boolquery->addMust($authorityFilter);
201        }
202        if (!empty($locations)) {
203            $locationFilter = new \Elastica\Query\Terms('locations.location', $locations);
204            $boolquery->addMust($locationFilter);
205        }
206        if (!empty($services)) {
207            $serviceFilter = new \Elastica\Query\Terms('id', $services);
208            $boolquery->addMust($serviceFilter);
209        }
210
211        $query = \Elastica\Query::create($boolquery);
212        $query->addSort(['sort' => 'asc']);
213        $resultList = $this
214            ->access()
215            ->getIndex()
216            ->getType('service')
217            ->search($query, $limit)
218        ;
219        $serviceList = new Collection();
220        foreach ($resultList as $result) {
221            $service = new Entity($result->getData());
222            $serviceList[$service['id']] = $service;
223        }
224        return $serviceList;
225    }
226}