Refactoring: Pull all fullscreen code out of Document and into its own helper class
[WebKit-https.git] / Websites / perf.webkit.org / init-database.sql
1 DROP TABLE IF EXISTS run_iterations CASCADE;
2 DROP TABLE IF EXISTS test_runs CASCADE;
3 DROP TABLE IF EXISTS test_configurations CASCADE;
4 DROP TYPE IF EXISTS test_configuration_type CASCADE;
5 DROP TABLE IF EXISTS aggregators CASCADE;
6 DROP TABLE IF EXISTS builds CASCADE;
7 DROP TABLE IF EXISTS committers CASCADE;
8 DROP TABLE IF EXISTS commits CASCADE;
9 DROP TABLE IF EXISTS build_commits CASCADE;
10 DROP TABLE IF EXISTS commit_ownerships CASCADE;
11 DROP TABLE IF EXISTS build_slaves CASCADE;
12 DROP TABLE IF EXISTS builders CASCADE;
13 DROP TABLE IF EXISTS repositories CASCADE;
14 DROP TABLE IF EXISTS platforms CASCADE;
15 DROP TABLE IF EXISTS test_metrics CASCADE;
16 DROP TABLE IF EXISTS tests CASCADE;
17 DROP TABLE IF EXISTS reports CASCADE;
18 DROP TABLE IF EXISTS tracker_repositories CASCADE;
19 DROP TABLE IF EXISTS bug_trackers CASCADE;
20 DROP TABLE IF EXISTS task_commits CASCADE;
21 DROP TABLE IF EXISTS analysis_tasks CASCADE;
22 DROP TABLE IF EXISTS analysis_strategies CASCADE;
23 DROP TYPE IF EXISTS analysis_task_result_type CASCADE;
24 DROP TABLE IF EXISTS build_triggerables CASCADE;
25 DROP TABLE IF EXISTS triggerable_configurations CASCADE;
26 DROP TABLE IF EXISTS triggerable_repository_groups CASCADE;
27 DROP TABLE IF EXISTS triggerable_repositories CASCADE;
28 DROP TABLE IF EXISTS uploaded_files CASCADE;
29 DROP TABLE IF EXISTS bugs CASCADE;
30 DROP TABLE IF EXISTS analysis_test_groups CASCADE;
31 DROP TABLE IF EXISTS commit_sets CASCADE;
32 DROP TABLE IF EXISTS commit_set_items CASCADE;
33 DROP TABLE IF EXISTS build_requests CASCADE;
34 DROP TYPE IF EXISTS build_request_status_type CASCADE;
35
36
37 CREATE TABLE platforms (
38     platform_id serial PRIMARY KEY,
39     platform_name varchar(64) NOT NULL,
40     platform_hidden boolean NOT NULL DEFAULT FALSE);
41
42 CREATE TABLE repositories (
43     repository_id serial PRIMARY KEY,
44     repository_owner integer REFERENCES repositories ON DELETE CASCADE,
45     repository_name varchar(64) NOT NULL,
46     repository_url varchar(1024),
47     repository_blame_url varchar(1024));
48
49 CREATE UNIQUE INDEX repository_name_owner_unique_index ON repositories (repository_owner, repository_name)
50     WHERE repository_owner IS NOT NULL;
51 CREATE UNIQUE INDEX repository_name_unique_index ON repositories (repository_name)
52     WHERE repository_owner IS NULL;
53
54 CREATE TABLE bug_trackers (
55     tracker_id serial PRIMARY KEY,
56     tracker_name varchar(64) NOT NULL,
57     tracker_bug_url varchar(1024),
58     tracker_new_bug_url varchar(1024));
59
60 CREATE TABLE tracker_repositories (
61     tracrepo_tracker integer NOT NULL REFERENCES bug_trackers ON DELETE CASCADE,
62     tracrepo_repository integer NOT NULL REFERENCES repositories ON DELETE CASCADE);
63
64 CREATE TABLE builders (
65     builder_id serial PRIMARY KEY,
66     builder_name varchar(256) NOT NULL UNIQUE,
67     builder_password_hash character(64),
68     builder_build_url varchar(1024));
69
70 CREATE TABLE build_slaves (
71     slave_id serial PRIMARY KEY,
72     slave_name varchar(64) NOT NULL UNIQUE,
73     slave_password_hash character(64));
74
75 CREATE TABLE builds (
76     build_id serial PRIMARY KEY,
77     build_builder integer REFERENCES builders ON DELETE CASCADE,
78     build_slave integer REFERENCES build_slaves ON DELETE CASCADE,
79     build_number integer NOT NULL,
80     build_time timestamp NOT NULL,
81     build_latest_revision timestamp,
82     CONSTRAINT builder_build_time_tuple_must_be_unique UNIQUE(build_builder, build_number, build_time));
83 CREATE INDEX build_builder_index ON builds(build_builder);
84
85 CREATE TABLE committers (
86     committer_id serial PRIMARY KEY,
87     committer_repository integer NOT NULL REFERENCES repositories ON DELETE CASCADE,
88     committer_account varchar(320) NOT NULL,
89     committer_name varchar(128),
90     CONSTRAINT committer_in_repository_must_be_unique UNIQUE(committer_repository, committer_account));
91 CREATE INDEX committer_account_index ON committers(committer_account);
92 CREATE INDEX committer_name_index ON committers(committer_name);
93
94 CREATE TABLE commits (
95     commit_id serial PRIMARY KEY,
96     commit_repository integer NOT NULL REFERENCES repositories ON DELETE CASCADE,
97     commit_revision varchar(64) NOT NULL,
98     commit_previous_commit integer REFERENCES commits ON DELETE CASCADE,
99     commit_time timestamp,
100     commit_order integer,
101     commit_committer integer REFERENCES committers ON DELETE CASCADE,
102     commit_message text,
103     commit_reported boolean NOT NULL DEFAULT FALSE,
104     commit_testability varchar(128) DEFAULT NULL,
105     CONSTRAINT commit_in_repository_must_be_unique UNIQUE(commit_repository, commit_revision));
106 CREATE INDEX commit_time_index ON commits(commit_time);
107 CREATE INDEX commit_order_index ON commits(commit_order);
108
109 CREATE TABLE commit_ownerships (
110     commit_owner integer NOT NULL REFERENCES commits ON DELETE CASCADE,
111     commit_owned integer NOT NULL REFERENCES commits ON DELETE CASCADE,
112     PRIMARY KEY (commit_owner, commit_owned)
113 );
114
115 CREATE TABLE build_commits (
116     commit_build integer NOT NULL REFERENCES builds ON DELETE CASCADE,
117     build_commit integer NOT NULL REFERENCES commits ON DELETE CASCADE,
118     PRIMARY KEY (commit_build, build_commit));
119
120 CREATE TABLE aggregators (
121     aggregator_id serial PRIMARY KEY,
122     aggregator_name varchar(64),
123     aggregator_definition text);
124
125 CREATE TABLE tests (
126     test_id serial PRIMARY KEY,
127     test_name varchar(255) NOT NULL,
128     test_parent integer REFERENCES tests ON DELETE CASCADE,
129     test_url varchar(1024) DEFAULT NULL,
130     CONSTRAINT parent_test_must_be_unique UNIQUE(test_parent, test_name));
131
132 CREATE TABLE test_metrics (
133     metric_id serial PRIMARY KEY,
134     metric_test integer NOT NULL REFERENCES tests ON DELETE CASCADE,
135     metric_name varchar(64) NOT NULL,
136     metric_aggregator integer REFERENCES aggregators ON DELETE CASCADE);
137
138 CREATE TYPE test_configuration_type as ENUM ('current', 'baseline', 'target');
139 CREATE TABLE test_configurations (
140     config_id serial PRIMARY KEY,
141     config_metric integer NOT NULL REFERENCES test_metrics ON DELETE CASCADE,
142     config_platform integer NOT NULL REFERENCES platforms ON DELETE CASCADE,
143     config_type test_configuration_type NOT NULL,
144     config_is_in_dashboard boolean NOT NULL DEFAULT FALSE,
145     config_runs_last_modified timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC'),
146     CONSTRAINT configuration_must_be_unique UNIQUE(config_metric, config_platform, config_type));
147 CREATE INDEX config_platform_index ON test_configurations(config_platform);
148
149 CREATE TABLE test_runs (
150     run_id serial PRIMARY KEY,
151     run_config integer NOT NULL REFERENCES test_configurations ON DELETE CASCADE,
152     run_build integer NOT NULL REFERENCES builds ON DELETE CASCADE,
153     run_iteration_count_cache smallint,
154     run_mean_cache double precision,
155     run_sum_cache double precision,
156     run_square_sum_cache double precision,
157     run_marked_outlier boolean NOT NULL DEFAULT FALSE,
158     CONSTRAINT test_config_build_must_be_unique UNIQUE(run_config, run_build));
159 CREATE INDEX run_config_index ON test_runs(run_config);
160 CREATE INDEX run_build_index ON test_runs(run_build);
161
162 CREATE TABLE run_iterations (
163     iteration_run integer NOT NULL REFERENCES test_runs ON DELETE CASCADE,
164     iteration_order smallint NOT NULL CHECK(iteration_order >= 0),
165     iteration_group smallint CHECK(iteration_group >= 0),
166     iteration_value double precision,
167     iteration_relative_time float,
168     PRIMARY KEY (iteration_run, iteration_order));
169
170 CREATE OR REPLACE FUNCTION update_config_last_modified() RETURNS TRIGGER AS $update_config_last_modified$
171     BEGIN
172         IF TG_OP != 'DELETE' THEN
173             UPDATE test_configurations SET config_runs_last_modified = (CURRENT_TIMESTAMP AT TIME ZONE 'UTC') WHERE config_id = NEW.run_config;
174         ELSE
175             UPDATE test_configurations SET config_runs_last_modified = (CURRENT_TIMESTAMP AT TIME ZONE 'UTC') WHERE config_id = OLD.run_config;
176         END IF;
177         RETURN NULL;
178     END;
179 $update_config_last_modified$ LANGUAGE plpgsql;
180
181 CREATE TRIGGER update_config_last_modified AFTER INSERT OR UPDATE OR DELETE ON test_runs
182     FOR EACH ROW EXECUTE PROCEDURE update_config_last_modified();
183
184 CREATE TABLE reports (
185     report_id serial PRIMARY KEY,
186     report_builder integer NOT NULL REFERENCES builders ON DELETE RESTRICT,
187     report_slave integer REFERENCES build_slaves ON DELETE RESTRICT,
188     report_build_number integer,
189     report_build integer REFERENCES builds,
190     report_created_at timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC'),
191     report_committed_at timestamp,
192     report_content text,
193     report_failure varchar(64),
194     report_failure_details text);
195
196 CREATE TABLE analysis_strategies (
197     strategy_id serial PRIMARY KEY,
198     strategy_name varchar(64) NOT NULL);
199
200 CREATE TYPE analysis_task_result_type as ENUM ('progression', 'regression', 'unchanged', 'inconclusive');
201 CREATE TABLE analysis_tasks (
202     task_id serial PRIMARY KEY,
203     task_name varchar(256) NOT NULL,
204     task_author varchar(256),
205     task_segmentation integer REFERENCES analysis_strategies,
206     task_test_range integer REFERENCES analysis_strategies,
207     task_created_at timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC'),
208     task_platform integer REFERENCES platforms,
209     task_metric integer REFERENCES test_metrics,
210     task_start_run integer REFERENCES test_runs,
211     task_start_run_time timestamp,
212     task_end_run integer REFERENCES test_runs,
213     task_end_run_time timestamp,
214     task_result analysis_task_result_type,
215     task_needed boolean,
216     CONSTRAINT analysis_task_should_be_unique_for_range UNIQUE(task_start_run, task_end_run),
217     CONSTRAINT analysis_task_must_be_associated_with_run_or_be_custom
218         CHECK ((task_start_run IS NULL AND task_start_run_time IS NULL
219                 AND task_end_run IS NULL AND task_end_run_time IS NULL
220                 AND task_platform IS NULL AND task_metric IS NULL)
221             OR (task_start_run IS NOT NULL AND task_start_run_time IS NOT NULL
222                 AND task_end_run IS NOT NULL AND task_end_run_time IS NOT NULL
223                 AND task_platform IS NOT NULL AND task_metric IS NOT NULL)));
224
225 CREATE TABLE task_commits (
226     taskcommit_task integer NOT NULL REFERENCES analysis_tasks ON DELETE CASCADE,
227     taskcommit_commit integer NOT NULL REFERENCES commits ON DELETE CASCADE,
228     taskcommit_is_fix boolean NOT NULL,
229     CONSTRAINT task_commit_must_be_unique UNIQUE(taskcommit_task, taskcommit_commit));
230
231 CREATE TABLE bugs (
232     bug_id serial PRIMARY KEY,
233     bug_task integer REFERENCES analysis_tasks NOT NULL,
234     bug_tracker integer REFERENCES bug_trackers NOT NULL,
235     bug_number integer NOT NULL);
236
237 CREATE TABLE build_triggerables (
238     triggerable_id serial PRIMARY KEY,
239     triggerable_name varchar(64) NOT NULL UNIQUE,
240     triggerable_disabled boolean NOT NULL DEFAULT FALSE);
241
242 CREATE TABLE triggerable_repository_groups (
243     repositorygroup_id serial PRIMARY KEY,
244     repositorygroup_triggerable integer REFERENCES build_triggerables NOT NULL,
245     repositorygroup_name varchar(256) NOT NULL,
246     repositorygroup_description varchar(256),
247     repositorygroup_accepts_roots boolean NOT NULL DEFAULT FALSE,
248     repositorygroup_hidden boolean NOT NULL DEFAULT FALSE,
249     CONSTRAINT repository_group_name_must_be_unique_for_triggerable UNIQUE(repositorygroup_triggerable, repositorygroup_name));
250
251 CREATE TABLE triggerable_repositories (
252     trigrepo_repository integer REFERENCES repositories NOT NULL,
253     trigrepo_group integer REFERENCES triggerable_repository_groups NOT NULL,
254     trigrepo_accepts_patch boolean NOT NULL DEFAULT FALSE,
255     CONSTRAINT repository_must_be_unique_for_repository_group UNIQUE(trigrepo_repository, trigrepo_group));
256
257 CREATE TABLE triggerable_configurations (
258     trigconfig_test integer REFERENCES tests NOT NULL,
259     trigconfig_platform integer REFERENCES platforms NOT NULL,
260     trigconfig_triggerable integer REFERENCES build_triggerables NOT NULL,
261     CONSTRAINT triggerable_must_be_unique_for_test_and_platform UNIQUE(trigconfig_test, trigconfig_platform));
262
263 CREATE TABLE uploaded_files (
264     file_id serial PRIMARY KEY,
265     file_created_at timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC'),
266     file_deleted_at timestamp,
267     file_mime varchar(64),
268     file_filename varchar(1024) NOT NULL,
269     file_extension varchar(16),
270     file_author varchar(256),
271     file_size bigint NOT NULL,
272     file_sha256 char(64) NOT NULL);
273 CREATE INDEX file_author_index ON uploaded_files(file_author);
274 CREATE UNIQUE INDEX file_sha256_index ON uploaded_files(file_sha256) WHERE file_deleted_at is NULL;
275
276 CREATE TABLE analysis_test_groups (
277     testgroup_id serial PRIMARY KEY,
278     testgroup_task integer REFERENCES analysis_tasks NOT NULL,
279     testgroup_name varchar(256),
280     testgroup_author varchar(256),
281     testgroup_created_at timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC'),
282     testgroup_hidden boolean NOT NULL DEFAULT FALSE,
283     testgroup_needs_notification boolean NOT NULL DEFAULT FALSE,
284     testgroup_notification_sent_at timestamp DEFAULT NULL,
285     testgroup_initial_repetition_count integer NOT NULL,
286     testgroup_may_need_more_requests boolean DEFAULT FALSE,
287     CONSTRAINT testgroup_name_must_be_unique_for_each_task UNIQUE(testgroup_task, testgroup_name));
288 CREATE INDEX testgroup_task_index ON analysis_test_groups(testgroup_task);
289
290 CREATE TABLE commit_sets (
291     commitset_id serial PRIMARY KEY);
292
293 CREATE TABLE commit_set_items (
294     commitset_set integer REFERENCES commit_sets NOT NULL,
295     commitset_commit integer REFERENCES commits,
296     commitset_commit_owner integer REFERENCES commits DEFAULT NULL,
297     commitset_patch_file integer REFERENCES uploaded_files,
298     commitset_root_file integer REFERENCES uploaded_files,
299     commitset_requires_build boolean DEFAULT FALSE,
300     CONSTRAINT commitset_must_have_commit_or_root CHECK (commitset_commit IS NOT NULL OR commitset_root_file IS NOT NULL),
301     CONSTRAINT commitset_with_patch_must_have_commit CHECK (commitset_patch_file IS NULL OR commitset_commit IS NOT NULL),
302     CONSTRAINT commitset_item_with_patch_must_requires_build CHECK (commitset_patch_file IS NULL OR commitset_requires_build = TRUE),
303     CONSTRAINT commitset_item_with_owned_commit_must_requires_build CHECK (commitset_commit_owner IS NULL OR commitset_requires_build = TRUE));
304
305 CREATE TYPE build_request_status_type as ENUM ('pending', 'scheduled', 'running', 'failed', 'completed', 'canceled');
306 CREATE TABLE build_requests (
307     request_id serial PRIMARY KEY,
308     request_triggerable integer REFERENCES build_triggerables NOT NULL,
309     request_repository_group integer REFERENCES triggerable_repository_groups,
310     request_platform integer REFERENCES platforms NOT NULL,
311     request_test integer REFERENCES tests,
312     request_group integer REFERENCES analysis_test_groups NOT NULL,
313     request_order integer NOT NULL,
314     request_commit_set integer REFERENCES commit_sets NOT NULL,
315     request_status build_request_status_type NOT NULL DEFAULT 'pending',
316     request_url varchar(1024),
317     request_build integer REFERENCES builds,
318     request_created_at timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC'),
319     CONSTRAINT build_request_order_must_be_unique_in_group UNIQUE(request_group, request_order),
320     CONSTRAINT build_request_order_must_be_positive_for_testing
321         CHECK ((request_test IS NOT NULL AND request_order >= 0) OR (request_test IS NULL AND request_order < 0)));
322 CREATE INDEX build_request_triggerable ON build_requests(request_triggerable);
323 CREATE INDEX build_request_build ON build_requests(request_build);