Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
13 / 13
44.44% covered (danger)
44.44%
4 / 9
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
DefaultCriterionConverter
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
13 / 13
44.44% covered (danger)
44.44%
4 / 9
100.00% covered (success)
100.00%
3 / 3
15.40
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 applyAll
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
4 / 4
66.67% covered (warning)
66.67%
2 / 3
100.00% covered (success)
100.00%
1 / 1
2.15
 apply
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
8 / 8
20.00% covered (danger)
20.00%
1 / 5
100.00% covered (success)
100.00%
1 / 1
12.19
1<?php
2
3namespace App\Specification;
4
5use App\Specification\Criterion\Criterion;
6use App\Specification\Criterion\EnumCriterion;
7use App\Specification\Criterion\ValueCriterion;
8use App\Specification\Criterion\ValuesCriterion;
9
10/**
11 * @author Wilhelm Zwertvaegher
12 */
13class DefaultCriterionConverter implements CriterionConverter
14{
15    /**
16     * @var array<class-string<Criterion>, \Closure>
17     */
18    private array $builders;
19
20    public function __construct()
21    {
22        $this->builders = [
23            EnumCriterion::class => function (QueryBuilderInterface $qb, EnumCriterion $criterion, int $criterionIndex, EntitiesAliases $aliases) {
24                $qb->andWhere($aliases->getAlias($criterion->getTargetEntity()).'.'.$criterion->getField()." IN (:values{$criterionIndex})")
25                    ->setParameter("values{$criterionIndex}", $criterion->getAllowedValues());
26            },
27            ValueCriterion::class => function (QueryBuilderInterface $qb, ValueCriterion $criterion, int $criterionIndex, EntitiesAliases $aliases) {
28                $qb->andWhere($aliases->getAlias($criterion->getTargetEntity()).'.'.$criterion->getField().' '.$criterion->getCheck()->value." :value{$criterionIndex}")
29                    ->setParameter("value{$criterionIndex}", $criterion->getValue());
30            },
31            ValuesCriterion::class => function (QueryBuilderInterface $qb, ValuesCriterion $criterion, int $criterionIndex, EntitiesAliases $aliases) {
32                $qb->andWhere($aliases->getAlias($criterion->getTargetEntity()).'.'.$criterion->getField().'  '.$criterion->getCheck()->value." (:values{$criterionIndex})")
33                    ->setParameter("values{$criterionIndex}", $criterion->getValues());
34            },
35        ];
36    }
37
38    /**
39     * @param array<Criterion> $criteria
40     */
41    public function applyAll(QueryBuilderInterface $qb, array $criteria, EntitiesAliases $aliases): void
42    {
43        foreach ($criteria as $i => $criterion) {
44            $this->apply($qb, $criterion, $i, $aliases);
45        }
46    }
47
48    public function apply(QueryBuilderInterface $qb, Criterion $criterion, int $criterionIndex, EntitiesAliases $aliases): void
49    {
50        if ($criterion->shouldApply()) {
51            foreach ($this->builders as $class => $builder) {
52                if ($criterion instanceof $class) {
53                    $builder($qb, $criterion, $criterionIndex, $aliases);
54                }
55            }
56        }
57    }
58}