Total Complexity | 23 |
Total Lines | 374 |
Duplicated Lines | 0 % |
Coverage | 0% |
Changes | 0 |
1 | <?php |
||
22 | final class PlanetFieldRepository extends EntityRepository implements PlanetFieldRepositoryInterface |
||
23 | { |
||
24 | public function prototype(): PlanetFieldInterface |
||
25 | { |
||
26 | return new PlanetField(); |
||
27 | } |
||
28 | |||
29 | public function save(PlanetFieldInterface $planetField): void |
||
34 | } |
||
35 | |||
36 | public function delete(PlanetFieldInterface $planetField): void |
||
42 | } |
||
43 | |||
44 | public function getByColonyAndFieldId(int $colonyId, int $fieldId): ?PlanetFieldInterface |
||
49 | ]); |
||
50 | } |
||
51 | |||
52 | public function getByColonyAndFieldIndex(int $colonyId, int $fieldIndex): ?PlanetFieldInterface |
||
53 | { |
||
54 | return $this->findOneBy([ |
||
55 | 'colonies_id' => $colonyId, |
||
56 | 'field_id' => $fieldIndex |
||
57 | ]); |
||
58 | } |
||
59 | |||
60 | public function getByColonyAndType(int $colonyId, int $planetFieldTypeId): array |
||
61 | { |
||
62 | return $this->findBy([ |
||
63 | 'colonies_id' => $colonyId, |
||
64 | 'type_id' => $planetFieldTypeId, |
||
65 | ]); |
||
66 | } |
||
67 | |||
68 | public function getEnergyConsumingByHost( |
||
69 | PlanetFieldHostInterface $host, |
||
70 | array $state = [0, 1], |
||
71 | ?int $limit = null, |
||
72 | array $excludedFields = [-1] |
||
73 | ): array { |
||
74 | return $this->getEntityManager()->createQuery( |
||
1 ignored issue
–
show
|
|||
75 | sprintf( |
||
76 | 'SELECT f FROM %s f |
||
77 | WHERE f.%s = :hostId |
||
78 | AND f.aktiv IN (:state) |
||
79 | AND f.field_id NOT IN (:excluded) |
||
80 | AND f.buildings_id IN ( |
||
81 | SELECT b.id FROM %s b WHERE b.eps_proc < 0 |
||
82 | )', |
||
83 | PlanetField::class, |
||
84 | $host->getPlanetFieldHostColumnIdentifier(), |
||
85 | Building::class |
||
86 | ) |
||
87 | )->setParameters([ |
||
88 | 'hostId' => $host->getId(), |
||
89 | 'state' => $state, |
||
90 | 'excluded' => $excludedFields |
||
91 | ]) |
||
92 | ->setMaxResults($limit) |
||
93 | ->getResult(); |
||
94 | } |
||
95 | |||
96 | public function getEnergyProducingByHost(PlanetFieldHostInterface $host): array |
||
111 | } |
||
112 | |||
113 | public function getHousingProvidingByHost(PlanetFieldHostInterface $host): array |
||
114 | { |
||
115 | return $this->getEntityManager()->createQuery( |
||
1 ignored issue
–
show
|
|||
116 | sprintf( |
||
117 | 'SELECT f FROM %s f |
||
118 | WHERE f.%s = :hostId AND f.buildings_id IN ( |
||
119 | SELECT b.id FROM %s b WHERE b.bev_pro > 0 |
||
120 | )', |
||
121 | PlanetField::class, |
||
122 | $host->getPlanetFieldHostColumnIdentifier(), |
||
123 | Building::class |
||
124 | ) |
||
125 | )->setParameters([ |
||
126 | 'hostId' => $host->getId() |
||
127 | ])->getResult(); |
||
128 | } |
||
129 | |||
130 | public function getWorkerConsumingByHost(PlanetFieldHostInterface $host): array |
||
131 | { |
||
132 | return $this->getEntityManager()->createQuery( |
||
1 ignored issue
–
show
|
|||
133 | sprintf( |
||
134 | 'SELECT f FROM %s f |
||
135 | WHERE f.%s = :hostId AND f.buildings_id IN ( |
||
136 | SELECT b.id FROM %s b WHERE b.bev_use > 0 |
||
137 | )', |
||
138 | PlanetField::class, |
||
139 | $host->getPlanetFieldHostColumnIdentifier(), |
||
140 | Building::class |
||
141 | ) |
||
142 | )->setParameters([ |
||
143 | 'hostId' => $host->getId(), |
||
144 | ])->getResult(); |
||
145 | } |
||
146 | |||
147 | public function getWorkerConsumingByColonyAndState( |
||
148 | int $colonyId, |
||
149 | array $state = [0, 1], |
||
150 | ?int $limit = null, |
||
151 | array $excludedFields = [-1] |
||
152 | ): array { |
||
153 | return $this->getEntityManager()->createQuery( |
||
1 ignored issue
–
show
|
|||
154 | sprintf( |
||
155 | 'SELECT f FROM %s f |
||
156 | WHERE f.colonies_id = :colonyId |
||
157 | AND f.aktiv IN (:state) |
||
158 | AND f.field_id NOT IN (:excluded) |
||
159 | AND f.buildings_id IN ( |
||
160 | SELECT b.id FROM %s b WHERE b.bev_use > 0 |
||
161 | )', |
||
162 | PlanetField::class, |
||
163 | Building::class |
||
164 | ) |
||
165 | )->setParameters([ |
||
166 | 'colonyId' => $colonyId, |
||
167 | 'state' => $state, |
||
168 | 'excluded' => $excludedFields |
||
169 | ]) |
||
170 | ->setMaxResults($limit) |
||
171 | ->getResult(); |
||
172 | } |
||
173 | |||
174 | public function getCommodityConsumingByHostAndCommodity( |
||
175 | PlanetFieldHostInterface $host, |
||
176 | int $commodityId, |
||
177 | array $state = [0, 1], |
||
178 | ?int $limit = null, |
||
179 | array $excludedFields = [-1] |
||
180 | ): array { |
||
181 | return $this->getEntityManager()->createQuery( |
||
1 ignored issue
–
show
|
|||
182 | sprintf( |
||
183 | 'SELECT f FROM %s f |
||
184 | WHERE f.%s = :hostId |
||
185 | AND f.field_id NOT IN (:excluded) |
||
186 | AND f.buildings_id IN ( |
||
187 | SELECT bg.buildings_id FROM %s bg WHERE bg.commodity_id = :commodityId AND bg.count < 0 |
||
188 | ) AND f.aktiv IN (:state)', |
||
189 | PlanetField::class, |
||
190 | $host->getPlanetFieldHostColumnIdentifier(), |
||
191 | BuildingCommodity::class |
||
192 | ) |
||
193 | )->setParameters([ |
||
194 | 'hostId' => $host->getId(), |
||
195 | 'commodityId' => $commodityId, |
||
196 | 'state' => $state, |
||
197 | 'excluded' => $excludedFields |
||
198 | ]) |
||
199 | ->setMaxResults($limit) |
||
200 | ->getResult(); |
||
201 | } |
||
202 | |||
203 | public function getCommodityProducingByHostAndCommodity(PlanetFieldHostInterface $host, int $commodityId): array |
||
204 | { |
||
205 | return $this->getEntityManager()->createQuery( |
||
1 ignored issue
–
show
|
|||
206 | sprintf( |
||
207 | 'SELECT f FROM %s f |
||
208 | WHERE f.%s = :hostId AND f.buildings_id IN ( |
||
209 | SELECT bg.buildings_id FROM %s bg WHERE bg.commodity_id = :commodityId AND bg.count > 0 |
||
210 | )', |
||
211 | PlanetField::class, |
||
212 | $host->getPlanetFieldHostColumnIdentifier(), |
||
213 | BuildingCommodity::class |
||
214 | ) |
||
215 | )->setParameters([ |
||
216 | 'hostId' => $host->getId(), |
||
217 | 'commodityId' => $commodityId, |
||
218 | ])->getResult(); |
||
219 | } |
||
220 | |||
221 | public function getCountByHostAndBuilding(PlanetFieldHostInterface $host, int $buildingId): int |
||
222 | { |
||
223 | return $this->count([ |
||
224 | $host->getPlanetFieldHostColumnIdentifier() => $host->getId(), |
||
225 | 'buildings_id' => $buildingId, |
||
226 | ]); |
||
227 | } |
||
228 | |||
229 | public function getCountByBuildingAndUser(int $buildingId, int $userId): int |
||
230 | { |
||
231 | return (int) $this->getEntityManager()->createQuery( |
||
232 | sprintf( |
||
233 | 'SELECT COUNT(f) FROM %s f WHERE f.buildings_id = :buildingId AND f.colonies_id IN ( |
||
234 | SELECT c.id FROM %s c WHERE c.user_id = :userId |
||
235 | )', |
||
236 | PlanetField::class, |
||
237 | Colony::class |
||
238 | ) |
||
239 | )->setParameters([ |
||
240 | 'buildingId' => $buildingId, |
||
241 | 'userId' => $userId, |
||
242 | ])->getSingleScalarResult(); |
||
243 | } |
||
244 | |||
245 | public function getCountByColonyAndBuildingFunctionAndState( |
||
246 | PlanetFieldHostInterface $host, |
||
247 | array $buildingFunctionIds, |
||
248 | array $state |
||
249 | ): int { |
||
250 | return (int) $this->getEntityManager()->createQuery( |
||
251 | sprintf( |
||
252 | 'SELECT COUNT(f) FROM %s f |
||
253 | WHERE f.%s = :host AND f.aktiv IN(:state) AND f.buildings_id IN ( |
||
254 | SELECT bf.buildings_id FROM %s bf WHERE bf.function IN (:buildingFunctionIds) |
||
255 | )', |
||
256 | PlanetField::class, |
||
257 | $host->getPlanetFieldHostIdentifier(), |
||
258 | BuildingFunction::class |
||
259 | ) |
||
260 | )->setParameters([ |
||
261 | 'host' => $host, |
||
262 | 'buildingFunctionIds' => $buildingFunctionIds, |
||
263 | 'state' => $state, |
||
264 | ])->getSingleScalarResult(); |
||
265 | } |
||
266 | |||
267 | public function getByColonyAndBuildingFunction( |
||
268 | int $colonyId, |
||
269 | array $buildingFunctionIds |
||
270 | ): array { |
||
271 | return $this->getEntityManager() |
||
1 ignored issue
–
show
|
|||
272 | ->createQuery( |
||
273 | sprintf( |
||
274 | 'SELECT f FROM %s f WHERE f.colonies_id = :colonyId AND f.buildings_id IN ( |
||
275 | SELECT bf.buildings_id FROM %s bf WHERE bf.function IN (:buildingFunctionId) |
||
276 | )', |
||
277 | PlanetField::class, |
||
278 | BuildingFunction::class |
||
279 | ) |
||
280 | ) |
||
281 | ->setParameters([ |
||
282 | 'colonyId' => $colonyId, |
||
283 | 'buildingFunctionId' => $buildingFunctionIds |
||
284 | ]) |
||
285 | ->getResult(); |
||
286 | } |
||
287 | |||
288 | public function getMaxShieldsOfHost(PlanetFieldHostInterface $host): int |
||
289 | { |
||
290 | $rsm = new ResultSetMapping(); |
||
291 | $rsm->addScalarResult('capacity', 'capacity'); |
||
292 | |||
293 | return (int) $this->getEntityManager()->createNativeQuery( |
||
294 | sprintf( |
||
295 | 'SELECT COUNT(distinct f1.id) * :generatorCapacity + COUNT(distinct f2.id) * :batteryCapacity as capacity |
||
296 | FROM stu_colonies_fielddata f1 |
||
297 | LEFT JOIN stu_colonies_fielddata f2 |
||
298 | ON f1.colonies_id = f2.colonies_id |
||
299 | AND f2.aktiv = 1 AND f2.buildings_id IN ( |
||
300 | SELECT bf2.buildings_id FROM stu_buildings_functions bf2 WHERE bf2.function = :shieldBattery |
||
301 | ) |
||
302 | WHERE f1.%s = :hostId AND f1.aktiv = 1 AND f1.buildings_id IN ( |
||
303 | SELECT bf1.buildings_id FROM stu_buildings_functions bf1 WHERE bf1.function = :shieldGenerator |
||
304 | )', |
||
305 | $host->getPlanetFieldHostColumnIdentifier() |
||
306 | ), |
||
307 | $rsm |
||
308 | )->setParameters([ |
||
309 | 'hostId' => $host->getId(), |
||
310 | 'shieldGenerator' => BuildingEnum::BUILDING_FUNCTION_SHIELD_GENERATOR, |
||
311 | 'shieldBattery' => BuildingEnum::BUILDING_FUNCTION_SHIELD_BATTERY, |
||
312 | 'generatorCapacity' => BuildingEnum::SHIELD_GENERATOR_CAPACITY, |
||
313 | 'batteryCapacity' => BuildingEnum::SHIELD_BATTERY_CAPACITY |
||
314 | ])->getSingleScalarResult(); |
||
315 | } |
||
316 | |||
317 | public function getInConstructionByUser(int $userId): array |
||
330 | } |
||
331 | |||
332 | public function getByConstructionFinish(int $finishTime): array |
||
342 | } |
||
343 | |||
344 | public function getByColonyWithBuilding(PlanetFieldHostInterface $host): array |
||
345 | { |
||
346 | return $this->getEntityManager()->createQuery( |
||
1 ignored issue
–
show
|
|||
347 | sprintf( |
||
348 | 'SELECT f FROM %s f |
||
349 | JOIN %s b |
||
350 | WITH f.buildings_id = b.id |
||
351 | WHERE f.%s = :hostId |
||
352 | AND f.buildings_id > 0 |
||
353 | ORDER BY b.name ASC', |
||
354 | PlanetField::class, |
||
355 | Building::class, |
||
356 | $host->getPlanetFieldHostColumnIdentifier(), |
||
357 | ) |
||
358 | )->setParameters([ |
||
359 | 'hostId' => $host->getId(), |
||
360 | ])->getResult(); |
||
361 | } |
||
362 | |||
363 | public function getEnergyProductionByHost( |
||
364 | PlanetFieldHostInterface $host, |
||
365 | array $excludedFields = [-1] |
||
366 | ): int { |
||
367 | return (int) $this->getEntityManager()->createQuery( |
||
368 | sprintf( |
||
369 | 'SELECT SUM(b.eps_proc) |
||
370 | FROM %s cfd |
||
371 | LEFT JOIN %s b WITH b.id = cfd.buildings_id |
||
372 | WHERE cfd.aktiv = :state |
||
373 | AND cfd.field_id NOT IN (:excluded) |
||
374 | AND cfd.%s = :host', |
||
375 | PlanetField::class, |
||
376 | Building::class, |
||
377 | $host->getPlanetFieldHostIdentifier() |
||
378 | ) |
||
379 | )->setParameters([ |
||
380 | 'state' => 1, |
||
381 | 'host' => $host, |
||
382 | 'excluded' => $excludedFields |
||
383 | ])->getSingleScalarResult(); |
||
384 | } |
||
385 | |||
386 | public function truncateByColony(ColonyInterface $colony): void |
||
396 | } |
||
397 | } |
||
398 |