6 declare(strict_types=1);
26 private $searchCriteriaBuilderFactory;
31 private $combinedFilterGroupFactory;
36 private $filterFactory;
44 \
Magento\Framework\Api\SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory,
45 \
Magento\Framework\Api\CombinedFilterGroupFactory $combinedFilterGroupFactory,
46 \
Magento\Framework\Api\FilterFactory $filterFactory
48 $this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory;
49 $this->combinedFilterGroupFactory = $combinedFilterGroupFactory;
50 $this->filterFactory = $filterFactory;
62 $filterGroup = $this->mapCombinedConditionToFilterGroup($conditions);
66 if ($filterGroup !==
null) {
80 if ($condition->getType() === CombinedCondition::class) {
81 return $this->mapCombinedConditionToFilterGroup($condition);
82 }
elseif ($condition->getType() === SimpleCondition::class) {
83 return $this->mapSimpleConditionToFilterGroup($condition);
87 __(
'Undefined condition type "%1" passed in.', $condition->getType())
96 private function mapCombinedConditionToFilterGroup(CombinedCondition $combinedCondition)
100 foreach ($combinedCondition->getConditions() as $condition) {
101 $filter = $this->mapConditionToFilterGroup($condition);
103 if ($filter ===
null) {
109 if ((
bool)$combinedCondition->getValue() ===
false) {
110 $this->reverseSqlOperatorInFilter($filter);
120 return $this->createCombinedFilterGroup(
$filters, $combinedCondition->getAggregator());
128 private function mapSimpleConditionToFilterGroup(ConditionInterface $productCondition)
130 if (is_array($productCondition->getValue())) {
131 return $this->processSimpleConditionWithArrayValue($productCondition);
134 return $this->createFilter(
135 $productCondition->getAttribute(),
136 (string) $productCondition->getValue(),
137 $productCondition->getOperator()
146 private function processSimpleConditionWithArrayValue(ConditionInterface $productCondition): FilterGroup
150 foreach ($productCondition->getValue() as $subValue) {
152 $productCondition->getAttribute(),
154 $productCondition->getOperator()
158 $combinationMode = $this->getGlueForArrayValues($productCondition->getOperator());
160 return $this->createCombinedFilterGroup(
$filters, $combinationMode);
167 private function getGlueForArrayValues(
string $operator): string
169 if (in_array($operator, [
'!=',
'!{}',
'!()'],
true)) {
183 private function reverseSqlOperatorInFilter(Filter $filter)
198 if (!array_key_exists($filter->getConditionType(), $operatorsMap)) {
199 throw new InputException(
201 'Undefined SQL operator "%1" passed in. Valid operators are: %2',
202 $filter->getConditionType(),
203 implode(
',', array_keys($operatorsMap))
208 $filter->setConditionType(
209 $operatorsMap[$filter->getConditionType()]
219 private function createCombinedFilterGroup(array
$filters,
string $combinationMode): FilterGroup
221 return $this->combinedFilterGroupFactory->create([
224 FilterGroup::COMBINATION_MODE => $this->mapRuleAggregatorToSQLAggregator($combinationMode)
236 private function createFilter(
string $field,
string $value,
string $conditionType): Filter
238 return $this->filterFactory->create([
240 Filter::KEY_FIELD => $field,
241 Filter::KEY_VALUE =>
$value,
242 Filter::KEY_CONDITION_TYPE => $this->mapRuleOperatorToSQLCondition($conditionType)
254 private function mapRuleOperatorToSQLCondition(
string $ruleOperator): string
269 if (!array_key_exists($ruleOperator, $operatorsMap)) {
270 throw new InputException(
272 'Undefined rule operator "%1" passed in. Valid operators are: %2',
274 implode(
',', array_keys($operatorsMap))
279 return $operatorsMap[$ruleOperator];
289 private function mapRuleAggregatorToSQLAggregator(
string $ruleAggregator): string
296 if (!array_key_exists(strtolower($ruleAggregator), $operatorsMap)) {
297 throw new InputException(
299 'Undefined rule aggregator "%1" passed in. Valid operators are: %2',
301 implode(
',', array_keys($operatorsMap))
306 return $operatorsMap[$ruleAggregator];
mapConditionsToSearchCriteria(CombinedCondition $conditions)
elseif(isset( $params[ 'redirect_parent']))
__construct(\Magento\Framework\Api\SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory, \Magento\Framework\Api\CombinedFilterGroupFactory $combinedFilterGroupFactory, \Magento\Framework\Api\FilterFactory $filterFactory)