Passed
Push — master ( b4e3f0...d6a119 )
by Robbie
04:16 queued 02:31
created

src/Search/Adapters/SolrSearchAdapter.php (1 issue)

Severity
1
<?php
2
3
namespace SilverStripe\FullTextSearch\Search\Adapters;
4
5
use SilverStripe\FullTextSearch\Search\Criteria\SearchCriteria;
6
use SilverStripe\FullTextSearch\Search\Criteria\SearchCriterion;
7
use SilverStripe\FullTextSearch\Search\Queries\AbstractSearchQueryWriter;
8
use SilverStripe\FullTextSearch\Solr\Writers\SolrSearchQueryWriterBasic;
9
use SilverStripe\FullTextSearch\Solr\Writers\SolrSearchQueryWriterIn;
10
use SilverStripe\FullTextSearch\Solr\Writers\SolrSearchQueryWriterRange;
11
use InvalidArgumentException;
12
13
/**
14
 * Class SolrSearchAdapter
15
 * @package SilverStripe\FullTextSearch\Search\Adapters
16
 */
17
class SolrSearchAdapter implements SearchAdapterInterface
18
{
19
    /**
20
     * @param SearchCriterion $criterion
21
     * @return string
22
     * @throws InvalidArgumentException
23
     */
24
    public function generateQueryString(SearchCriterion $criterion)
25
    {
26
        $writer = $this->getSearchQueryWriter($criterion);
27
28
        return $writer->generateQueryString($criterion);
29
    }
30
31
    /**
32
     * @param string $conjunction
33
     * @return string
34
     * @throws InvalidArgumentException
35
     */
36
    public function getConjunctionFor($conjunction)
37
    {
38
        switch ($conjunction) {
39
            case SearchCriteria::CONJUNCTION_AND:
40
            case SearchCriteria::CONJUNCTION_OR:
41
                return sprintf(' %s ', $conjunction);
42
            default:
43
                throw new InvalidArgumentException(
44
                    sprintf('Invalid conjunction supplied to SolrSearchAdapter: "%s".', $conjunction)
45
                );
46
        }
47
    }
48
49
    /**
50
     * @return string
51
     */
52
    public function getPrependToCriteriaComponent()
53
    {
54
        return '+';
55
    }
56
57
    /**
58
     * @return string
59
     */
60
    public function getAppendToCriteriaComponent()
61
    {
62
        return '';
63
    }
64
65
    /**
66
     * @return string
67
     */
68
    public function getOpenComparisonContainer()
69
    {
70
        return '(';
71
    }
72
73
    /**
74
     * @return string
75
     */
76
    public function getCloseComparisonContainer()
77
    {
78
        return ')';
79
    }
80
81
    /**
82
     * @param SearchCriterion $searchCriterion
83
     * @return AbstractSearchQueryWriter
84
     * @throws InvalidArgumentException
85
     */
86
    protected function getSearchQueryWriter(SearchCriterion $searchCriterion)
87
    {
88
        if ($searchCriterion->getSearchQueryWriter() instanceof AbstractSearchQueryWriter) {
0 ignored issues
show
$searchCriterion->getSearchQueryWriter() is always a sub-type of SilverStripe\FullTextSea...stractSearchQueryWriter.
Loading history...
89
            // The user has defined their own SearchQueryWriter, so we should just return it.
90
            return $searchCriterion->getSearchQueryWriter();
91
        }
92
93
        switch ($searchCriterion->getComparison()) {
94
            case SearchCriterion::EQUAL:
95
            case SearchCriterion::NOT_EQUAL:
96
                return SolrSearchQueryWriterBasic::create();
97
            case SearchCriterion::IN:
98
            case SearchCriterion::NOT_IN:
99
                return SolrSearchQueryWriterIn::create();
100
            case SearchCriterion::GREATER_EQUAL:
101
            case SearchCriterion::GREATER_THAN:
102
            case SearchCriterion::LESS_EQUAL:
103
            case SearchCriterion::LESS_THAN:
104
            case SearchCriterion::ISNULL:
105
            case SearchCriterion::ISNOTNULL:
106
                return SolrSearchQueryWriterRange::create();
107
            case SearchCriterion::CUSTOM:
108
                // CUSTOM requires a SearchQueryWriter be provided. One can't have been provided, or it would have been
109
                // picked up at the top of the method.
110
                throw new InvalidArgumentException('SearchQueryWriter undefined or unsupported in SearchCriterion');
111
            default:
112
                throw new InvalidArgumentException('Unsupported comparison type in SolrSearchAdapter');
113
        }
114
    }
115
}
116