Passed
Push — master ( fcb0ff...ac0f12 )
by Nico
32:37 queued 12:14
created

FlightSignatureRepository   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 192
Duplicated Lines 0 %

Test Coverage

Coverage 4.1%

Importance

Changes 1
Bugs 1 Features 0
Metric Value
eloc 125
dl 0
loc 192
ccs 5
cts 122
cp 0.041
rs 10
c 1
b 1
f 0
wmc 13

11 Methods

Rating   Name   Duplication   Size   Complexity  
A save() 0 4 1
A getSignaturesForUser() 0 19 1
A saveAll() 0 6 2
A getSignatureRangeForUser() 0 18 1
A deleteOldSignatures() 0 11 1
A getVisibleSignatureCount() 0 28 1
A getVisibleSignatures() 0 20 2
A prototype() 0 3 1
A getSignatureRangeForAlly() 0 19 1
A truncateAllSignatures() 0 8 1
A getFlightsTop10() 0 30 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Orm\Repository;
6
7
use Doctrine\ORM\EntityRepository;
8
use Doctrine\ORM\Query\ResultSetMapping;
9
use Stu\Component\Ship\FlightSignatureVisibilityEnum;
10
use Stu\Module\PlayerSetting\Lib\UserEnum;
11
use Stu\Orm\Entity\ColonyInterface;
12
use Stu\Orm\Entity\FlightSignature;
13
use Stu\Orm\Entity\FlightSignatureInterface;
14
use Stu\Orm\Entity\StarSystemMap;
15
use Stu\Orm\Entity\UserInterface;
16
17
/**
18
 * @extends EntityRepository<FlightSignature>
19
 */
20
final class FlightSignatureRepository extends EntityRepository implements FlightSignatureRepositoryInterface
21
{
22 1
    public function prototype(): FlightSignatureInterface
23
    {
24 1
        return new FlightSignature();
25
    }
26
27
    public function saveAll(array $array): void
28
    {
29
        $em = $this->getEntityManager();
30
31
        foreach ($array as $obj) {
32
            $em->persist($obj);
33
        }
34
    }
35
36 1
    public function save(FlightSignatureInterface $item): void
37
    {
38 1
        $em = $this->getEntityManager();
39 1
        $em->persist($item);
40
    }
41
42
    public function getVisibleSignatureCount(ColonyInterface $colony): int
43
    {
44
        return (int) $this->getEntityManager()
45
            ->createQuery(
46
                sprintf(
47
                    'SELECT count(DISTINCT CONCAT(fs.ship_id, fs.ship_name)) as count
48
                    FROM %s fs
49
                    JOIN %s ssm
50
                    WITH fs.starsystem_map_id = ssm.id
51
                    WHERE (fs.is_cloaked = false AND fs.time > :maxAgeUncloaked
52
                      OR fs.is_cloaked = true AND fs.time > :maxAgeCloaked)
53
                    AND ssm.sx = :sx
54
                    AND ssm.sy = :sy
55
                    AND ssm.systems_id = :systemsId
56
                    AND fs.user_id != :ignoreId',
57
                    FlightSignature::class,
58
                    StarSystemMap::class
59
                )
60
            )
61
            ->setParameters([
62
                'maxAgeUncloaked' => time() - FlightSignatureVisibilityEnum::SIG_VISIBILITY_UNCLOAKED,
63
                'maxAgeCloaked' => time() - FlightSignatureVisibilityEnum::SIG_VISIBILITY_CLOAKED,
64
                'sx' => $colony->getSx(),
65
                'sy' => $colony->getSy(),
66
                'systemsId' => $colony->getSystem()->getId(),
67
                'ignoreId' => $colony->getUserId()
68
            ])
69
            ->getSingleScalarResult();
70
    }
71
72
73
74
75
    public function getVisibleSignatures(int $fieldId, bool $isSystem, int $ignoreId): array
76
    {
77
        return $this->getEntityManager()
1 ignored issue
show
Bug Best Practice introduced by
The expression return $this->getEntityM...ignoreId))->getResult() could return the type integer which is incompatible with the type-hinted return array. Consider adding an additional type-check to rule them out.
Loading history...
78
            ->createQuery(
79
                sprintf(
80
                    'SELECT fs FROM %s fs
81
                    WHERE fs.time > :maxAge
82
                    AND fs.%s = :fieldId
83
                    AND fs.user_id != :ignoreId
84
                    ORDER BY fs.time desc',
85
                    FlightSignature::class,
86
                    $isSystem ? "starsystem_map_id" : "map_id"
87
                )
88
            )
89
            ->setParameters([
90
                'maxAge' => time() - FlightSignatureVisibilityEnum::SIG_VISIBILITY_UNCLOAKED,
91
                'fieldId' => $fieldId,
92
                'ignoreId' => $ignoreId
93
            ])
