Passed
Push — develop ( 55232b...a353c8 )
by Stone
04:53 queued 24s
created

TrickSearch::searchTricks()   B

Complexity

Conditions 8
Paths 37

Size

Total Lines 45
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 21
dl 0
loc 45
rs 8.4444
c 0
b 0
f 0
cc 8
nc 37
nop 1
1
<?php
2
3
namespace App\Search;
4
5
use App\Entity\Category;
6
use App\Entity\Image;
7
use App\Entity\Tag;
8
use App\Entity\Video;
9
use App\Repository\CategoryRepository;
10
use App\Repository\ImageRepository;
11
use App\Repository\TagRepository;
12
use App\Repository\TrickRepository;
13
use App\Repository\VideoRepository;
14
15
class TrickSearch
16
{
17
18
    /**
19
     * @var TrickRepository
20
     */
21
    private $trickRepository;
22
    /**
23
     * @var CategoryRepository
24
     */
25
    private $categoryRepository;
26
    /**
27
     * @var TagRepository
28
     */
29
    private $tagRepository;
30
    /**
31
     * @var ImageRepository
32
     */
33
    private $imageRepository;
34
    /**
35
     * @var VideoRepository
36
     */
37
    private $videoRepository;
38
39
    public function __construct(
40
        TrickRepository $trickRepository,
41
        CategoryRepository $categoryRepository,
42
        TagRepository $tagRepository,
43
        ImageRepository $imageRepository,
44
        VideoRepository $videoRepository
45
    ) {
46
        $this->trickRepository = $trickRepository;
47
        $this->categoryRepository = $categoryRepository;
48
        $this->tagRepository = $tagRepository;
49
        $this->imageRepository = $imageRepository;
50
        $this->videoRepository = $videoRepository;
51
    }
52
53
    public function searchTricks(string $query)
54
    {
55
56
        $query = $this->sanitizeSearchQuery($query);
57
        $searchTerms = $this->extractSearchTerms($query);
58
59
        if (\count($searchTerms) === 0) {
60
            return $this->trickRepository->findAll();
61
        }
62
63
        $trickList = [];
64
        $trickList = array_merge($trickList, $this->trickRepository->findBySearchQuery($searchTerms));
65
66
67
        $categorySearch = $this->categoryRepository->findBySearchQuery($searchTerms);
68
        /** @var Category $category */
69
        foreach ($categorySearch as $category) {
70
            $trickList = array_merge($trickList, $category->getTricks()->toArray());
71
        }
72
73
        $tagSearch = $this->tagRepository->findBySearchQuery($searchTerms);
74
        /** @var Tag $tag */
75
        foreach ($tagSearch as $tag) {
76
            $trickList = array_merge($trickList, $tag->getTricks()->toArray());
77
        }
78
79
        $imageSearch = $this->imageRepository->findBySearchQuery($searchTerms);
80
        /** @var Image $image */
81
        foreach ($imageSearch as $image) {
82
            if($image->getTrick() !== null){
83
                $trickList[] = $image->getTrick();
84
            }
85
86
        }
87
88
        $videoSearch = $this->videoRepository->findBySearchQuery($searchTerms);
89
        /** @var Video $video */
90
        foreach ($videoSearch as $video) {
91
            if($video->getTrick() !== null){
92
                $trickList[] = $video->getTrick();
93
            }
94
95
        }
96
97
        return array_unique($trickList);
98
99
    }
100
101
    /**
102
     * @param string $query
103
     * @return string
104
     * Removes all non alphanum characters except whitespace
105
     */
106
    private function sanitizeSearchQuery(string $query): string
107
    {
108
        return trim(preg_replace('/[[:space:]]+/', ' ', $query));
109
    }
110
111
    /**
112
     * Splits the search query into terms and removes the ones which are irrelevant.
113
     */
114
    private function extractSearchTerms(string $searchQuery): array
115
    {
116
        $terms = array_unique(explode(' ', $searchQuery));
117
        return array_filter($terms, function ($term) {
118
            return 2 <= mb_strlen($term);
119
        });
120
    }
121
}