public static function getProcessWindowHierarchy($winIdCluster, $fromTime, $toTime = null) { $query = Record::find(); StatsHelper::whereFromTo($query, $fromTime, $toTime); $query->joinWith(['window', 'window.process']); $query->groupBy('window_id'); $query->select(['SUM(duration) as duration', 'process_id', 'window_id', 'window.title']); $data = $query->createCommand()->queryAll(); /** @var Process[] $processMap */ // $processMap = self::processMap(); $groups = ['children' => [], 'name' => 'root']; // build tree of processes foreach ($data as $window) { if ((int) $window['duration'] == 0) { continue; } $clusterId = isset($winIdCluster[$window['window_id']]) ? $winIdCluster[$window['window_id']] : '-1'; if (!isset($groups['children'][$clusterId])) { $groups['children'][$clusterId] = ['name' => 'Cluster #' . $clusterId, 'sector_id' => $clusterId, 'process_id' => $window['process_id'], 'children' => [], 'size' => 0]; } $groups['children'][$clusterId]['children'][] = ['name' => $window['title'], 'window_id' => $window['window_id'], 'size' => (int) $window['duration'] / 1000]; $groups['children'][$clusterId]['size'] += (int) $window['duration'] / 1000; } $groups['children'] = array_values($groups['children']); foreach ($groups['children'] as $key => $process) { usort($groups['children'][$key]['children'], function ($a, $b) { return $b['size'] - $a['size']; }); } usort($groups['children'], function ($a, $b) { return $b['size'] - $a['size']; }); return $groups; }
public function clusterChart($searchModel) { $from = strtotime('today', $searchModel->timestampFrom); $to = strtotime('tomorrow', $searchModel->timestampTo); $query = Window::find()->select(['title'])->joinWith('records')->distinct(true)->orderBy('title'); StatsHelper::whereFromTo($query, $from, $to); $titles = $query->createCommand()->queryColumn(); $titles = array_filter($titles, function ($a) { return trim($a) != ''; }); $clusters = ClusterHelper::clusterizeStrings($titles); $clustersList = array_map(function ($a) { return ['id' => $a, 'name' => $a]; }, array_unique(array_values($clusters))); $this->view->registerJs('var dashboardClusters = ' . json_encode($clustersList), View::POS_HEAD); $durations = ClusterHelper::getProcessWindowHierarchy($clusters, $from, $to); $this->view->registerJs('var dashboardClustersDurations = ' . json_encode($durations), View::POS_HEAD); $this->view->registerAssetBundle(SunburstAsset::className()); }