Passed
Pull Request — master (#69)
by Manuele
04:40
created

SearchProductsQueryBuilder::buildQuery()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 35
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 25
c 1
b 0
f 0
nc 4
nop 1
dl 0
loc 35
rs 9.2088
1
<?php
2
declare(strict_types=1);
3
4
namespace BitBag\SyliusElasticsearchPlugin\QueryBuilder;
5
6
use BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\SearchPropertyNameResolverRegistryInterface;
7
use Elastica\Query\AbstractQuery;
8
use Elastica\Query\BoolQuery;
9
use Elastica\Query\MultiMatch;
10
use Sylius\Component\Locale\Context\LocaleContextInterface;
11
12
final class SearchProductsQueryBuilder implements QueryBuilderInterface
13
{
14
    public const QUERY_KEY = 'query';
15
16
    /**
17
     * @var SearchPropertyNameResolverRegistryInterface
18
     */
19
    private $searchProperyNameResolverRegistry;
20
    /**
21
     * @var LocaleContextInterface
22
     */
23
    private $localeContext;
24
    /**
25
     * @var QueryBuilderInterface
26
     */
27
    private $isEnabledQueryBuilder;
28
    /**
29
     * @var QueryBuilderInterface
30
     */
31
    private $hasChannelQueryBuilder;
32
33
    public function __construct(
34
        SearchPropertyNameResolverRegistryInterface $searchProperyNameResolverRegistry,
35
        LocaleContextInterface $localeContext,
36
        QueryBuilderInterface $isEnabledQueryBuilder,
37
        QueryBuilderInterface $hasChannelQueryBuilder
38
    ) {
39
        $this->searchProperyNameResolverRegistry = $searchProperyNameResolverRegistry;
40
        $this->localeContext = $localeContext;
41
        $this->isEnabledQueryBuilder = $isEnabledQueryBuilder;
42
        $this->hasChannelQueryBuilder = $hasChannelQueryBuilder;
43
    }
44
45
    public function buildQuery(array $data): ?AbstractQuery
46
    {
47
        if (!array_key_exists(self::QUERY_KEY, $data)) {
48
            throw new \RuntimeException(
49
                sprintf(
50
                    'Could not build search products query because there\'s no "query" key in provided data. ' .
51
                    'Got the following keys: %s',
52
                    implode(', ', array_keys($data))
53
                )
54
            );
55
        }
56
        $query = $data[self::QUERY_KEY];
57
        if (!is_string($query)) {
58
            throw new \RuntimeException(
59
                sprintf(
60
                    'Could not build search products query because the provided "query" is expected to be a string ' .
61
                    'but "%s" is given.',
62
                    is_object($query) ? get_class($query) : gettype($query)
63
                )
64
            );
65
        }
66
67
        $multiMatch = new MultiMatch();
68
        $multiMatch->setQuery($query);
69
        $multiMatch->setFuzziness('AUTO');
70
        $fields = [];
71
        foreach ($this->searchProperyNameResolverRegistry->getPropertyNameResolvers() as $propertyNameResolver) {
72
            $fields[] = $propertyNameResolver->resolvePropertyName($this->localeContext->getLocaleCode());
73
        }
74
        $multiMatch->setFields($fields);
75
        $bool = new BoolQuery();
76
        $bool->addMust($multiMatch);
77
        $bool->addFilter($this->isEnabledQueryBuilder->buildQuery([]));
0 ignored issues
show
Bug introduced by
It seems like $this->isEnabledQueryBuilder->buildQuery(array()) can also be of type null; however, parameter $filter of Elastica\Query\BoolQuery::addFilter() does only seem to accept Elastica\Query\AbstractQuery, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

77
        $bool->addFilter(/** @scrutinizer ignore-type */ $this->isEnabledQueryBuilder->buildQuery([]));
Loading history...
78
        $bool->addFilter($this->hasChannelQueryBuilder->buildQuery([]));
79
        return $bool;
80
    }
81
}
82