public function getProjectFarmsTopUsageOnDate($projectId, $platform, $mode, $date, $start, $end, $ccId = null)
{
$projectId = empty($projectId) ? null : $projectId;
$iterator = ChartPeriodIterator::create($mode, $start, $end ?: null, 'UTC');
//Interval which is used in the database query for grouping
$queryInterval = preg_replace('/^1 /', '', $iterator->getInterval());
if ($projectId !== null) {
$project = ProjectEntity::findPk($projectId);
if ($project === null) {
if (empty($ccId)) {
throw new AnalyticsException(sprintf("Project %s does not exist. Please provide ccId.", $projectId));
}
}
}
//Requests data for the specified period
$rawUsage = $this->get(['projectId' => $projectId], $iterator->getStart(), $iterator->getEnd(), [$queryInterval, TagEntity::TAG_ID_PLATFORM, TagEntity::TAG_ID_FARM], true);
//Requests data for the previous period
$rawPrevUsage = $this->get(['projectId' => $projectId], $iterator->getPreviousStart(), $iterator->getPreviousEnd(), [$queryInterval, TagEntity::TAG_ID_PLATFORM, TagEntity::TAG_ID_FARM], true);
//We do not need to calculate the percentage here
$usg = (new AggregationCollection(['period', 'platform', 'farmId' => ['envId']], ['cost' => 'sum']))->load($rawUsage);
$prevUsg = (new AggregationCollection(['period', 'platform', 'farmId'], ['cost' => 'sum']))->load($rawPrevUsage)->calculatePercentage();
//Previous chart point
$prevcp = null;
//Finds the key for current label
foreach ($iterator as $chartPoint) {
if ($chartPoint->dt->format('Y-m-d H:00') !== $date) {
$prevcp = $chartPoint;
continue;
}
$cp = $chartPoint;
break;
}
if (!isset($cp)) {
throw new OutOfRangeException(sprintf('Requested date (%s) is out of the range. Last point date is %s', $date, isset($prevcp->dt) ? $prevcp->dt->format('Y-m-d H:00') : 'undefined'));
}
$result = [];
//Maximum number of the farms without grouping
$max = 5;
if (!empty($usg['data'][$cp->key]['data'][$platform]['data'])) {
$usgFarms = new AggregationCollection(['farmId' => ['envId']], ['cost' => 'sum']);
$ptr = $usg['data'][$cp->key]['data'][$platform]['data'];
uasort($ptr, function ($a, $b) {
if ($a['cost'] == $b['cost']) {
return 0;
}
return $a['cost'] > $b['cost'] ? -1 : 1;
});
//Aggregates farms if its number more then max + 1
if (count($ptr) > $max + 1) {
$this->otherFarmsQuantity = count($ptr) - $max;
$new = [];
$i = 0;
foreach ($ptr as $farmId => $v) {
$v['cost_percentage'] = round($usg['data'][$cp->key]['data'][$platform]['cost'] == 0 ? 0 : $v['cost'] * 100 / $usg['data'][$cp->key]['data'][$platform]['cost'], 0);
if ($i < $max) {
$new[$farmId] = $v;
} elseif (!isset($new[self::EVERYTHING_ELSE])) {
$v['id'] = self::EVERYTHING_ELSE;
$new[self::EVERYTHING_ELSE] = $v;
} else {
$new[self::EVERYTHING_ELSE]['cost'] += $v['cost'];
}
$i++;
}
$new[self::EVERYTHING_ELSE]['cost_percentage'] = round($usg['data'][$cp->key]['data'][$platform]['cost'] == 0 ? 0 : $new[self::EVERYTHING_ELSE]['cost'] * 100 / $usg['data'][$cp->key]['data'][$platform]['cost'], 0);
$usgFarms->setData(['data' => $new]);
} else {
$usgFarms->setData($usg['data'][$cp->key]['data'][$platform])->calculatePercentage();
}
//Forms result data array
foreach ($usgFarms->getIterator() as $farmId => $pv) {
$record = $this->getDetailedPointDataArray($farmId, $this->fetchFarmName($farmId), $pv, isset($prevUsg['data'][$cp->previousPeriodKey]['data'][$platform]['data'][$farmId]) ? $prevUsg['data'][$cp->previousPeriodKey]['data'][$platform]['data'][$farmId] : null, isset($usg['data'][$cp->key]['data'][$platform]['data'][$farmId]) ? $usg['data'][$cp->key]['data'][$platform]['data'][$farmId] : null);
if ($farmId && $farmId != self::EVERYTHING_ELSE && !empty($pv['envId'])) {
$record['environment'] = ['id' => (int) $pv['envId'], 'name' => AccountTagEntity::fetchName($pv['envId'], TagEntity::TAG_ID_ENVIRONMENT)];
}
$result[] = $record;
}
}
return ['data' => $result];
}