94
            ->getResult();
95
    }
96
97
    public function getSignatureRangeForUser(int $userId): array
98
    {
99
        $rsm = new ResultSetMapping();
100
        $rsm->addScalarResult('minx', 'minx', 'integer');
101
        $rsm->addScalarResult('maxx', 'maxx', 'integer');
102
        $rsm->addScalarResult('miny', 'miny', 'integer');
103
        $rsm->addScalarResult('maxy', 'maxy', 'integer');
104
105
        return $this->getEntityManager()
106
            ->createNativeQuery(
107
                'SELECT COALESCE(min(m.cx),0) as minx, COALESCE(max(m.cx),0) as maxx, COALESCE(min(m.cy),0) as miny, COALESCE(max(m.cy),0) as maxy
108
                FROM stu_flight_sig fs
109
                JOIN stu_map m ON m.id = fs.map_id
110
                WHERE fs.user_id = :userId',
111
                $rsm
112
            )
113
            ->setParameter('userId', $userId)
114
            ->getResult();
115
    }
116
117
    public function getSignatureRangeForAlly(int $allyId): array
118
    {
119
        $rsm = new ResultSetMapping();
120
        $rsm->addScalarResult('minx', 'minx', 'integer');
121
        $rsm->addScalarResult('maxx', 'maxx', 'integer');
122
        $rsm->addScalarResult('miny', 'miny', 'integer');
123
        $rsm->addScalarResult('maxy', 'maxy', 'integer');
124
125
        return $this->getEntityManager()
126
            ->createNativeQuery(
127
                'SELECT COALESCE(min(m.cx),0) as minx, COALESCE(max(m.cx),0) as maxx, COALESCE(min(m.cy),0) as miny, COALESCE(max(m.cy),0) as maxy
128
                FROM stu_flight_sig fs
129
                JOIN stu_map m ON m.id = fs.map_id
130
                JOIN stu_user u	ON fs.user_id = u.id
131
                WHERE u.allys_id = :allyId',
132
                $rsm
133
            )
134
            ->setParameter('allyId', $allyId)
135
            ->getResult();
136
    }
137
138
    public function deleteOldSignatures(int $threshold): void
139
    {
140
        $q = $this->getEntityManager()
141
            ->createQuery(
142
                sprintf(
143
                    'DELETE FROM %s fs WHERE fs.time < :maxAge',
144
                    FlightSignature::class
145
                )
146
            );
147
        $q->setParameter('maxAge', time() - $threshold);
148
        $q->execute();
149
    }
150
151
    public function getFlightsTop10(): array
152
    {
153
        $rsm = new ResultSetMapping();
154
        $rsm->addScalarResult('user_id', 'user_id', 'integer');
155
        $rsm->addScalarResult('sc', 'sc', 'integer');
156
        $rsm->addScalarResult('race', 'race', 'integer');
157
        $rsm->addScalarResult('shipc', 'shipc', 'integer');
158
159
        return $this
160
            ->getEntityManager()
161
            ->createNativeQuery(
162
                'SELECT fs.user_id, count(*) as sc,
163
                (SELECT race
164
                FROM stu_user u
165
                WHERE fs.user_id = u.id),
166
                count(distinct ship_id) as shipc
167
                FROM stu_flight_sig fs
168
                WHERE fs.to_direction != 0
169
                AND fs.user_id > :firstUserId
170
                AND fs.time > :maxAge
171
                GROUP BY fs.user_id
172
                ORDER BY 2 DESC
173
                LIMIT 10',
174
                $rsm
175
            )
176
            ->setParameters([
177
                'maxAge' => time() - FlightSignatureVisibilityEnum::SIG_VISIBILITY_UNCLOAKED,
178
                'firstUserId' => UserEnum::USER_FIRST_ID
179
            ])
180
            ->getResult();
181
    }
182
183
    public function getSignaturesForUser(UserInterface $user): int
184
    {
185
        return (int)$this
186
            ->getEntityManager()
187
            ->createQuery(
188
                sprintf(
189
                    'SELECT count(fs.id)
190
                    FROM %s fs
191
                    WHERE fs.to_direction != 0
192
                    AND fs.user_id  = :userId
193
                    AND fs.time > :maxAge',
194
                    FlightSignature::class
195
                )
196
            )
197
            ->setParameters([
198
                'maxAge' => time() - FlightSignatureVisibilityEnum::SIG_VISIBILITY_UNCLOAKED,
199
                'userId' => $user->getId()
200
            ])
201
            ->getSingleScalarResult();
202
    }
203
204
    public function truncateAllSignatures(): void
205
    {
206
        $this->getEntityManager()->createQuery(
207
            sprintf(
208
                'DELETE FROM %s fs',
209
                FlightSignature::class
210
            )
211
        )->execute();
212
    }
213
}
214