Skip to content

Commit 1a0fab0

Browse files
committed
Use a deterministic method to generate parameter names for filters, to allow for proper caching of queries
1 parent fcdeb04 commit 1a0fab0

File tree

7 files changed

+29
-7
lines changed

7 files changed

+29
-7
lines changed

src/DataTables/Filters/AttachmentFilter.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
*/
2323
namespace App\DataTables\Filters;
2424

25+
use App\DataTables\Filters\Constraints\AbstractConstraint;
2526
use App\DataTables\Filters\Constraints\BooleanConstraint;
2627
use App\DataTables\Filters\Constraints\DateTimeConstraint;
2728
use App\DataTables\Filters\Constraints\EntityConstraint;
@@ -32,6 +33,7 @@
3233
use App\Entity\Attachments\AttachmentType;
3334
use App\Services\Trees\NodesListBuilder;
3435
use Doctrine\ORM\QueryBuilder;
36+
use Omines\DataTablesBundle\Filter\AbstractFilter;
3537

3638
class AttachmentFilter implements FilterInterface
3739
{
@@ -51,6 +53,9 @@ class AttachmentFilter implements FilterInterface
5153

5254
public function __construct(NodesListBuilder $nodesListBuilder)
5355
{
56+
//Must be done for every new set of attachment filters, to ensure deterministic parameter names.
57+
AbstractConstraint::resetParameterCounter();
58+
5459
$this->dbId = new IntConstraint('attachment.id');
5560
$this->name = new TextConstraint('attachment.name');
5661
$this->targetType = new InstanceOfConstraint('attachment');

src/DataTables/Filters/Constraints/AbstractConstraint.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@ abstract class AbstractConstraint implements FilterInterface
2828
{
2929
use FilterTrait;
3030

31-
/**
32-
* @var string
33-
*/
34-
protected string $identifier;
31+
protected ?string $identifier;
3532

3633

3734
/**

src/DataTables/Filters/Constraints/FilterTrait.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ trait FilterTrait
2828
{
2929

3030
protected bool $useHaving = false;
31+
protected static int $parameterCounter = 0;
3132

3233
public function useHaving($value = true): static
3334
{
@@ -50,8 +51,18 @@ protected function generateParameterIdentifier(string $property): string
5051
{
5152
//Replace all special characters with underscores
5253
$property = preg_replace('/\W/', '_', $property);
53-
//Add a random number to the end of the property name for uniqueness
54-
return $property . '_' . uniqid("", false);
54+
return $property . '_' . (self::$parameterCounter++) . '_';
55+
}
56+
57+
/**
58+
* Resets the parameter counter, so the next call to generateParameterIdentifier will start from 0 again.
59+
* This should be done before initializing a new set of filters to a fresh query builder, to ensure that the parameter
60+
* identifiers are deterministic so that they are cacheable.
61+
* @return void
62+
*/
63+
public static function resetParameterCounter(): void
64+
{
65+
self::$parameterCounter = 0;
5566
}
5667

5768
/**

src/DataTables/Filters/Constraints/Part/TagsConstraint.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ protected function getExpressionForTag(QueryBuilder $queryBuilder, string $tag):
8888
//Escape any %, _ or \ in the tag
8989
$tag = addcslashes($tag, '%_\\');
9090

91-
$tag_identifier_prefix = uniqid($this->identifier . '_', false);
91+
$tag_identifier_prefix = $this->generateParameterIdentifier('tag');
9292

9393
$expr = $queryBuilder->expr();
9494

src/DataTables/Filters/LogFilter.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
*/
2323
namespace App\DataTables\Filters;
2424

25+
use App\DataTables\Filters\Constraints\AbstractConstraint;
2526
use App\DataTables\Filters\Constraints\ChoiceConstraint;
2627
use App\DataTables\Filters\Constraints\DateTimeConstraint;
2728
use App\DataTables\Filters\Constraints\EntityConstraint;
@@ -44,6 +45,9 @@ class LogFilter implements FilterInterface
4445

4546
public function __construct()
4647
{
48+
//Must be done for every new set of attachment filters, to ensure deterministic parameter names.
49+
AbstractConstraint::resetParameterCounter();
50+
4751
$this->timestamp = new DateTimeConstraint('log.timestamp');
4852
$this->dbId = new IntConstraint('log.id');
4953
$this->level = new ChoiceConstraint('log.level');

src/DataTables/Filters/PartFilter.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
*/
2323
namespace App\DataTables\Filters;
2424

25+
use App\DataTables\Filters\Constraints\AbstractConstraint;
2526
use App\DataTables\Filters\Constraints\BooleanConstraint;
2627
use App\DataTables\Filters\Constraints\ChoiceConstraint;
2728
use App\DataTables\Filters\Constraints\DateTimeConstraint;
@@ -103,6 +104,9 @@ class PartFilter implements FilterInterface
103104

104105
public function __construct(NodesListBuilder $nodesListBuilder)
105106
{
107+
//Must be done for every new set of attachment filters, to ensure deterministic parameter names.
108+
AbstractConstraint::resetParameterCounter();
109+
106110
$this->name = new TextConstraint('part.name');
107111
$this->description = new TextConstraint('part.description');
108112
$this->comment = new TextConstraint('part.comment');

src/DataTables/Filters/PartSearchFilter.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
* along with this program. If not, see <https://www.gnu.org/licenses/>.
2222
*/
2323
namespace App\DataTables\Filters;
24+
use App\DataTables\Filters\Constraints\AbstractConstraint;
2425
use Doctrine\ORM\QueryBuilder;
2526

2627
class PartSearchFilter implements FilterInterface

0 commit comments

Comments
 (0)