Evaluate filter group operators (and/or)

[MAILPOET-5218]
This commit is contained in:
Jan Jakes
2023-05-01 17:31:35 +02:00
committed by Aschepikov
parent e0317c5dbf
commit c40cb47928
2 changed files with 84 additions and 7 deletions

View File

@@ -3,6 +3,7 @@
namespace MailPoet\Automation\Engine\Control;
use MailPoet\Automation\Engine\Data\Filter as FilterData;
use MailPoet\Automation\Engine\Data\FilterGroup;
use MailPoet\Automation\Engine\Data\StepRunArgs;
use MailPoet\Automation\Engine\Exceptions;
use MailPoet\Automation\Engine\Registry;
@@ -19,18 +20,33 @@ class FilterHandler {
public function matchesFilters(StepRunArgs $args): bool {
$filters = $args->getStep()->getFilters();
$groups = $filters ? $filters->getGroups() : [];
foreach ($groups as $group) {
foreach ($group->getFilters() as $filter) {
$value = $args->getFieldValue($filter->getFieldKey());
if (!$this->matchesFilter($filter, $value)) {
return false;
}
if (!$filters) {
return true;
}
foreach ($filters->getGroups() as $group) {
if ($this->matchesGroup($group, $args)) {
return false;
}
}
return true;
}
private function matchesGroup(FilterGroup $group, StepRunArgs $args): bool {
$operator = $group->getOperator();
foreach ($group->getFilters() as $filter) {
$value = $args->getFieldValue($filter->getFieldKey());
$matches = $this->matchesFilter($filter, $value);
if ($operator === FilterGroup::OPERATOR_AND && !$matches) {
return false;
}
if ($operator === FilterGroup::OPERATOR_OR && $matches) {
return true;
}
}
return $operator === FilterGroup::OPERATOR_AND;
}
/** @param mixed $value */
private function matchesFilter(FilterData $data, $value): bool {
$filter = $this->registry->getFilter($data->getFieldType());