3 require('../include/json-header.php');
5 function fetch_runs_for_config_and_test_group($db, $config, $test_group_id) {
6 return $db->query_and_fetch_all('
7 SELECT test_runs.*, builds.*, array_agg((commit_repository, commit_revision, commit_time)) AS revisions
9 LEFT OUTER JOIN build_commits ON commit_build = build_id
10 LEFT OUTER JOIN commits ON build_commit = commit_id,
11 test_runs, build_requests, analysis_test_groups
12 WHERE run_build = build_id AND run_config = $1 AND request_build = build_id AND request_group = $2
13 GROUP BY build_id, run_id', array($config['config_id'], $test_group_id));
16 function fetch_runs_for_config($db, $config) {
17 return $db->query_and_fetch_all('
18 SELECT test_runs.*, builds.*, array_agg((commit_repository, commit_revision, commit_time)) AS revisions
20 LEFT OUTER JOIN build_commits ON commit_build = build_id
21 LEFT OUTER JOIN commits ON build_commit = commit_id, test_runs
22 WHERE run_build = build_id AND run_config = $1 AND NOT EXISTS (SELECT * FROM build_requests WHERE request_build = build_id)
23 GROUP BY build_id, run_id', array($config['config_id']));
26 function main($path) {
27 if (count($path) != 1)
28 exit_with_error('InvalidRequest');
30 $parts = explode('-', $path[0]);
31 if (count($parts) != 2)
32 exit_with_error('InvalidRequest');
36 exit_with_error('DatabaseConnectionFailure');
38 $platform_id = intval($parts[0]);
39 $metric_id = intval($parts[1]);
40 $config_rows = $db->query_and_fetch_all('SELECT *
41 FROM test_configurations WHERE config_metric = $1 AND config_platform = $2', array($metric_id, $platform_id));
43 exit_with_error('ConfigurationNotFound');
45 $test_group_id = array_get($_GET, 'testGroup');
46 $should_cache = array_get($_GET, 'cache');
48 $test_group_id = intval($test_group_id);
49 else if ($should_cache) { // Only v1 UI needs caching.
50 $maxage = config('jsonCacheMaxAge');
51 header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $maxage) . ' GMT');
52 header("Cache-Control: maxage=$maxage");
55 $generator = new RunsGenerator($config_rows);
57 foreach ($config_rows as $config) {
59 $raw_runs = fetch_runs_for_config_and_test_group($db, $config, $test_group_id);
61 $raw_runs = fetch_runs_for_config($db, $config);
62 $generator->add_runs($config['config_type'], $raw_runs);
65 $content = success_json($generator->results());
67 generate_data_file("$platform_id-$metric_id.json", $content);
72 function __construct($config_rows) {
73 $this->results = array();
74 $last_modified_times = array();
75 foreach ($config_rows as $row)
76 array_push($last_modified_times, Database::to_js_time($row['config_runs_last_modified']));
77 $this->last_modified = max($last_modified_times);
78 $this->start_time = microtime(true);
83 'configurations' => &$this->results,
84 'lastModified' => $this->last_modified,
85 'elapsedTime' => (microtime(true) - $this->start_time) * 1000);
88 function add_runs($name, $raw_runs) {
89 $formatted_runs = array();
91 foreach ($raw_runs as $run)
92 array_push($formatted_runs, self::format_run($run));
94 $this->results[$name] = $formatted_runs;
95 return $formatted_runs;
98 private static function format_run($run) {
100 'id' => intval($run['run_id']),
101 'mean' => floatval($run['run_mean_cache']),
102 'iterationCount' => intval($run['run_iteration_count_cache']),
103 'sum' => floatval($run['run_sum_cache']),
104 'squareSum' => floatval($run['run_square_sum_cache']),
105 'markedOutlier' => Database::is_true($run['run_marked_outlier']),
106 'revisions' => self::parse_revisions_array($run['revisions']),
107 'build' => $run['build_id'],
108 'buildTime' => Database::to_js_time($run['build_time']),
109 'buildNumber' => intval($run['build_number']),
110 'builder' => $run['build_builder']);
113 private static function parse_revisions_array($postgres_array) {
114 // e.g. {"(WebKit,131456,\"2012-10-16 14:53:00\")","(Chromium,162004,)"}
115 $outer_array = json_decode('[' . trim($postgres_array, '{}') . ']');
116 $revisions = array();
117 foreach ($outer_array as $item) {
118 $name_and_revision = explode(',', trim($item, '()'));
119 if (!$name_and_revision[0])
121 $time = Database::to_js_time(trim($name_and_revision[2], '"'));
122 $revisions[trim($name_and_revision[0], '"')] = array(trim($name_and_revision[1], '"'), $time);
128 main(array_key_exists('PATH_INFO', $_SERVER) ? explode('/', trim($_SERVER['PATH_INFO'], '/')) : array());