Skip to content

Commit 35efaaa

Browse files
andrewbessAndrii Beziazychnyi
authored and
Andrii Beziazychnyi
committed
Magento2/ISSUE#16425: Fixed "OR Condition in searchCriteria (REST API) dosn't work"
1 parent b307274 commit 35efaaa

File tree

2 files changed

+62
-21
lines changed

2 files changed

+62
-21
lines changed

app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,20 +64,55 @@ private function addFilterGroupToCollection(
6464
AbstractDb $collection
6565
) {
6666
$fields = [];
67+
$customFilters = [];
6768
foreach ($filterGroup->getFilters() as $filter) {
6869
$isApplied = false;
70+
$applyLater = false;
6971
$customFilter = $this->getCustomFilterForField($filter->getField());
7072
if ($customFilter) {
71-
$isApplied = $customFilter->apply($filter, $collection);
73+
if ($filter->getConditionType() == 'eq') {
74+
$customFilters = array_map(
75+
function ($customFilter) {
76+
if (count($values = $customFilter['values']) > 1) {
77+
$filter = reset($customFilter['filter']);
78+
$filter->setValue(implode(',', $values));
79+
$filter->setConditionType('in');
80+
$customFilter['filter'] = $filter;
81+
}
82+
83+
return $customFilter;
84+
},
85+
array_merge_recursive(
86+
$customFilters,
87+
[$filter->getField() => [
88+
'filter' => [clone $filter],
89+
'values' => [$filter->getValue()]
90+
]]
91+
)
92+
);
93+
94+
$applyLater = true;
95+
}
96+
97+
if (!$applyLater) {
98+
$isApplied = $customFilter->apply($filter, $collection);
99+
}
72100
}
73101

74-
if (!$isApplied) {
102+
if (!$isApplied && !$applyLater) {
75103
$field = $this->getFieldMapping($filter->getField());
76104
$condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
77105
$fields[] = ['attribute' => $field, $condition => $filter->getValue()];
78106
}
79107
}
80108

109+
if ($applyLater && count($customFilters)) {
110+
foreach ($customFilters as $field => $filter) {
111+
$customFilter = $this->getCustomFilterForField($field);
112+
$customFilter->apply($filter['filter'], $collection);
113+
}
114+
}
115+
81116
if ($fields) {
82117
$collection->addFieldToFilter($fields);
83118
}

app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55
*/
66
namespace Magento\Eav\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor;
77

8+
use InvalidArgumentException;
89
use Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
910
use Magento\Framework\Api\Filter;
1011
use Magento\Framework\Api\Search\FilterGroup;
1112
use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
1213
use Magento\Framework\Api\SearchCriteriaInterface;
1314
use Magento\Framework\Data\Collection\AbstractDb;
15+
use PHPUnit\Framework\MockObject\MockObject;
16+
use PHPUnit\Framework\TestCase;
17+
use stdClass;
1418

15-
class FilterProcessorTest extends \PHPUnit\Framework\TestCase
19+
class FilterProcessorTest extends TestCase
1620
{
1721
/**
1822
* Return model
@@ -31,8 +35,11 @@ private function getModel(array $customFilters, array $fieldMapping)
3135
*/
3236
public function testProcess()
3337
{
34-
/** @var CustomFilterInterface|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */
35-
$customFilterMock = $this->createPartialMock(CustomFilterInterface::class, ['apply']);
38+
/** @var CustomFilterInterface|MockObject $customFilterMock */
39+
$customFilterMock = $this->createPartialMock(
40+
CustomFilterInterface::class,
41+
['apply']
42+
);
3643

3744
$customFilterField = 'customFilterField';
3845
$customFilters = [$customFilterField => $customFilterMock];
@@ -62,25 +69,25 @@ public function testProcess()
6269

6370
$model = $this->getModel($customFilters, $fieldMapping);
6471

65-
/** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupOneMock */
72+
/** @var FilterGroup|MockObject $filterGroupOneMock */
6673
$filterGroupOneMock = $this->getMockBuilder(FilterGroup::class)
6774
->disableOriginalConstructor()
6875
->getMock();
6976

70-
/** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupTwoMock */
77+
/** @var FilterGroup|MockObject $filterGroupTwoMock */
7178
$filterGroupTwoMock = $this->getMockBuilder(FilterGroup::class)
7279
->disableOriginalConstructor()
7380
->getMock();
7481

75-
/** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterOneMock */
82+
/** @var Filter|MockObject $filterOneMock */
7683
$filterOneMock = $this->getMockBuilder(Filter::class)
7784
->disableOriginalConstructor()
7885
->getMock();
7986
$filterOneMock->expects($this->once())
8087
->method('getField')
8188
->willReturn($customFilterField);
8289

83-
/** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterTwoMock */
90+
/** @var Filter|MockObject $filterTwoMock */
8491
$filterTwoMock = $this->getMockBuilder(Filter::class)
8592
->disableOriginalConstructor()
8693
->getMock();
@@ -94,7 +101,7 @@ public function testProcess()
94101
->method('getConditionType')
95102
->willReturn($otherFilterFieldCondition);
96103

97-
/** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterThreeMock */
104+
/** @var Filter|MockObject $filterThreeMock */
98105
$filterThreeMock = $this->getMockBuilder(Filter::class)
99106
->disableOriginalConstructor()
100107
->getMock();
@@ -116,15 +123,15 @@ public function testProcess()
116123
->method('getFilters')
117124
->willReturn([$filterThreeMock]);
118125

119-
/** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
126+
/** @var SearchCriteriaInterface|MockObject $searchCriteriaMock */
120127
$searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
121128
->getMock();
122129

123130
$searchCriteriaMock->expects($this->once())
124131
->method('getFilterGroups')
125132
->willReturn([$filterGroupOneMock, $filterGroupTwoMock]);
126133

127-
/** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
134+
/** @var AbstractDb|MockObject $searchCriteriarMock */
128135
$collectionMock = $this->getMockBuilder(AbstractDb::class)
129136
->disableOriginalConstructor()
130137
->getMock();
@@ -144,25 +151,24 @@ public function testProcess()
144151
$model->process($searchCriteriaMock, $collectionMock);
145152
}
146153

147-
/**
148-
* @expectedException \InvalidArgumentException
149-
*/
150154
public function testProcessWithException()
151155
{
152-
/** @var \stdClass|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */
153-
$customFilterMock = $this->createPartialMock(\stdClass::class, ['apply']);
156+
$this->expectException(InvalidArgumentException::class);
157+
158+
/** @var stdClass|MockObject $customFilterMock */
159+
$customFilterMock = $this->createPartialMock(stdClass::class, ['apply']);
154160

155161
$customFilterField = 'customFilterField';
156162
$customFilters = [$customFilterField => $customFilterMock];
157163

158164
$model = $this->getModel($customFilters, []);
159165

160-
/** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupOneMock */
166+
/** @var FilterGroup|MockObject $filterGroupOneMock */
161167
$filterGroupOneMock = $this->getMockBuilder(FilterGroup::class)
162168
->disableOriginalConstructor()
163169
->getMock();
164170

165-
/** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterOneMock */
171+
/** @var Filter|MockObject $filterOneMock */
166172
$filterOneMock = $this->getMockBuilder(Filter::class)
167173
->disableOriginalConstructor()
168174
->getMock();
@@ -174,15 +180,15 @@ public function testProcessWithException()
174180
->method('getFilters')
175181
->willReturn([$filterOneMock]);
176182

177-
/** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */
183+
/** @var SearchCriteriaInterface|MockObject $searchCriteriaMock */
178184
$searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class)
179185
->getMock();
180186

181187
$searchCriteriaMock->expects($this->once())
182188
->method('getFilterGroups')
183189
->willReturn([$filterGroupOneMock]);
184190

185-
/** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */
191+
/** @var AbstractDb|MockObject $searchCriteriarMock */
186192
$collectionMock = $this->getMockBuilder(AbstractDb::class)
187193
->disableOriginalConstructor()
188194
->getMock();

0 commit comments

Comments
 (0)