7
7
8
8
namespace Magento \CatalogRule \Model \Rule \Condition ;
9
9
10
- use Magento \Framework \Exception \InputException ;
11
- use Magento \Rule \Model \Condition \ConditionInterface ;
12
10
use Magento \CatalogRule \Model \Rule \Condition \Combine as CombinedCondition ;
13
11
use Magento \CatalogRule \Model \Rule \Condition \Product as SimpleCondition ;
14
12
use Magento \Framework \Api \CombinedFilterGroup as FilterGroup ;
13
+ use Magento \Framework \Api \CombinedFilterGroupFactory ;
15
14
use Magento \Framework \Api \Filter ;
15
+ use Magento \Framework \Api \FilterFactory ;
16
16
use Magento \Framework \Api \SearchCriteria ;
17
+ use Magento \Framework \Api \SearchCriteriaBuilderFactory ;
18
+ use Magento \Framework \Exception \InputException ;
19
+ use Magento \Rule \Model \Condition \ConditionInterface ;
17
20
18
21
/**
19
22
* Maps catalog price rule conditions to search criteria
20
23
*/
21
24
class ConditionsToSearchCriteriaMapper
22
25
{
23
26
/**
24
- * @var \Magento\Framework\Api\ SearchCriteriaBuilderFactory
27
+ * @var SearchCriteriaBuilderFactory
25
28
*/
26
29
private $ searchCriteriaBuilderFactory ;
27
30
28
31
/**
29
- * @var \Magento\Framework\Api\ CombinedFilterGroupFactory
32
+ * @var CombinedFilterGroupFactory
30
33
*/
31
34
private $ combinedFilterGroupFactory ;
32
35
33
36
/**
34
- * @var \Magento\Framework\Api\ FilterFactory
37
+ * @var FilterFactory
35
38
*/
36
39
private $ filterFactory ;
37
40
38
41
/**
39
- * @param \Magento\Framework\Api\ SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory
40
- * @param \Magento\Framework\Api\ CombinedFilterGroupFactory $combinedFilterGroupFactory
41
- * @param \Magento\Framework\Api\ FilterFactory $filterFactory
42
+ * @param SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory
43
+ * @param CombinedFilterGroupFactory $combinedFilterGroupFactory
44
+ * @param FilterFactory $filterFactory
42
45
*/
43
46
public function __construct (
44
- \ Magento \ Framework \ Api \ SearchCriteriaBuilderFactory $ searchCriteriaBuilderFactory ,
45
- \ Magento \ Framework \ Api \ CombinedFilterGroupFactory $ combinedFilterGroupFactory ,
46
- \ Magento \ Framework \ Api \ FilterFactory $ filterFactory
47
+ SearchCriteriaBuilderFactory $ searchCriteriaBuilderFactory ,
48
+ CombinedFilterGroupFactory $ combinedFilterGroupFactory ,
49
+ FilterFactory $ filterFactory
47
50
) {
48
51
$ this ->searchCriteriaBuilderFactory = $ searchCriteriaBuilderFactory ;
49
52
$ this ->combinedFilterGroupFactory = $ combinedFilterGroupFactory ;
@@ -74,7 +77,7 @@ public function mapConditionsToSearchCriteria(CombinedCondition $conditions): Se
74
77
* Convert condition to filter group
75
78
*
76
79
* @param ConditionInterface $condition
77
- * @return null|\Magento\Framework\Api\CombinedFilterGroup|\Magento\Framework\Api\ Filter
80
+ * @return null|FilterGroup| Filter
78
81
* @throws InputException
79
82
*/
80
83
private function mapConditionToFilterGroup (ConditionInterface $ condition )
@@ -94,7 +97,7 @@ private function mapConditionToFilterGroup(ConditionInterface $condition)
94
97
* Convert combined condition to filter group
95
98
*
96
99
* @param Combine $combinedCondition
97
- * @return null|\Magento\Framework\Api\CombinedFilterGroup
100
+ * @return null|FilterGroup
98
101
* @throws InputException
99
102
*/
100
103
private function mapCombinedConditionToFilterGroup (CombinedCondition $ combinedCondition )
@@ -111,7 +114,7 @@ private function mapCombinedConditionToFilterGroup(CombinedCondition $combinedCo
111
114
// This required to solve cases when condition is configured like:
112
115
// "If ALL/ANY of these conditions are FALSE" - we need to reverse SQL operator for this "FALSE"
113
116
if ((bool )$ combinedCondition ->getValue () === false ) {
114
- $ this ->reverseSqlOperatorInFilter ($ filter );
117
+ $ this ->reverseSqlOperatorInFilterRecursively ($ filter );
115
118
}
116
119
117
120
$ filters [] = $ filter ;
@@ -183,6 +186,24 @@ private function getGlueForArrayValues(string $operator): string
183
186
return 'any ' ;
184
187
}
185
188
189
+ /**
190
+ * Recursively reverse sql conditions to their corresponding negative analog for the entire FilterGroup
191
+ *
192
+ * @param Filter|FilterGroup $filter
193
+ * @return void
194
+ * @throws InputException
195
+ */
196
+ private function reverseSqlOperatorInFilterRecursively ($ filter ): void
197
+ {
198
+ if ($ filter instanceof FilterGroup) {
199
+ foreach ($ filter ->getFilters () as &$ currentFilter ) {
200
+ $ this ->reverseSqlOperatorInFilterRecursively ($ currentFilter );
201
+ }
202
+ } else {
203
+ $ this ->reverseSqlOperatorInFilter ($ filter );
204
+ }
205
+ }
206
+
186
207
/**
187
208
* Reverse sql conditions to their corresponding negative analog
188
209
*
0 commit comments