Skip to content

feat(doctrine): BackedEnumFilter allow multiple values similar to SearchFilter[exact] #7129

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 19 additions & 8 deletions src/Doctrine/Common/Filter/BackedEnumFilterTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,26 @@
continue;
}
$propertyName = $this->normalizePropertyName($property);
$description[$propertyName] = [
'property' => $propertyName,
'type' => 'string',
'required' => false,
'schema' => [
$filterParameterNames = [$propertyName];
$filterParameterNames[] = $propertyName.'[]';

Check warning on line 57 in src/Doctrine/Common/Filter/BackedEnumFilterTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Common/Filter/BackedEnumFilterTrait.php#L56-L57

Added lines #L56 - L57 were not covered by tests

foreach ($filterParameterNames as $filterParameterName) {
$isCollection = str_ends_with($filterParameterName, '[]');

Check warning on line 60 in src/Doctrine/Common/Filter/BackedEnumFilterTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Common/Filter/BackedEnumFilterTrait.php#L59-L60

Added lines #L59 - L60 were not covered by tests

$enumValues = array_map(fn (\BackedEnum $case) => $case->value, $this->enumTypes[$property]::cases());

Check warning on line 62 in src/Doctrine/Common/Filter/BackedEnumFilterTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Common/Filter/BackedEnumFilterTrait.php#L62

Added line #L62 was not covered by tests

$schema = $isCollection
? ['type' => 'array', 'items' => ['type' => 'string', 'enum' => $enumValues]]
: ['type' => 'string', 'enum' => $enumValues];

Check warning on line 66 in src/Doctrine/Common/Filter/BackedEnumFilterTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Common/Filter/BackedEnumFilterTrait.php#L64-L66

Added lines #L64 - L66 were not covered by tests

$description[$filterParameterName] = [
'property' => $propertyName,

Check warning on line 69 in src/Doctrine/Common/Filter/BackedEnumFilterTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Common/Filter/BackedEnumFilterTrait.php#L68-L69

Added lines #L68 - L69 were not covered by tests
'type' => 'string',
'enum' => array_map(fn (\BackedEnum $case) => $case->value, $this->enumTypes[$property]::cases()),
],
];
'required' => false,
'is_collection' => $isCollection,
'schema' => $schema,
];

Check warning on line 74 in src/Doctrine/Common/Filter/BackedEnumFilterTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Common/Filter/BackedEnumFilterTrait.php#L71-L74

Added lines #L71 - L74 were not covered by tests
}
}

return $description;
Expand Down
22 changes: 18 additions & 4 deletions src/Doctrine/Orm/Filter/BackedEnumFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,14 @@
return;
}

$value = $this->normalizeValue($value, $property);
if (null === $value) {
$values = \is_array($value) ? $value : [$value];

Check warning on line 128 in src/Doctrine/Orm/Filter/BackedEnumFilter.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Filter/BackedEnumFilter.php#L128

Added line #L128 was not covered by tests

$normalizedValues = array_filter(array_map(
fn ($v) => $this->normalizeValue($v, $property),
$values
));

Check warning on line 133 in src/Doctrine/Orm/Filter/BackedEnumFilter.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Filter/BackedEnumFilter.php#L130-L133

Added lines #L130 - L133 were not covered by tests

if (empty($normalizedValues)) {

Check warning on line 135 in src/Doctrine/Orm/Filter/BackedEnumFilter.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Filter/BackedEnumFilter.php#L135

Added line #L135 was not covered by tests
return;
}

Expand All @@ -139,9 +145,17 @@

$valueParameter = $queryNameGenerator->generateParameterName($field);

if (1 === \count($values)) {
$queryBuilder
->andWhere(\sprintf('%s.%s = :%s', $alias, $field, $valueParameter))
->setParameter($valueParameter, $values[0]);

Check warning on line 151 in src/Doctrine/Orm/Filter/BackedEnumFilter.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Filter/BackedEnumFilter.php#L148-L151

Added lines #L148 - L151 were not covered by tests

return;

Check warning on line 153 in src/Doctrine/Orm/Filter/BackedEnumFilter.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Filter/BackedEnumFilter.php#L153

Added line #L153 was not covered by tests
}

$queryBuilder
->andWhere(\sprintf('%s.%s = :%s', $alias, $field, $valueParameter))
->setParameter($valueParameter, $value);
->andWhere(\sprintf('%s.%s IN (:%s)', $alias, $field, $valueParameter))
->setParameter($valueParameter, $values);

Check warning on line 158 in src/Doctrine/Orm/Filter/BackedEnumFilter.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Filter/BackedEnumFilter.php#L157-L158

Added lines #L157 - L158 were not covered by tests
}

/**
Expand Down
9 changes: 9 additions & 0 deletions src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,15 @@
'invalid case for nested property' => [
\sprintf('SELECT o FROM %s o', Dummy::class),
],
'valid case (multiple values)' => [
\sprintf('SELECT o FROM %s o WHERE o.dummyBackedEnum IN (:dummyBackedEnum_p1)', Dummy::class),
[
'dummyBackedEnum_p1' => [
'one',
'two',
],
],
],

Check warning on line 54 in src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTest.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTest.php#L46-L54

Added lines #L46 - L54 were not covered by tests
]
);
}
Expand Down
41 changes: 41 additions & 0 deletions src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,25 @@
'property' => 'dummyBackedEnum',
'type' => 'string',
'required' => false,
'is_collection' => false,

Check warning on line 35 in src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php#L35

Added line #L35 was not covered by tests
'schema' => [
'type' => 'string',
'enum' => ['one', 'two'],
],
],
'dummyBackedEnum[]' => [
'property' => 'dummyBackedEnum',
'type' => 'string',
'required' => false,
'is_collection' => true,
'schema' => [
'type' => 'array',
'items' => [
'type' => 'string',
'enum' => ['one', 'two'],
],
],
],

Check warning on line 53 in src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php#L41-L53

Added lines #L41 - L53 were not covered by tests
], $filter->getDescription($this->resourceClass));
}

Expand All @@ -49,11 +63,25 @@
'property' => 'dummyBackedEnum',
'type' => 'string',
'required' => false,
'is_collection' => false,

Check warning on line 66 in src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php#L66

Added line #L66 was not covered by tests
'schema' => [
'type' => 'string',
'enum' => ['one', 'two'],
],
],
'dummyBackedEnum[]' => [
'property' => 'dummyBackedEnum',
'type' => 'string',
'required' => false,
'is_collection' => true,
'schema' => [
'type' => 'array',
'items' => [
'type' => 'string',
'enum' => ['one', 'two'],
],
],
],

Check warning on line 84 in src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php#L72-L84

Added lines #L72 - L84 were not covered by tests
], $filter->getDescription($this->resourceClass));
}

Expand Down Expand Up @@ -100,6 +128,19 @@
'relatedDummy.dummyBackedEnum' => 'foo',
],
],
'valid case (multiple values)' => [
[
'id' => null,
'name' => null,
'dummyBackedEnum' => null,
],
[
'dummyBackedEnum' => [
'one',
'two',
],
],
],

Check warning on line 143 in src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php

View check run for this annotation

Codecov / codecov/patch

src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTestTrait.php#L131-L143

Added lines #L131 - L143 were not covered by tests
];
}
}
Loading