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()); }
/** * Action for data * @param array $fields * @return array * @throws BadRequestHttpException */ public function actionData($fields = []) { Yii::$app->response->format = Response::FORMAT_JSON; $filter = new DateFilterForm(); $reply = []; if (Yii::$app->request->isPost && $filter->load(Yii::$app->request->bodyParams, '') && $filter->validate()) { $from = strtotime('today', $filter->date ? $filter->date : time()); $to = strtotime('tomorrow', $filter->date ? $filter->date : time()); $reply = ['processList' => StatsHelper::getProcessList($from, $to)]; if (empty($fields) || in_array('timeLine', $fields)) { $reply['timeLine'] = StatsHelper::timeline($from, $to); } if (empty($fields) || in_array('durationProcess', $fields)) { $reply['durationProcess'] = StatsHelper::getProcessWindowHierarchy($from, $to); } if (empty($fields) || in_array('durationTask', $fields)) { $reply['durationTask'] = StatsHelper::getTaskWindowHierarchy($from, $to); } if (empty($fields) || in_array('keys', $fields)) { $reply['keys'] = StatsHelper::keysActivity($from, $to); } if (empty($fields) || in_array('durationCluster', $fields)) { $clusterData = $this->clusterData($from, $to); $reply['clusterList'] = $clusterData['clusters']; $reply['durationCluster'] = $clusterData['durations']; } } else { throw new BadRequestHttpException(); } return $reply; }
public function actionTransitionMatrix() { $from = strtotime('today'); $to = strtotime('tomorrow'); $matrix = StatsHelper::transitionMatrix($from, $to); $windows = StatsHelper::windows($from, $to); $flattenMatrix = StatsHelper::flattenTransitionMatrix($matrix, $windows); foreach ($flattenMatrix as $key => $value) { echo $value['source'] . "\t" . $value['target'] . "\t" . $value['value'] . PHP_EOL; } }