/** * @param Pantheon $community * @param OutputInterface $output */ private function updateCommunityDateStat(Pantheon $community, OutputInterface $output) { $this->logger->addInfo(sprintf('Update community "%s" with id %s', $community->getName(), $community->getId())); $today = new \DateTime('-4 hour'); /** @var PantheonDateStat[] $communityDateStat */ $communityDateStat = $community->getDateStat(); if (count($communityDateStat) && $communityDateStat->first()->getDate()->format('Y:m:d') == $today->format('Y:m:d')) { $this->logger->addInfo(sprintf('Community "%s" with id %s already parsed today', $community->getName(), $community->getId())); return; } $aggregator = array('sumPrestige' => 0, 'maxPrestige' => 0, 'pveSumMobKills' => 0, 'pveSumBossKills' => 0, 'pveSumDeaths' => 0, 'pvpSumTime' => 0, 'pvpSumKills' => 0, 'pvpSumDeaths' => 0, 'pvpSumAssists' => 0); /** @var Player $member */ foreach ($community->getMembers() as $member) { if (!count($member->getDateStat())) { continue; } /** @var PlayerDateStat $lastPlayerDateStat */ $lastPlayerDateStat = $member->getDateStat()->first(); $aggregator['sumPrestige'] += $lastPlayerDateStat->getMaxPrestige(); $aggregator['maxPrestige'] = $aggregator['maxPrestige'] < $lastPlayerDateStat->getMaxPrestige() ? $lastPlayerDateStat->getMaxPrestige() : $aggregator['maxPrestige']; $aggregator['pvpSumTime'] += $lastPlayerDateStat->getPvpTime(); // $aggregator['pveSumTime'] += $lastPlayerDateStat->getPveTime(); foreach ($member->getRoleStat() as $role) { $aggregator['pveSumMobKills'] += $role->getPveMobKills(); $aggregator['pveSumBossKills'] += $role->getPveBossKills(); $aggregator['pveSumDeaths'] += $role->getPveDeaths(); $aggregator['pvpSumKills'] += $role->getPvpKills(); $aggregator['pvpSumDeaths'] += $role->getPvpDeaths(); $aggregator['pvpSumAssists'] += $role->getPvpAssists(); } } $newPantheonDateStat = new PantheonDateStat(); $newPantheonDateStat->setPantheon($community)->setDate($today)->setSumPrestige($aggregator['sumPrestige'])->setAvgPrestige(count($community->getMembers()) ? round($aggregator['sumPrestige'] / count($community->getMembers())) : 0)->setMembersCount(count($community->getMembers()))->setMaxPrestige($aggregator['maxPrestige'])->setPveSumMobKills($aggregator['pveSumMobKills'])->setPveSumBossKills($aggregator['pveSumBossKills'])->setPveSumDeaths($aggregator['pveSumDeaths'])->setPvpSumTime($aggregator['pvpSumTime'])->setPvpSumKills($aggregator['pvpSumKills'])->setPvpSumDeaths($aggregator['pvpSumDeaths'])->setPvpSumAssists($aggregator['pvpSumAssists']); $this->em->persist($newPantheonDateStat); }
public function findWithDateStatByPantheon(Pantheon $pantheon) { $dql = ' select p.*, pds.* from Erliz\\SkyforgeBundle\\Entity\\Player p left join (select player, MAX(max_prestige) max_prestige from Erliz\\SkyforgeBundle\\Entity\\PlayerDateStat group by player) m_pds left join Erliz\\SkyforgeBundle\\Entity\\PlayerDateStat pds on pds.max_prestige = m_pds.max_prestige and pds.player = p.id where p.pantheon = :pantheonId group by p.id order by pds.max_prestige DESC '; $params = array(':pantheonId' => $pantheon->getId()); return new PlayerCollection($this->getEntityManager()->createQuery($dql)->setParameters($params)->useResultCache(true)->setResultCacheLifetime(1800)->getResult(Query::HYDRATE_ARRAY)); }