mirror of
https://github.com/silverstripe/silverstripe-fulltextsearch
synced 2024-06-17 02:01:30 +02:00
151 lines
4.8 KiB
PHP
151 lines
4.8 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace SilverStripe\FullTextSearch\Solr\Writers;
|
||
|
|
||
|
use InvalidArgumentException;
|
||
|
use SilverStripe\FullTextSearch\Search\Criteria\SearchCriterion;
|
||
|
use SilverStripe\FullTextSearch\Search\Queries\AbstractSearchQueryWriter;
|
||
|
|
||
|
/**
|
||
|
* Class SolrSearchQueryWriter_Range
|
||
|
* @package SilverStripe\FullTextSearch\Solr\Writers
|
||
|
*/
|
||
|
class SolrSearchQueryWriterRange extends AbstractSearchQueryWriter
|
||
|
{
|
||
|
/**
|
||
|
* @param SearchCriterion $searchCriterion
|
||
|
* @return string
|
||
|
*/
|
||
|
public function generateQueryString(SearchCriterion $searchCriterion)
|
||
|
{
|
||
|
return sprintf(
|
||
|
'%s(%s:%s%s%s%s%s)',
|
||
|
$this->getComparisonPolarity($searchCriterion->getComparison()),
|
||
|
addslashes($searchCriterion->getTarget()),
|
||
|
$this->getOpenComparisonContainer($searchCriterion->getComparison()),
|
||
|
$this->getLeftComparison($searchCriterion),
|
||
|
$this->getComparisonConjunction(),
|
||
|
$this->getRightComparison($searchCriterion),
|
||
|
$this->getCloseComparisonContainer($searchCriterion->getComparison())
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Is this a positive (+) or negative (-) Solr comparison.
|
||
|
*
|
||
|
* @param string $comparison
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function getComparisonPolarity($comparison)
|
||
|
{
|
||
|
switch ($comparison) {
|
||
|
case SearchCriterion::ISNULL:
|
||
|
return '-';
|
||
|
default:
|
||
|
return '+';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Select the value that we want as our left comparison value.
|
||
|
*
|
||
|
* @param SearchCriterion $searchCriterion
|
||
|
* @return mixed|string
|
||
|
* @throws InvalidArgumentException
|
||
|
*/
|
||
|
protected function getLeftComparison(SearchCriterion $searchCriterion)
|
||
|
{
|
||
|
switch ($searchCriterion->getComparison()) {
|
||
|
case SearchCriterion::GREATER_EQUAL:
|
||
|
case SearchCriterion::GREATER_THAN:
|
||
|
return $searchCriterion->getValue();
|
||
|
case SearchCriterion::ISNULL:
|
||
|
case SearchCriterion::ISNOTNULL:
|
||
|
case SearchCriterion::LESS_EQUAL:
|
||
|
case SearchCriterion::LESS_THAN:
|
||
|
return '*';
|
||
|
default:
|
||
|
throw new InvalidArgumentException('Invalid comparison for RangeCriterion');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Select the value that we want as our right comparison value.
|
||
|
*
|
||
|
* @param SearchCriterion $searchCriterion
|
||
|
* @return mixed|string
|
||
|
* @throws InvalidArgumentException
|
||
|
*/
|
||
|
protected function getRightComparison(SearchCriterion $searchCriterion)
|
||
|
{
|
||
|
switch ($searchCriterion->getComparison()) {
|
||
|
case SearchCriterion::GREATER_EQUAL:
|
||
|
case SearchCriterion::GREATER_THAN:
|
||
|
case SearchCriterion::ISNULL:
|
||
|
case SearchCriterion::ISNOTNULL:
|
||
|
return '*';
|
||
|
case SearchCriterion::LESS_EQUAL:
|
||
|
case SearchCriterion::LESS_THAN:
|
||
|
return $searchCriterion->getValue();
|
||
|
default:
|
||
|
throw new InvalidArgumentException('Invalid comparison for RangeCriterion');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Decide how we are comparing our left and right values.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function getComparisonConjunction()
|
||
|
{
|
||
|
return ' TO ';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Does our comparison need a container? EG: "[* TO *]"? If so, return the opening container brace.
|
||
|
*
|
||
|
* @param string $comparison
|
||
|
* @return string
|
||
|
* @throws InvalidArgumentException
|
||
|
*/
|
||
|
protected function getOpenComparisonContainer($comparison)
|
||
|
{
|
||
|
switch ($comparison) {
|
||
|
case SearchCriterion::GREATER_EQUAL:
|
||
|
case SearchCriterion::LESS_EQUAL:
|
||
|
case SearchCriterion::ISNULL:
|
||
|
case SearchCriterion::ISNOTNULL:
|
||
|
return '[';
|
||
|
case SearchCriterion::GREATER_THAN:
|
||
|
case SearchCriterion::LESS_THAN:
|
||
|
return '{';
|
||
|
default:
|
||
|
throw new InvalidArgumentException('Invalid comparison for RangeCriterion');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Does our comparison need a container? EG: "[* TO *]"? If so, return the closing container brace.
|
||
|
*
|
||
|
* @param string $comparison
|
||
|
* @return string
|
||
|
* @throws InvalidArgumentException
|
||
|
*/
|
||
|
protected function getCloseComparisonContainer($comparison)
|
||
|
{
|
||
|
switch ($comparison) {
|
||
|
case SearchCriterion::GREATER_EQUAL:
|
||
|
case SearchCriterion::LESS_EQUAL:
|
||
|
case SearchCriterion::ISNULL:
|
||
|
case SearchCriterion::ISNOTNULL:
|
||
|
return ']';
|
||
|
case SearchCriterion::GREATER_THAN:
|
||
|
case SearchCriterion::LESS_THAN:
|
||
|
return '}';
|
||
|
default:
|
||
|
throw new InvalidArgumentException('Invalid comparison for RangeCriterion');
|
||
|
}
|
||
|
}
|
||
|
}
|