Passed
Push — develop ( 02b19a...b765c6 )
by Stone
04:36
created

TrickSearch   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 70
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 24
dl 0
loc 70
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A extractSearchTerms() 0 5 1
A sanitizeSearchQuery() 0 3 1
A searchTricks() 0 26 4
A __construct() 0 5 1
1
<?php
2
3
namespace App\Search;
4
5
use App\Repository\CategoryRepository;
6
use App\Repository\TagRepository;
7
use App\Repository\TrickRepository;
8
9
class TrickSearch
10
{
11
12
    /**
13
     * @var TrickRepository
14
     */
15
    private $trickRepository;
16
    /**
17
     * @var CategoryRepository
18
     */
19
    private $categoryRepository;
20
    /**
21
     * @var TagRepository
22
     */
23
    private $tagRepository;
24
25
    public function __construct(TrickRepository $trickRepository, CategoryRepository $categoryRepository, TagRepository $tagRepository)
26
    {
27
        $this->trickRepository = $trickRepository;
28
        $this->categoryRepository = $categoryRepository;
29
        $this->tagRepository = $tagRepository;
30
    }
31
32
    public function searchTricks(string $query)
33
    {
34
35
        $query = $this->sanitizeSearchQuery($query);
36
        $searchTerms = $this->extractSearchTerms($query);
37
38
        if (\count($searchTerms) === 0) {
39
            return $this->trickRepository->findAll();
40
        }
41
42
        $trickList = [];
43
        $trickList = array_merge($trickList, $this->trickRepository->findBySearchQuery($searchTerms));
44
45
46
        $categorySearch = $this->categoryRepository->findBySearchQuery($searchTerms);
47
        foreach ($categorySearch as $category) {
48
            $trickList = array_merge($trickList, $category->getTricks()->toArray());
49
        }
50
51
        $tagSearch = $this->tagRepository->findBySearchQuery($searchTerms);
52
        foreach ($tagSearch as $tag){
53
            $trickList = array_merge($trickList, $tag->getTricks()->toArray());
54
        }
55
56
57
        return array_unique($trickList);
58
59
    }
60
61
    /**
62
     * @param string $query
63
     * @return string
64
     * Removes all non alphanum characters except whitespace
65
     */
66
    private function sanitizeSearchQuery(string $query): string
67
    {
68
        return trim(preg_replace('/[[:space:]]+/', ' ', $query));
69
    }
70
71
    /**
72
     * Splits the search query into terms and removes the ones which are irrelevant.
73
     */
74
    private function extractSearchTerms(string $searchQuery): array
75
    {
76
        $terms = array_unique(explode(' ', $searchQuery));
77
        return array_filter($terms, function ($term) {
78
            return 2 <= mb_strlen($term);
79
        });
80
    }
81
}