ff5766b798f4f51e688debc441e44507f455ca9f
[WebKit-https.git] / Websites / perf.webkit.org / public / api / runs.php
1 <?php
2
3 require('../include/json-header.php');
4
5 $paths = array_key_exists('PATH_INFO', $_SERVER) ? explode('/', trim($_SERVER['PATH_INFO'], '/')) : array();
6
7 if (count($paths) != 1)
8     exit_with_error('InvalidRequest');
9
10 $parts = explode('-', $paths[0]);
11 if (count($parts) != 2)
12     exit_with_error('InvalidRequest');
13
14 $db = new Database;
15 if (!$db->connect())
16     exit_with_error('DatabaseConnectionFailure');
17
18 $platform_id = intval($parts[0]);
19 $metric_id = intval($parts[1]);
20 $config_rows = $db->query_and_fetch_all('SELECT config_id, config_type, config_platform, config_metric
21     FROM test_configurations WHERE config_metric = $1 AND config_platform = $2', array($metric_id, $platform_id));
22 if (!$config_rows)
23     exit_with_error('ConfigurationNotFound');
24
25 $repository_id_to_name = array();
26 if ($repository_table = $db->fetch_table('repositories')) {
27     foreach ($repository_table as $repository)
28         $repository_id_to_name[$repository['repository_id']] = $repository['repository_name'];
29 }
30
31 function fetch_runs_for_config($db, $config) {
32     $raw_runs = $db->query_and_fetch_all('
33         SELECT test_runs.*, builds.*, array_agg((commit_repository, commit_revision, commit_time)) AS revisions
34             FROM builds LEFT OUTER JOIN build_commits ON commit_build = build_id
35                 LEFT OUTER JOIN commits ON build_commit = commit_id,
36                 (SELECT test_runs.*, array_agg((bug_tracker, bug_number)) AS bugs
37                     FROM test_runs LEFT OUTER JOIN bugs ON bug_run = run_id WHERE run_config = $1 GROUP BY run_id) as test_runs
38                 WHERE run_build = build_id
39                 GROUP BY run_id, run_config, run_build, run_mean_cache, run_iteration_count_cache,
40                     run_sum_cache, run_square_sum_cache, bugs, build_id', array($config['config_id']));
41
42     $formatted_runs = array();
43     if (!$raw_runs)
44         return $formatted_runs;
45
46     foreach ($raw_runs as $run)
47         array_push($formatted_runs, format_run($run));
48
49     return $formatted_runs;
50 }
51
52 date_default_timezone_set('UTC');
53 function parse_revisions_array($postgres_array) {
54     global $repository_id_to_name;
55
56     // e.g. {"(WebKit,131456,\"2012-10-16 14:53:00\")","(Chromium,162004,)"}
57     $outer_array = json_decode('[' . trim($postgres_array, '{}') . ']');
58     $revisions = array();
59     foreach ($outer_array as $item) {
60         $name_and_revision = explode(',', trim($item, '()'));
61         if (!$name_and_revision[0])
62             continue;
63         $time = strtotime(trim($name_and_revision[2], '"')) * 1000;
64         $revisions[$repository_id_to_name[trim($name_and_revision[0], '"')]] = array(trim($name_and_revision[1], '"'), $time);
65     }
66     return $revisions;
67 }
68
69 function parse_bugs_array($postgres_array) {
70     // e.g. {"(1 /* Bugzilla */, 12345)","(2 /* Radar */, 67890)"}
71     $outer_array = json_decode('[' . trim($postgres_array, '{}') . ']');
72     $bugs = array();
73     foreach ($outer_array as $item) {
74         $raw_data = explode(',', trim($item, '()'));
75         if (!$raw_data[0])
76             continue;
77         $bugs[trim($raw_data[0], '"')] = trim($raw_data[1], '"');
78     }
79     return $bugs;
80 }
81
82 function format_run($run) {
83     return array(
84         'id' => intval($run['run_id']),
85         'mean' => floatval($run['run_mean_cache']),
86         'iterationCount' => intval($run['run_iteration_count_cache']),
87         'sum' => floatval($run['run_sum_cache']),
88         'squareSum' => floatval($run['run_square_sum_cache']),
89         'revisions' => parse_revisions_array($run['revisions']),
90         'bugs' => parse_bugs_array($run['bugs']),
91         'buildTime' => strtotime($run['build_time']) * 1000,
92         'buildNumber' => intval($run['build_number']),
93         'builder' => $run['build_builder']);
94 }
95
96 $results = array();
97 foreach ($config_rows as $config) {
98     if ($runs = fetch_runs_for_config($db, $config))
99         $results[$config['config_type']] = $runs;
100 }
101
102 exit_with_success($results);
103
104 ?>