mirror of
https://github.com/silverstripe/silverstripe-fulltextsearch
synced 2024-09-28 20:29:19 +02:00
87 lines
2.2 KiB
PHP
87 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace SilverStripe\FullTextSearch\Solr\Writers;
|
|
|
|
use InvalidArgumentException;
|
|
use SilverStripe\FullTextSearch\Search\Criteria\SearchCriterion;
|
|
use SilverStripe\FullTextSearch\Search\Queries\AbstractSearchQueryWriter;
|
|
|
|
/**
|
|
* Class SolrSearchQueryWriter_In
|
|
* @package SilverStripe\FullTextSearch\Solr\Writers
|
|
*/
|
|
class SolrSearchQueryWriterIn extends AbstractSearchQueryWriter
|
|
{
|
|
/**
|
|
* @param SearchCriterion $searchCriterion
|
|
* @return string
|
|
*/
|
|
public function generateQueryString(SearchCriterion $searchCriterion)
|
|
{
|
|
return sprintf(
|
|
'%s%s',
|
|
$this->getComparisonPolarity($searchCriterion->getComparison()),
|
|
$this->getInComparisonString($searchCriterion)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Is this a positive (+) or negative (-) Solr comparison.
|
|
*
|
|
* @param string $comparison
|
|
* @return string
|
|
*/
|
|
protected function getComparisonPolarity($comparison)
|
|
{
|
|
switch ($comparison) {
|
|
case SearchCriterion::NOT_IN:
|
|
return '-';
|
|
default:
|
|
return '+';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param SearchCriterion $searchCriterion
|
|
* @return string
|
|
* @throws InvalidArgumentException
|
|
*/
|
|
protected function getInComparisonString(SearchCriterion $searchCriterion)
|
|
{
|
|
$conditions = array();
|
|
|
|
if (!is_array($searchCriterion->getValue())) {
|
|
throw new InvalidArgumentException('Invalid value type for Criterion IN');
|
|
}
|
|
|
|
foreach ($searchCriterion->getValue() as $value) {
|
|
if (is_string($value)) {
|
|
// String values need to be wrapped in quotes and escaped.
|
|
$value = $searchCriterion->getQuoteValue($value);
|
|
}
|
|
|
|
$conditions[] = sprintf(
|
|
'%s%s%s',
|
|
addslashes($searchCriterion->getTarget()),
|
|
$this->getComparisonConjunction(),
|
|
$value
|
|
);
|
|
}
|
|
|
|
return sprintf(
|
|
'(%s)',
|
|
implode(' ', $conditions)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Decide how we are comparing our left and right values.
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function getComparisonConjunction()
|
|
{
|
|
return ':';
|
|
}
|
|
}
|