Passed
Pull Request — master (#188)
by Simon
08:49 queued 06:27
created

buildExcludeSubclassFilter()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 3.6875

Importance

Changes 0
Metric Value
cc 2
eloc 7
c 0
b 0
f 0
nc 2
nop 0
dl 0
loc 9
ccs 2
cts 8
cp 0.25
crap 3.6875
rs 10
1
<?php
2
/**
3
 * Trait QueryComponentFilterTrait|Firesphere\SolrSearch\Traits\QueryComponentFilterTrait Trait to set Filtering on
4
 * fields 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\Queries\BaseQuery;
14
use Minimalcode\Search\Criteria;
15
use SilverStripe\ORM\DataList;
16
use SilverStripe\Security\Group;
17
use SilverStripe\Security\Security;
18
use Solarium\QueryType\Select\Query\Query;
19
20
/**
21
 * Trait QueryComponentFilterTrait
22
 *
23
 * @package Firesphere\SolrSearch\Traits
24
 */
25
trait QueryComponentFilterTrait
26
{
27
    /**
28
     * @var BaseQuery Base query that's about to be executed
29
     */
30
    protected $query;
31
    /**
32
     * @var Query Solarium query
33
     */
34
    protected $clientQuery;
35
36
    /**
37
     * Create filter queries
38
     */
39 7
    protected function buildFilters(): void
40
    {
41 7
        $filters = $this->query->getFilter();
42 7
        foreach ($filters as $field => $value) {
43 1
            $value = is_array($value) ? $value : [$value];
44 1
            $criteria = Criteria::where($field)->in($value);
45 1
            $this->clientQuery->createFilterQuery('filter-' . $field)
46 1
                ->setQuery($criteria->getQuery());
47
        }
48 7
    }
49
50
    /**
51
     * Add filtering on canView
52
     */
53 7
    protected function buildViewFilter(): void
54
    {
55
        // Filter by what the user is allowed to see
56 7
        $viewIDs = ['null']; // null is always an option as that means publicly visible
57 7
        $member = Security::getCurrentUser();
58 7
        if ($member && $member->exists()) {
59
            // Member is logged in, thus allowed to see these
60 7
            $viewIDs[] = 'LoggedIn';
61
62
            /** @var DataList|Group[] $groups */
63 7
            $groups = Security::getCurrentUser()->Groups();
64 7
            if ($groups->count()) {
65 6
                $viewIDs = array_merge($viewIDs, $groups->column('Code'));
66
            }
67
        }
68
        /** Add canView criteria. These are based on {@link DataObjectExtension::ViewStatus()} */
69 7
        $query = Criteria::where('ViewStatus')->in($viewIDs);
70
71 7
        $this->clientQuery->createFilterQuery('ViewStatus')
72 7
            ->setQuery($query->getQuery());
73 7
    }
74
75
    /**
76
     * Add filtered queries based on class hierarchy
77
     * We only need the class itself, since the hierarchy will take care of the rest
78
     */
79 7
    protected function buildClassFilter(): void
80
    {
81 7
        if (count($this->query->getClasses())) {
82 1
            $classes = $this->query->getClasses();
83 1
            $criteria = Criteria::where('ClassHierarchy')->in($classes);
84 1
            $this->clientQuery->createFilterQuery('ClassHierarchy')
85 1
                ->setQuery($criteria->getQuery());
86
        }
87 7
    }
88
89
    /**
90
     * Build the exclusion query for the Excluded Subclasses
91
     */
92 7
    protected function buildExcludeSubclassFilter(): void
93
    {
94 7
        if (count($this->query->getExcludedSubClasses())) {
95
            $subclasses = $this->query->getExcludedSubClasses();
96
            $criteria = Criteria::where('ClassHierarchy')
97
                ->not()
98
                ->in($subclasses);
99
            $this->clientQuery->createFilterQuery('exclude-ClassHierarchy')
100
                ->setQuery($criteria->getQuery());
101
        }
102 7
    }
103
104
    /**
105
     * Remove items to exclude
106
     */
107 7
    protected function buildExcludes(): void
108
    {
109 7
        $filters = $this->query->getExclude();
110 7
        foreach ($filters as $field => $value) {
111 1
            $value = is_array($value) ? $value : [$value];
112 1
            $criteria = Criteria::where($field)
113 1
                ->in($value)
114 1
                ->not();
115 1
            $this->clientQuery->createFilterQuery('exclude-' . $field)
116 1
                ->setQuery($criteria->getQuery());
117
        }
118 7
    }
119
}
120