Skip to content

Commit

Permalink
Add ability to search with and array filter
Browse files Browse the repository at this point in the history
  • Loading branch information
R3VoLuT1OneR committed Sep 5, 2018
1 parent 2235085 commit 00fa459
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 6 deletions.
4 changes: 2 additions & 2 deletions src/Doctrine/Rest/Action/CollectionAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use Pz\Doctrine\Rest\BuilderChain\CriteriaChain;
use Pz\Doctrine\Rest\QueryParser\ArrayFilterParser;
use Pz\Doctrine\Rest\QueryParser\FilterParserAbstract;
use Pz\Doctrine\Rest\QueryParser\StringFilterParser;
use Pz\Doctrine\Rest\QueryParser\SearchFilterParser;
use Pz\Doctrine\Rest\Resource\Collection;
use Pz\Doctrine\Rest\RestAction;
use Pz\Doctrine\Rest\Contracts\RestRequestContract;
Expand Down Expand Up @@ -162,7 +162,7 @@ protected function applyFilter(RestRequestContract $request, QueryBuilder $qb)
protected function filterParsers(RestRequestContract $request)
{
return [
new StringFilterParser($request, $this->getStringFilterField()),
new SearchFilterParser($request, $this->getStringFilterField()),
new ArrayFilterParser($request, $this->getArrayFilterFields()),
];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,34 @@
use Doctrine\Common\Collections\Criteria;
use Pz\Doctrine\Rest\Contracts\RestRequestContract;

class StringFilterParser extends FilterParserAbstract
class SearchFilterParser extends FilterParserAbstract
{
const PARAM_PREFIX = '';

const SEARCH_KEY = 'search';

/**
* @var string|bool
*/
protected $property;

/**
* @var string
*/
protected $searchKey;

/**
* StringParser constructor.
*
* @param RestRequestContract $request
* @param string $property Property name that will be filtered by query.
* @param string $searchKey
*/
public function __construct(RestRequestContract $request, $property)
public function __construct(RestRequestContract $request, $property, $searchKey = self::SEARCH_KEY)
{
parent::__construct($request);
$this->property = $property;
$this->searchKey = $searchKey;
}

/**
Expand All @@ -40,6 +49,12 @@ public function applyFilter(Criteria $criteria, $filter)
);
}

if (is_array($filter) && isset($filter[$this->searchKey])) {
$criteria->andWhere(
$criteria->expr()->contains($this->property, $filter[$this->searchKey])
);
}

return $criteria;
}
}
20 changes: 18 additions & 2 deletions tests/unit/QueryParser/FilterStringParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use Doctrine\Common\Collections\Criteria;
use Doctrine\Common\Collections\Expr\Comparison;
use PHPUnit\Framework\TestCase;
use Pz\Doctrine\Rest\QueryParser\StringFilterParser;
use Pz\Doctrine\Rest\QueryParser\SearchFilterParser;

use Mockery as m;
use Pz\Doctrine\Rest\Contracts\RestRequestContract;
Expand All @@ -12,10 +12,26 @@

class FilterStringParserTest extends TestCase
{
public function test_array_key_search()
{
$request = new RestRequest(new Request(['filter' => ['search' => 'queryString']]));
$parser = new SearchFilterParser($request, 'testField');

/** @var Criteria $criteria */
$criteria = $parser(Criteria::create());

/** @var Comparison $where */
$where = $criteria->getWhereExpression();

$this->assertEquals('testField', $where->getField());
$this->assertEquals(Comparison::CONTAINS, $where->getOperator());
$this->assertEquals('queryString', $where->getValue()->getValue());
}

public function test_property_query_parser()
{
$request = new RestRequest(new Request(['filter' => 'queryString']));
$parser = new StringFilterParser($request, 'testField');
$parser = new SearchFilterParser($request, 'testField');

/** @var Criteria $criteria */
$criteria = $parser(Criteria::create());
Expand Down

0 comments on commit 00fa459

Please sign in to comment.