silverstripe-framework/search/filters/PartialMatchFilter.php

105 lines
2.5 KiB
PHP
Raw Normal View History

<?php
use SilverStripe\ORM\DataQuery;
use SilverStripe\ORM\DB;
/**
* @package framework
* @subpackage search
*/
/**
* Matches textual content with a LIKE '%keyword%' construct.
*
* @package framework
* @subpackage search
*/
class PartialMatchFilter extends SearchFilter {
public function getSupportedModifiers()
{
return ['not', 'nocase', 'case'];
}
2014-08-15 08:53:05 +02:00
/**
* Apply the match filter to the given variable value
2014-08-15 08:53:05 +02:00
*
* @param string $value The raw value
* @return string
*/
protected function getMatchPattern($value) {
return "%$value%";
}
2014-08-15 08:53:05 +02:00
protected function applyOne(DataQuery $query) {
$this->model = $query->applyRelation($this->relation);
$comparisonClause = DB::get_conn()->comparisonClause(
$this->getDbName(),
null,
false, // exact?
false, // negate?
$this->getCaseSensitive(),
true
);
return $query->where(array(
$comparisonClause => $this->getMatchPattern($this->getValue())
));
}
protected function applyMany(DataQuery $query) {
$this->model = $query->applyRelation($this->relation);
$whereClause = array();
$comparisonClause = DB::get_conn()->comparisonClause(
$this->getDbName(),
null,
false, // exact?
false, // negate?
$this->getCaseSensitive(),
true
);
foreach($this->getValue() as $value) {
$whereClause[] = array($comparisonClause => $this->getMatchPattern($value));
}
return $query->whereAny($whereClause);
}
protected function excludeOne(DataQuery $query) {
$this->model = $query->applyRelation($this->relation);
$comparisonClause = DB::get_conn()->comparisonClause(
$this->getDbName(),
null,
false, // exact?
true, // negate?
$this->getCaseSensitive(),
true
);
return $query->where(array(
$comparisonClause => $this->getMatchPattern($this->getValue())
));
}
protected function excludeMany(DataQuery $query) {
$this->model = $query->applyRelation($this->relation);
$values = $this->getValue();
$comparisonClause = DB::get_conn()->comparisonClause(
$this->getDbName(),
null,
false, // exact?
true, // negate?
$this->getCaseSensitive(),
true
);
$parameters = array();
foreach($values as $value) {
$parameters[] = $this->getMatchPattern($value);
}
// Since query connective is ambiguous, use AND explicitly here
$count = count($values);
$predicate = implode(' AND ', array_fill(0, $count, $comparisonClause));
return $query->where(array($predicate => $parameters));
}
2014-08-15 08:53:05 +02:00
public function isEmpty() {
return $this->getValue() === array() || $this->getValue() === null || $this->getValue() === '';
}
}