Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 50
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
Search
0.00% covered (danger)
0.00%
0 / 50
0.00% covered (danger)
0.00%
0 / 4
240
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 fetchSearchRow
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
20
 getSearchResults
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
42
 execute
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3namespace BO\Zmsdldb\Helper\MySQL;
4
5use BO\Zmsdldb\MySQLAccess;
6use BO\Zmsdldb\Entity\SearchResult;
7use BO\Zmsdldb\Collection\SearchResults;
8use Error;
9
10class Search
11{
12    protected $objectTypesClasses = [
13        'service' => '\\BO\\Zmsdldb\\MySQL\\Entity\\Service',
14        'location' => '\\BO\\Zmsdldb\\MySQL\\Entity\\Location',
15        'topic' => '\\BO\\Zmsdldb\\MySQL\\Entity\\Topic',
16        #'link' => '\\BO\\Zmsdldb\\MySQL\\Entity\\Link'
17    ];
18
19    protected $searchTypes = [];
20    protected $entityTypes = [];
21    protected $mysqlAccess = null;
22
23    protected $entityIds = [];
24
25    public function __construct(MySQLAccess $mysqlAccess, array $entityTypes = [], array $searchTypes = [])
26    {
27        $this->entityTypes = $entityTypes;
28        $this->searchTypes = $searchTypes;
29        $this->mysqlAccess = $mysqlAccess;
30    }
31
32    public function fetchSearchRow($object_id, $locale, $entity_type)
33    {
34        if (!isset($this->entityIds[$entity_type])) {
35            $this->entityIds[$entity_type] = [];
36        }
37        if (!isset($this->entityIds[$entity_type][$locale])) {
38            $this->entityIds[$entity_type][$locale] = [];
39        }
40        if (!isset($this->entityIds[$entity_type][$locale][$object_id])) {
41            $this->entityIds[$entity_type][$locale][$object_id] = $object_id;
42        }
43    }
44
45    protected function getSearchResults(string $query): SearchResults
46    {
47        try {
48            $resultList = new SearchResults();
49
50            foreach ($this->objectTypesClasses as $type => $entityClass) {
51                if (isset($this->entityIds[$type])) {
52                    $sql = "SELECT data_json FROM " . $type . " WHERE ";
53                    $where = [];
54
55                    foreach ($this->entityIds[$type] as $locale => $ids) {
56                        $where[] = "(locale = '" . $locale . "' AND id IN (" . implode(',', $ids) . "))";
57                    }
58                    $sql .= implode(' OR ', $where);
59
60                    $stm = $this->mysqlAccess->prepare($sql);
61                    $stm->execute();
62                    $stm->fetchAll(\PDO::FETCH_FUNC, function ($data_json) use ($entityClass, $resultList) {
63                        $entity = new $entityClass();
64                        $entity->offsetSet('data_json', $data_json);
65
66                        $resultList[] = SearchResult::create($entity);
67                    });
68                }
69            }
70            $links = $this->mysqlAccess->fromLink()->readSearchResultList($query);
71
72            foreach ($links as $link) {
73                $resultList[] = SearchResult::create($link);
74            }
75            return $resultList;
76        } catch (\Exception $e) {
77            throw $e;
78        }
79    }
80
81    public function execute(string $query): SearchResults
82    {
83        try {
84            $query = '+' . implode(' +', explode(' ', $query));
85
86            $sqlArgs = [$query];
87            $sql = "SELECT 
88                object_id, locale, entity_type 
89            FROM 
90                search 
91            WHERE
92                MATCH (search_value) AGAINST (? IN BOOLEAN MODE)
93            ";
94
95            if (!empty($this->entityTypes)) {
96                $sql .= " AND entity_type ";
97                if (1 == count($this->entityTypes)) {
98                    $sql .= " = ?";
99                    $sqlArgs[] = current($this->entityTypes);
100                } else {
101                    $questionMarks = array_fill(0, count($this->entityTypes), '?');
102                    $sql .= ' IN (' . implode(', ', $questionMarks) . ')';
103                    array_push($sqlArgs, ...$this->entityTypes);
104                }
105            }
106            $sql .= ' GROUP BY object_id, entity_type, locale';
107
108            $stm = $this->mysqlAccess->prepare($sql);
109
110            $stm->execute($sqlArgs);
111
112            $stm->fetchAll(\PDO::FETCH_FUNC, [$this, 'fetchSearchRow']);
113
114            $resultList = $this->getSearchResults($query);
115
116            return $resultList;
117        } catch (\Exception $e) {
118            throw $e;
119        }
120    }
121}