Passed
Pull Request — release-11.5.x (#3183)
by Rafael
25:36 queued 22:18
created

OptionsFacetQueryBuilder::build()   A

Complexity

Conditions 5
Paths 8

Size

Total Lines 32
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 18
c 1
b 0
f 0
dl 0
loc 32
ccs 18
cts 18
cp 1
rs 9.3554
cc 5
nc 8
nop 2
crap 5
1
<?php
2
namespace ApacheSolrForTypo3\Solr\Domain\Search\ResultSet\Facets\OptionBased\Options;
3
4
/*
5
 * This file is part of the TYPO3 CMS project.
6
 *
7
 * It is free software; you can redistribute it and/or modify it under
8
 * the terms of the GNU General Public License, either version 2
9
 * of the License, or any later version.
10
 *
11
 * For the full copyright and license information, please read the
12
 * LICENSE.txt file that was distributed with this source code.
13
 *
14
 * The TYPO3 project - inspiring people to share!
15
*/
16
17
use ApacheSolrForTypo3\Solr\Domain\Search\ResultSet\Facets\DefaultFacetQueryBuilder;
18
use ApacheSolrForTypo3\Solr\Domain\Search\ResultSet\Facets\FacetQueryBuilderInterface;
19
use ApacheSolrForTypo3\Solr\Domain\Search\ResultSet\Facets\SortingExpression;
20
use ApacheSolrForTypo3\Solr\System\Configuration\TypoScriptConfiguration;
21
22
/**
23
 * Class OptionsFacetQueryBuilder
24
 *
25
 * The Options facet query builder builds the facets as json structure
26
 *
27
 * @Todo: When we use json faceting for other facets some logic of this class can be moved to the base class.
28
 */
29
class OptionsFacetQueryBuilder extends DefaultFacetQueryBuilder implements FacetQueryBuilderInterface {
30
31
    /**
32
     * @param string $facetName
33
     * @param TypoScriptConfiguration $configuration
34
     * @return array
35
     */
36 37
    public function build($facetName, TypoScriptConfiguration $configuration)
37
    {
38 37
        $facetParameters = [];
39 37
        $facetConfiguration = $configuration->getSearchFacetingFacetByName($facetName);
40
41
        $jsonFacetOptions = [
42 37
            'type' => 'terms',
43 37
            'field' => $facetConfiguration['field'],
44
        ];
45
46 37
        $jsonFacetOptions['limit'] = $this->buildLimitForJson($facetConfiguration, $configuration);
47 37
        $jsonFacetOptions['mincount'] = $this->buildMincountForJson($facetConfiguration, $configuration);
48
49 37
        $sorting = $this->buildSortingForJson($facetConfiguration);
50 37
        if (!empty($sorting)) {
51 5
            $jsonFacetOptions['sort'] = $sorting;
52
        }
53
54 37
        if (is_array($facetConfiguration['metrics.'] ?? null)) {
55 2
            foreach ($facetConfiguration['metrics.'] as $key => $value) {
56 2
                $jsonFacetOptions['facet']['metrics_' . $key] = $value;
57
            }
58
        }
59
60 37
        $excludeTags = $this->buildExcludeTagsForJson($facetConfiguration, $configuration);
61 37
        if (!empty($excludeTags)) {
62 11
            $jsonFacetOptions['domain']['excludeTags'] = $excludeTags;
63
        }
64
65 37
        $facetParameters['json.facet'][$facetName] = $jsonFacetOptions;
66
67 37
        return $facetParameters;
68
    }
69
70
    /**
71
     * @param array $facetConfiguration
72
     * @param TypoScriptConfiguration $configuration
73
     * @return string
74
     */
75 37
    protected function buildExcludeTagsForJson(array $facetConfiguration, TypoScriptConfiguration $configuration)
76
    {
77 37
        $excludeFields = [];
78
79 37
        if ($configuration->getSearchFacetingKeepAllFacetsOnSelection()) {
80 5
            if (!$configuration->getSearchFacetingCountAllFacetsForSelection()) {
81
                // keepAllOptionsOnSelection globally active
82 4
                foreach ($configuration->getSearchFacetingFacets() as $facet) {
83 4
                    $excludeFields[] = $facet['field'];
84
                }
85
            } else {
86 1
                $excludeFields[] = $facetConfiguration['field'];
87
            }
88
        }
89
90 37
        $isKeepAllOptionsActiveForSingleFacet = ($facetConfiguration['keepAllOptionsOnSelection'] ?? null) == 1;
91 37
        if ($isKeepAllOptionsActiveForSingleFacet) {
92 7
            $excludeFields[] = $facetConfiguration['field'];
93
        }
94
95 37
        if (!empty($facetConfiguration['additionalExcludeTags'])) {
96 1
            $excludeFields[] = $facetConfiguration['additionalExcludeTags'];
97
        }
98
99 37
        return implode(',', array_unique($excludeFields));
100
    }
101
102
    /**
103
     * @param array $facetConfiguration
104
     * @param TypoScriptConfiguration $configuration
105
     * @return int
106
     */
107 37
    protected function buildLimitForJson(array $facetConfiguration, TypoScriptConfiguration $configuration): int
108
    {
109 37
        return $facetConfiguration['facetLimit'] ?? ($configuration->getSearchFacetingFacetLimit() ?? -1);
110
    }
111
112
    /**
113
     * @param array $facetConfiguration
114
     * @param TypoScriptConfiguration $configuration
115
     * @return int
116
     */
117 37
    protected function buildMincountForJson(array $facetConfiguration, TypoScriptConfiguration $configuration)
118
    {
119 37
        return $facetConfiguration['minimumCount'] ?? ($configuration->getSearchFacetingMinimumCount() ?? 1);
120
    }
121
122
    /**
123
     * @param array $facetConfiguration
124
     * @return string
125
     */
126 37
    protected function buildSortingForJson(array $facetConfiguration) {
127 37
        if (isset($facetConfiguration['sortBy'])) {
128 5
            $sortingExpression = new SortingExpression();
129 5
            $sorting = $facetConfiguration['sortBy'];
130 5
            $direction = $facetConfiguration['sortDirection'] ?? null;
131 5
            return $sortingExpression->getForJsonFacet($sorting, $direction);
132
        }
133 34
        return '';
134
    }
135
}
136