Skip to content

Commit c61b130

Browse files
committed
Merge branch 'master' into tagged_filters
Conflicts: Tests/app/config/config_test.yml
2 parents aa016f6 + eb80027 commit c61b130

File tree

14 files changed

+404
-9
lines changed

14 files changed

+404
-9
lines changed

DependencyInjection/Configuration.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ function ($v) {
9292
->append($this->buildFilterTree('pager'))
9393
->append($this->buildFilterTree('document_field'))
9494
->append($this->buildFilterTree('range'))
95+
->append($this->buildFilterTree('date_range'))
9596
->end()
9697
->end()
9798
->end();
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the ONGR package.
5+
*
6+
* (c) NFQ Technologies UAB <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace ONGR\FilterManagerBundle\DependencyInjection\Filter;
13+
14+
/**
15+
* Factory for range filter on date fields.
16+
*/
17+
class DateRangeFilterFactory extends RangeFilterFactory
18+
{
19+
/**
20+
* {@inheritdoc}
21+
*/
22+
protected function getNamespace()
23+
{
24+
return 'ONGR\FilterManagerBundle\Filters\Widget\Range\DateRange';
25+
}
26+
27+
/**
28+
* {@inheritdoc}
29+
*/
30+
public function getName()
31+
{
32+
return 'date_range';
33+
}
34+
}

DependencyInjection/Filter/FuzzyFilterFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ protected function configure(Definition $definition, array $configuration)
4040
*/
4141
protected function getNamespace()
4242
{
43-
return 'ONGR\FilterManagerBundle\Filters\Widget\Search\MatchSearch';
43+
return 'ONGR\FilterManagerBundle\Filters\Widget\Search\FuzzySearch';
4444
}
4545

4646
/**

Filters/ViewData/RangeAwareViewData.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,46 +14,46 @@
1414
use ONGR\FilterManagerBundle\Filters\ViewData;
1515

1616
/**
17-
* This class holds extra data for range filter.
17+
* This class holds extra data for range and date_range filters.
1818
*/
1919
class RangeAwareViewData extends ViewData
2020
{
2121
/**
22-
* @var float
22+
* @var float|\DateTime
2323
*/
2424
private $minBounds;
2525

2626
/**
27-
* @var float
27+
* @var float|\DateTime
2828
*/
2929
private $maxBounds;
3030

3131
/**
32-
* @return float
32+
* @return float|\DateTime
3333
*/
3434
public function getMaxBounds()
3535
{
3636
return $this->maxBounds;
3737
}
3838

3939
/**
40-
* @param float $maxBounds
40+
* @param float|\DateTime $maxBounds
4141
*/
4242
public function setMaxBounds($maxBounds)
4343
{
4444
$this->maxBounds = $maxBounds;
4545
}
4646

4747
/**
48-
* @return float
48+
* @return float|\DateTime
4949
*/
5050
public function getMinBounds()
5151
{
5252
return $this->minBounds;
5353
}
5454

5555
/**
56-
* @param float $minBounds
56+
* @param float|\DateTime $minBounds
5757
*/
5858
public function setMinBounds($minBounds)
5959
{

Filters/Widget/AbstractSingleRequestValueFilter.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public function getState(Request $request)
4242
$value = $request->get($this->getRequestField());
4343

4444
if (isset($value) && $value !== '') {
45+
$value = is_array($value) ? array_values($value) : $value;
4546
$state->setActive(true);
4647
$state->setValue($value);
4748
$state->setUrlParameters([$this->getRequestField() => $value]);

Filters/Widget/Range/DateRange.php

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the ONGR package.
5+
*
6+
* (c) NFQ Technologies UAB <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace ONGR\FilterManagerBundle\Filters\Widget\Range;
13+
14+
use ONGR\ElasticsearchBundle\DSL\Aggregation\StatsAggregation;
15+
use ONGR\ElasticsearchBundle\DSL\Filter\RangeFilter;
16+
use ONGR\ElasticsearchBundle\DSL\Search;
17+
use ONGR\ElasticsearchBundle\Result\DocumentIterator;
18+
use ONGR\FilterManagerBundle\Filters\FilterState;
19+
use ONGR\FilterManagerBundle\Filters\Helper\FieldAwareInterface;
20+
use ONGR\FilterManagerBundle\Filters\Helper\FieldAwareTrait;
21+
use ONGR\FilterManagerBundle\Filters\Helper\ViewDataFactoryInterface;
22+
use ONGR\FilterManagerBundle\Filters\ViewData;
23+
use ONGR\FilterManagerBundle\Filters\Widget\AbstractSingleRequestValueFilter;
24+
use ONGR\FilterManagerBundle\Search\SearchRequest;
25+
use Symfony\Component\HttpFoundation\Request;
26+
27+
/**
28+
* Date range filter, selects documents from lower date to upper date.
29+
*/
30+
class DateRange extends AbstractSingleRequestValueFilter implements FieldAwareInterface, ViewDataFactoryInterface
31+
{
32+
use FieldAwareTrait;
33+
34+
/**
35+
* {@inheritdoc}
36+
*/
37+
public function getState(Request $request)
38+
{
39+
$state = parent::getState($request);
40+
41+
if ($state->getValue()) {
42+
$values = explode(';', $state->getValue(), 2);
43+
$normalized['gt'] = $values[0];
44+
$normalized['lt'] = $values[1];
45+
46+
$state->setValue($normalized);
47+
}
48+
49+
return $state;
50+
}
51+
52+
/**
53+
* {@inheritdoc}
54+
*/
55+
public function preProcessSearch(Search $search, Search $relatedSearch, FilterState $state = null)
56+
{
57+
$stateAgg = new StatsAggregation('date_range_agg');
58+
$stateAgg->setField($this->getField());
59+
$search->addAggregation($stateAgg);
60+
}
61+
62+
/**
63+
* {@inheritdoc}
64+
*/
65+
public function modifySearch(Search $search, FilterState $state = null, SearchRequest $request = null)
66+
{
67+
if ($state && $state->isActive()) {
68+
$filter = new RangeFilter($this->getField(), $state->getValue());
69+
$search->addPostFilter($filter);
70+
}
71+
}
72+
73+
/**
74+
* {@inheritdoc}
75+
*/
76+
public function createViewData()
77+
{
78+
return new ViewData\RangeAwareViewData();
79+
}
80+
81+
/**
82+
* {@inheritdoc}
83+
*/
84+
public function getViewData(DocumentIterator $result, ViewData $data)
85+
{
86+
/** @var $data ViewData\RangeAwareViewData */
87+
$data->setMinBounds(
88+
new \DateTime(
89+
date(
90+
\DateTime::ISO8601,
91+
$result->getAggregations()['date_range_agg']->getValue()['min'] / 1000
92+
)
93+
)
94+
);
95+
96+
$data->setMaxBounds(
97+
new \DateTime(
98+
date(
99+
\DateTime::ISO8601,
100+
$result->getAggregations()['date_range_agg']->getValue()['max'] / 1000
101+
)
102+
)
103+
);
104+
105+
return $data;
106+
}
107+
}

ONGRFilterManagerBundle.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use ONGR\FilterManagerBundle\DependencyInjection\Compiler\FilterPass;
1515
use ONGR\FilterManagerBundle\DependencyInjection\Filter\ChoiceFilterFactory;
16+
use ONGR\FilterManagerBundle\DependencyInjection\Filter\DateRangeFilterFactory;
1617
use ONGR\FilterManagerBundle\DependencyInjection\Filter\DocumentFieldFilterFactory;
1718
use ONGR\FilterManagerBundle\DependencyInjection\Filter\FuzzyFilterFactory;
1819
use ONGR\FilterManagerBundle\DependencyInjection\Filter\MatchFilterFactory;
@@ -46,7 +47,8 @@ public function build(ContainerBuilder $container)
4647
$extension->addFilterFactory(new SortFilterFactory());
4748
$extension->addFilterFactory(new PagerFilterFactory());
4849
$extension->addFilterFactory(new RangeFilterFactory());
49-
50+
$extension->addFilterFactory(new DateRangeFilterFactory());
51+
5052
$container->addCompilerPass(new FilterPass());
5153
}
5254
}

Tests/Functional/DependencyInjection/ServiceCreationTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ public function getTestServicesData()
6666
'ongr_filter_manager.foo_filters',
6767
'ONGR\FilterManagerBundle\Search\FiltersManager',
6868
],
69+
[
70+
'ongr_filter_manager.filter.fuzzy',
71+
'ONGR\FilterManagerBundle\Filters\Widget\Search\FuzzySearch',
72+
],
6973
];
7074
}
7175

Tests/Functional/Filters/Widget/Choice/MultiTermChoiceTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ public function getTestResultsData()
7878
// Case #2 all elements.
7979
$out[] = [new Request(['choice' => ['red', 'green', 'blue']]), ['1', '2', '3', '4', '5']];
8080

81+
// Case #3 non ordered choices.
82+
$out[] = [new Request(['choice' => [0 => 'black', 2 => 'red']]), ['1', '3']];
83+
8184
return $out;
8285
}
8386

0 commit comments

Comments
 (0)