PlayerGroupRankingHandler::handle()   F
last analyzed

Complexity

Conditions 15
Paths 3097

Size

Total Lines 136
Code Lines 57

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 57
c 0
b 0
f 0
dl 0
loc 136
rs 1.7499
cc 15
nc 3097
nop 1

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace VideoGamesRecords\CoreBundle\Ranking\Command\Player;
6
7
use DateTime;
8
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
9
use Symfony\Component\Serializer\Serializer;
10
use VideoGamesRecords\CoreBundle\Entity\PlayerChartStatus;
11
use VideoGamesRecords\CoreBundle\Ranking\Command\AbstractRankingHandler;
12
use VideoGamesRecords\CoreBundle\Tools\Ranking;
13
14
class PlayerGroupRankingHandler extends AbstractRankingHandler
15
{
16
    public function handle($mixed): void
17
    {
18
        $group = $this->em->getRepository('VideoGamesRecords\CoreBundle\Entity\Group')->find($mixed);
19
        if (null === $group) {
20
            return;
21
        }
22
23
        //----- delete
24
        $query = $this->em->createQuery('DELETE VideoGamesRecords\CoreBundle\Entity\PlayerGroup pg WHERE pg.group = :group');
25
        $query->setParameter('group', $group);
26
        $query->execute();
27
28
        $data = [];
29
30
        //----- data rank0
31
        $query = $this->em->createQuery("
32
            SELECT
33
                 p.id,
34
                 COUNT(pc.id) as nb
35
            FROM VideoGamesRecords\CoreBundle\Entity\PlayerChart pc
36
            JOIN pc.player p
37
            JOIN pc.chart c
38
            WHERE c.group = :group
39
            AND pc.rank = 1
40
            AND c.nbPost > 1
41
            AND pc.nbEqual = 1
42
            GROUP BY p.id");
43
44
45
        $query->setParameter('group', $group);
46
        $result = $query->getResult();
47
        foreach ($result as $row) {
48
            $data['chartRank0'][$row['id']] = $row['nb'];
49
        }
50
51
        //----- data rank1 to rank5
52
        $query = $this->em->createQuery("
53
            SELECT
54
                 p.id,
55
                 COUNT(pc.id) as nb
56
            FROM VideoGamesRecords\CoreBundle\Entity\PlayerChart pc
57
            JOIN pc.player p
58
            JOIN pc.chart c
59
            WHERE c.group = :group
60
            AND pc.rank = :rank
61
            GROUP BY p.id");
62
        $query->setParameter('group', $group);
63
64
        for ($i = 1; $i <= 5; $i++) {
65
            $query->setParameter('rank', $i);
66
            $result = $query->getResult();
67
            foreach ($result as $row) {
68
                $data['chartRank' . $i][$row['id']] = $row['nb'];
69
            }
70
        }
71
72
        //----- data nbRecordProuve
73
        $query = $this->em->createQuery("
74
            SELECT
75
                 p.id,
76
                 COUNT(pc.id) as nb
77
            FROM VideoGamesRecords\CoreBundle\Entity\PlayerChart pc
78
            JOIN pc.player p
79
            JOIN pc.chart c
80
            WHERE c.group = :group
81
            AND pc.status = :status
82
            GROUP BY p.id");
83
84
        $query->setParameter('group', $group);
85
        $query->setParameter(
86
            'status',
87
            $this->em->getReference(
88
                PlayerChartStatus::class,
89
                PlayerChartStatus::ID_STATUS_PROOVED
90
            )
91
        );
92
93
        $result = $query->getResult();
94
        foreach ($result as $row) {
95
            $data['nbChartProven'][$row['id']] = $row['nb'];
96
        }
97
98
99
        //----- select and save result in array
100
        $query = $this->em->createQuery("
101
            SELECT
102
                p.id,
103
                '' as rankPoint,
104
                '' as rankMedal,
105
                SUM(pc.pointChart) as pointChart,
106
                COUNT(pc.id) as nbChart,
107
                MAX(pc.lastUpdate) as lastUpdate
108
            FROM VideoGamesRecords\CoreBundle\Entity\PlayerChart pc
109
            JOIN pc.player p
110
            JOIN pc.chart c
111
            WHERE c.group = :group
112
            GROUP BY p.id
113
            ORDER BY pointChart DESC");
114
115
116
        $query->setParameter('group', $group);
117
        $result = $query->getResult();
118
119
        $list = [];
120
        foreach ($result as $row) {
121
            $row['rankMedal'] = 0;
122
            $row['chartRank0'] = (isset($data['chartRank0'][$row['id']])) ? $data['chartRank0'][$row['id']] : 0;
123
            $row['chartRank1'] = (isset($data['chartRank1'][$row['id']])) ? $data['chartRank1'][$row['id']] : 0;
124
            $row['chartRank2'] = (isset($data['chartRank2'][$row['id']])) ? $data['chartRank2'][$row['id']] : 0;
125
            $row['chartRank3'] = (isset($data['chartRank3'][$row['id']])) ? $data['chartRank3'][$row['id']] : 0;
126
            $row['chartRank4'] = (isset($data['chartRank4'][$row['id']])) ? $data['chartRank4'][$row['id']] : 0;
127
            $row['chartRank5'] = (isset($data['chartRank5'][$row['id']])) ? $data['chartRank5'][$row['id']] : 0;
128
            $row['nbChartProven'] = (isset($data['nbChartProven'][$row['id']])) ? $data['nbChartProven'][$row['id']] : 0;
129
            $row['lastUpdate'] = new DateTime($row['lastUpdate']);
130
            $list[] = $row;
131
        }
132
133
        //----- add some data
134
        $list = Ranking::addRank($list, 'rankPointChart', ['pointChart']);
135
        $list = Ranking::order($list, ['chartRank0' => SORT_DESC, 'chartRank1' => SORT_DESC, 'chartRank2' => SORT_DESC, 'chartRank3' => SORT_DESC]);
136
        $list = Ranking::addRank($list, 'rankMedal', ['chartRank0', 'chartRank1', 'chartRank2', 'chartRank3', 'chartRank4', 'chartRank5']);
137
138
        $normalizer = new ObjectNormalizer();
139
        $serializer = new Serializer([$normalizer]);
140
141
        foreach ($list as $row) {
142
            $playerGroup = $serializer->denormalize(
143
                $row,
144
                'VideoGamesRecords\CoreBundle\Entity\PlayerGroup'
145
            );
146
            $playerGroup->setPlayer($this->em->getReference('VideoGamesRecords\CoreBundle\Entity\Player', $row['id']));
147
            $playerGroup->setGroup($group);
148
149
            $this->em->persist($playerGroup);
150
        }
151
        $this->em->flush();
152
    }
153
}
154