Skip to content

Commit

Permalink
Merge pull request #104 from saimaz/variant_filter
Browse files Browse the repository at this point in the history
Introduced variant filtering
  • Loading branch information
saimaz committed Sep 3, 2015
2 parents 782281d + 028b174 commit 56340e2
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 0 deletions.
1 change: 1 addition & 0 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ function ($v) {
->append($this->buildFilterTree('document_field'))
->append($this->buildFilterTree('range'))
->append($this->buildFilterTree('date_range'))
->append($this->buildFilterTree('variant'))
->end()
->end()
->end();
Expand Down
44 changes: 44 additions & 0 deletions DependencyInjection/Filter/VariantFilterFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

/*
* This file is part of the ONGR package.
*
* (c) NFQ Technologies UAB <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace ONGR\FilterManagerBundle\DependencyInjection\Filter;

use Symfony\Component\DependencyInjection\Definition;

/**
* Factory for variant filter.
*/
class VariantFilterFactory extends AbstractFilterFactory
{
/**
* {@inheritdoc}
*/
protected function configure(Definition $definition, array $configuration)
{
parent::configure($definition, $configuration);
}

/**
* {@inheritdoc}
*/
protected function getNamespace()
{
return 'ONGR\FilterManagerBundle\Filters\Widget\Search\VariantFilter';
}

/**
* {@inheritdoc}
*/
public function getName()
{
return 'variant';
}
}
33 changes: 33 additions & 0 deletions Filters/Widget/Search/VariantFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

/*
* This file is part of the ONGR package.
*
* (c) NFQ Technologies UAB <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace ONGR\FilterManagerBundle\Filters\Widget\Search;

use ONGR\ElasticsearchBundle\DSL\Filter\BoolFilter;
use ONGR\ElasticsearchBundle\DSL\Filter\MissingFilter;
use ONGR\ElasticsearchBundle\DSL\Search;
use ONGR\FilterManagerBundle\Filters\FilterState;
use ONGR\FilterManagerBundle\Search\SearchRequest;

/**
* This filter selects only parent documents.
*/
class VariantFilter extends AbstractSingleValue
{
/**
* {@inheritdoc}
*/
public function modifySearch(Search $search, FilterState $state = null, SearchRequest $request = null)
{
$filter = new MissingFilter($this->getField());
$search->addFilter($filter, BoolFilter::MUST);
}
}
2 changes: 2 additions & 0 deletions ONGRFilterManagerBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use ONGR\FilterManagerBundle\DependencyInjection\Filter\PagerFilterFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\RangeFilterFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\SortFilterFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\VariantFilterFactory;
use ONGR\FilterManagerBundle\DependencyInjection\ONGRFilterManagerExtension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
Expand Down Expand Up @@ -48,6 +49,7 @@ public function build(ContainerBuilder $container)
$extension->addFilterFactory(new PagerFilterFactory());
$extension->addFilterFactory(new RangeFilterFactory());
$extension->addFilterFactory(new DateRangeFilterFactory());
$extension->addFilterFactory(new VariantFilterFactory());

$container->addCompilerPass(new FilterPass());
}
Expand Down
82 changes: 82 additions & 0 deletions Tests/Functional/Filters/Widget/Search/VariantFilterTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php

/*
* This file is part of the ONGR package.
*
* (c) NFQ Technologies UAB <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace ONGR\FilterManagerBundle\Tests\Functional\Filters\Widget\Search;

use ONGR\ElasticsearchBundle\Test\ElasticsearchTestCase;
use ONGR\FilterManagerBundle\Filters\Widget\Search\MatchSearch;
use ONGR\FilterManagerBundle\Filters\Widget\Search\VariantFilter;
use ONGR\FilterManagerBundle\Search\FiltersContainer;
use ONGR\FilterManagerBundle\Search\FiltersManager;
use Symfony\Component\HttpFoundation\Request;

class VariantFilterTest extends ElasticsearchTestCase
{
/**
* {@inheritdoc}
*/
public function getDataArray()
{
return [
'default' => [
'product' => [
[
'_id' => 1,
'title' => 'Foo',
],
[
'_id' => 2,
'title' => 'Baz',
'description' => 'tuna fish',
'parent_id' => 1,
],
[
'_id' => 3,
'title' => 'Foo bar',
'parent_id' => 1,
],
],
],
];
}

/**
* Returns filter manager with MatchSearch set.
*
* @return FiltersManager
*/
public function getFilerManger()
{
$container = new FiltersContainer();

$variant = new VariantFilter();
$variant->setField('parent_id');

$container->set('variant', $variant);

return new FiltersManager($container, $this->getManager()->getRepository('AcmeTestBundle:Product'));
}

/**
* Tests if filter works.
*/
public function testFiltering()
{
$result = $this->getFilerManger()->execute(new Request());

$actual = [];
foreach ($result->getResult() as $doc) {
$actual[] = $doc->getId();
}

$this->assertCount(1, $actual);
}
}
3 changes: 3 additions & 0 deletions Tests/Unit/DependencyInjection/ConfigurationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ protected function getBaseConfiguration()
'choice' => [
'single_choice' => ['request_field' => 'choice', 'tags' => ['badged']],
],
'variant' => [
'variant' => ['request_field' => null, 'tags' => []],
],
],
];
}
Expand Down
7 changes: 7 additions & 0 deletions Tests/app/fixture/Acme/TestBundle/Document/Product.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ class Product implements DocumentInterface
*/
public $sku;

/**
* @var string
*
* @ES\Property(type="string", name="parent_id", index="not_analyzed")
*/
public $parentId;

/**
* @var string
*
Expand Down

0 comments on commit 56340e2

Please sign in to comment.