Passed
Pull Request — master (#213)
by Simon
06:50 queued 04:29
created

QueryComponentFacetTrait::buildFacetQuery()   A

Complexity

Conditions 5
Paths 6

Size

Total Lines 17
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 5.009

Importance

Changes 6
Bugs 0 Features 0
Metric Value
cc 5
eloc 13
c 6
b 0
f 0
nc 6
nop 0
dl 0
loc 17
ccs 13
cts 14
cp 0.9286
crap 5.009
rs 9.5222
1
<?php
2
/**
3
 * Trait QueryComponentFacetTrait|Firesphere\SolrSearch\Traits\QueryComponentFacetTrait Trait to set Faceting on fields
4
 * for the {@link \Firesphere\SolrSearch\Factories\QueryComponentFactory}
5
 *
6
 * @package Firesphere\SolrSearch\Traits
7
 * @author Simon `Firesphere` Erkelens; Marco `Sheepy` Hermo
8
 * @copyright Copyright (c) 2018 - now() Firesphere & Sheepy
9
 */
10
11
namespace Firesphere\SolrSearch\Traits;
12
13
use Firesphere\SolrSearch\Indexes\BaseIndex;
14
use Firesphere\SolrSearch\Queries\BaseQuery;
15
use Minimalcode\Search\Criteria;
16
use Solarium\Component\Facet\Field;
17
use Solarium\QueryType\Select\Query\Query;
18
19
/**
20
 * Trait QueryComponentFacetTrait deals with the facets.
21
 *
22
 * Faceting for any given query or index.
23
 *
24
 * @package Firesphere\SolrSearch\Traits
25
 */
26
trait QueryComponentFacetTrait
27
{
28
    /**
29
     * @var BaseIndex Index to query
30
     */
31
    protected $index;
32
    /**
33
     * @var BaseQuery Query to use
34
     */
35
    protected $query;
36
    /**
37
     * @var Query Solarium query
38
     */
39
    protected $clientQuery;
40
41
    /**
42
     * Add facets from the index
43
     */
44 9
    protected function buildFacets(): void
45
    {
46 9
        $facets = $this->clientQuery->getFacetSet();
47
        // Facets should be set from the index configuration
48 9
        foreach ($this->index->getFacetFields() as $class => $config) {
49 2
            $shortClass = getShortFieldName($config['BaseClass']);
50 2
            $field = $shortClass . '_' . str_replace('.', '_', $config['Field']);
51
            /** @var Field $facet */
52 2
            $facet = $facets->createFacetField('facet-' . $config['Title']);
53 2
            $facet->setField($field);
54
        }
55
        // Count however, comes from the query
56 9
        $facets->setMinCount($this->query->getFacetsMinCount());
57 9
    }
58
59
    /**
60
     * Add facet filters based on the current request
61
     */
62 9
    protected function buildFacetQuery()
63
    {
64 9
        $filterFacets = $this->query->getFacetFilter();
65 9
        foreach ($this->index->getFacetFields() as $class => $config) {
66 2
            if (isset($filterFacets[$config['Title']])) {
67 1
                $filter = $filterFacets[$config['Title']];
68 1
                $filter = is_array($filter) ? $filter : [$filter];
69
                // Fields are "short named" for convenience
70 1
                $shortClass = getShortFieldName($config['BaseClass']);
71 1
                $field = $shortClass . '_' . str_replace('.', '_', $config['Field']);
72 1
                $criteria = Criteria::where($field)->is(array_pop($filter));
73 1
                foreach ($filter as $key => $filterValue) {
74
                    $criteria->andWhere($field)->is($filterValue);
75
                }
76 1
                $this->clientQuery
77 1
                    ->createFilterQuery('facet-' . $config['Title'])
78 2
                    ->setQuery($criteria->getQuery());
79
            }
80
        }
81 9
    }
82
}
83