silverstripe-framework/src/ORM/Filters/PartialMatchFilter.php

108 lines
3.0 KiB
PHP
Raw Normal View History

<?php
namespace SilverStripe\ORM\Filters;
use SilverStripe\ORM\DataQuery;
use SilverStripe\ORM\DB;
use InvalidArgumentException;
/**
* Matches textual content with a LIKE '%keyword%' construct.
*/
2016-11-29 00:31:16 +01:00
class PartialMatchFilter extends SearchFilter
{
2016-11-29 00:31:16 +01:00
public function getSupportedModifiers()
{
return ['not', 'nocase', 'case'];
}
2014-08-15 08:53:05 +02:00
2016-11-29 00:31:16 +01:00
/**
* Apply the match filter to the given variable value
*
* @param string $value The raw value
* @return string
*/
protected function getMatchPattern($value)
{
return "%$value%";
}
2014-08-15 08:53:05 +02:00
2016-11-29 00:31:16 +01: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())
));
}
2016-11-29 00:31:16 +01:00
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);
}
2016-11-29 00:31:16 +01:00
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())
));
}
2016-11-29 00:31:16 +01:00
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
2016-11-29 00:31:16 +01:00
public function isEmpty()
{
return $this->getValue() === array() || $this->getValue() === null || $this->getValue() === '';
}
}