Scalr\Stats\CostAnalytics\Usage::getProjectFarmsTopUsageOnDate PHP Method

getProjectFarmsTopUsageOnDate() public method

Gets detailed top 5 usage by farms for specified project on date
public getProjectFarmsTopUsageOnDate ( string | null $projectId, string $platform, string $mode, string $date, string $start, string $end, string $ccId = null ) : array
$projectId string | null The identifier of the project
$platform string The cloud platform
$mode string The mode
$date string The UTC date within period ('Y-m-d H:00')
$start string The start date of the period in UTC ('Y-m-d')
$end string The end date of the period in UTC ('Y-m-d')
$ccId string optional The identifier of the cost center (It is used only when project is null)
return array Returns detailed top 5 usage by farms for specified project on date
    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];
    }