3 class ManifestGenerator {
7 // FIXME: Compute this value from config.json
8 const MANIFEST_PATH = '../data/manifest.json';
10 function __construct($db) {
15 $start_time = microtime(true);
17 $config_table = $this->db->fetch_table('test_configurations');
18 $platform_table = $this->db->fetch_table('platforms');
19 $repositories_table = $this->db->fetch_table('repositories');
21 $repositories_with_commit = $this->db->query_and_fetch_all(
22 'SELECT DISTINCT(commit_repository) FROM commits WHERE commit_reported IS TRUE');
23 if (!$repositories_with_commit)
24 $repositories_with_commit = array();
26 foreach ($repositories_with_commit as &$row)
27 $row = $row['commit_repository'];
29 $this->manifest = array(
30 'tests' => $this->tests(),
31 'metrics' => $this->metrics(),
32 'all' => $this->platforms($config_table, $platform_table, false),
33 'dashboard' => $this->platforms($config_table, $platform_table, true),
34 'repositories' => $this->repositories($repositories_table, $repositories_with_commit),
35 'builders' => $this->builders(),
36 'bugTrackers' => $this->bug_trackers($repositories_table),
37 'dashboards' => config('dashboards'),
40 $this->manifest['elapsedTime'] = (microtime(true) - $start_time) * 1000;
46 return generate_data_file('manifest.json', json_encode($this->manifest));
49 private function tests() {
51 $tests_table = $this->db->fetch_table('tests');
54 foreach ($tests_table as $test_row) {
55 $tests[$test_row['test_id']] = array(
56 'name' => $test_row['test_name'],
57 'url' => $test_row['test_url'],
58 'parentId' => $test_row['test_parent'],
64 private function metrics() {
66 $metrics_table = $this->db->query_and_fetch_all('SELECT * FROM test_metrics LEFT JOIN aggregators ON metric_aggregator = aggregator_id');
69 foreach ($metrics_table as $row) {
70 $metrics[$row['metric_id']] = array(
71 'name' => $row['metric_name'],
72 'test' => $row['metric_test'],
73 'aggregator' => $row['aggregator_name']);
78 private function platforms($config_table, $platform_table, $is_dashboard) {
79 $platform_metrics = array();
81 foreach ($config_table as $config_row) {
82 if ($is_dashboard && !$this->db->is_true($config_row['config_is_in_dashboard']))
85 $new_last_modified = array_get($config_row, 'config_runs_last_modified', 0);
86 if ($new_last_modified)
87 $new_last_modified = strtotime($config_row['config_runs_last_modified']) * 1000;
89 $platform = &array_ensure_item_has_array($platform_metrics, $config_row['config_platform']);
90 $metrics = &array_ensure_item_has_array($platform, 'metrics');
91 $last_modified = &array_ensure_item_has_array($platform, 'last_modified');
93 $metric_id = $config_row['config_metric'];
94 $index = array_search($metric_id, $metrics);
95 if ($index === FALSE) {
96 array_push($metrics, $metric_id);
97 array_push($last_modified, $new_last_modified);
99 $last_modified[$index] = max($last_modified[$index], $new_last_modified);
102 $configurations = array();
104 $platforms = array();
105 if ($platform_table) {
106 foreach ($platform_table as $platform_row) {
107 if ($this->db->is_true($platform_row['platform_hidden']))
109 $id = $platform_row['platform_id'];
110 if (array_key_exists($id, $platform_metrics)) {
111 $platforms[$id] = array(
112 'name' => $platform_row['platform_name'],
113 'metrics' => $platform_metrics[$id]['metrics'],
114 'lastModified' => $platform_metrics[$id]['last_modified']);
121 private function repositories($repositories_table, $repositories_with_commit) {
122 $repositories = array();
123 if (!$repositories_table)
124 return $repositories;
125 foreach ($repositories_table as $row) {
126 $repositories[$row['repository_id']] = array(
127 'name' => $row['repository_name'],
128 'url' => $row['repository_url'],
129 'blameUrl' => $row['repository_blame_url'],
130 'hasReportedCommits' => in_array($row['repository_id'], $repositories_with_commit));
133 return $repositories;
136 private function builders() {
137 $builders_table = $this->db->fetch_table('builders');
138 if (!$builders_table)
141 foreach ($builders_table as $row)
142 $builders[$row['builder_id']] = array('name' => $row['builder_name'], 'buildUrl' => $row['builder_build_url']);
147 private function bug_trackers($repositories_table) {
148 $tracker_id_to_repositories = array();
149 $tracker_repositories_table = $this->db->fetch_table('tracker_repositories');
150 if ($tracker_repositories_table) {
151 foreach ($tracker_repositories_table as $row) {
152 array_push(array_ensure_item_has_array($tracker_id_to_repositories, $row['tracrepo_tracker']),
153 $row['tracrepo_repository']);
157 $bug_trackers = array();
158 $bug_trackers_table = $this->db->fetch_table('bug_trackers');
159 if ($bug_trackers_table) {
160 foreach ($bug_trackers_table as $row) {
161 $bug_trackers[$row['tracker_id']] = array(
162 'name' => $row['tracker_name'],
163 'bugUrl' => $row['tracker_bug_url'],
164 'newBugUrl' => $row['tracker_new_bug_url'],
165 'repositories' => $tracker_id_to_repositories[$row['tracker_id']]);
169 return $bug_trackers;