This repository was archived by the owner on Apr 3, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathset_up_db.sql
More file actions
268 lines (238 loc) · 7.57 KB
/
set_up_db.sql
File metadata and controls
268 lines (238 loc) · 7.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
-- noinspection SqlNoDataSourceInspectionForFile
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE TABLE IF NOT EXISTS projects (
created timestamp,
created_by varchar,
geom geometry,
image varchar,
is_featured boolean,
look_for varchar,
name varchar,
progress int,
project_details varchar,
project_id varchar,
project_type int,
required_results int,
result_count int,
status varchar,
verification_number int,
project_type_specifics json,
organization_name varchar,
PRIMARY KEY (project_id)
);
CREATE TABLE IF NOT EXISTS groups (
project_id varchar,
group_id varchar,
number_of_tasks int,
finished_count int,
required_count int,
progress int,
project_type_specifics json,
-- total_area & time_spent_max_allowed are maintaned and used by aggregated module
total_area float DEFAULT NULL,
time_spent_max_allowed float DEFAULT NULL,
PRIMARY KEY (project_id, group_id),
FOREIGN KEY (project_id) REFERENCES projects (project_id)
);
CREATE INDEX IF NOT EXISTS groups_projectid ON public.groups
USING btree (group_id);
CREATE INDEX IF NOT EXISTS groups_goupid ON public.groups
USING btree (project_id);
CREATE TABLE IF NOT EXISTS tasks (
project_id varchar,
group_id varchar,
task_id varchar,
geom geometry(Geometry, 4326),
project_type_specifics json,
PRIMARY KEY (project_id, group_id, task_id),
FOREIGN KEY (project_id) REFERENCES projects (project_id),
FOREIGN KEY (project_id, group_id) REFERENCES groups (project_id, group_id)
);
CREATE INDEX IF NOT EXISTS tasks_task_id ON public.tasks
USING btree (task_id);
CREATE INDEX IF NOT EXISTS tasks_groupid ON public.tasks
USING btree (group_id);
CREATE INDEX IF NOT EXISTS tasks_projectid ON public.tasks
USING btree (project_id);
CREATE TABLE IF NOT EXISTS users (
user_id varchar,
username varchar,
created timestamp,
updated_at timestamp,
PRIMARY KEY (user_id)
);
CREATE INDEX IF NOT EXISTS users_userid ON public.users
USING btree (user_id);
CREATE TABLE IF NOT EXISTS users_temp (
user_id varchar,
username varchar,
created timestamp,
updated_at timestamp
);
-- create table for results import through csv
CREATE TABLE IF NOT EXISTS results_temp (
project_id varchar,
group_id varchar,
user_id varchar,
task_id varchar,
"timestamp" timestamp,
start_time timestamp,
end_time timestamp,
result int,
app_version varchar,
client_type varchar,
ref jsonb
);
-- create table for results import through csv
CREATE TABLE IF NOT EXISTS results_geometry_temp (
project_id varchar,
group_id varchar,
user_id varchar,
task_id varchar,
"timestamp" timestamp,
start_time timestamp,
end_time timestamp,
result varchar,
app_version varchar,
client_type varchar,
ref jsonb
);
---- User Group Tables
CREATE TABLE IF NOT EXISTS user_groups (
user_group_id varchar,
name varchar,
description text,
is_archived boolean,
created_at timestamp,
archived_at timestamp,
created_by_id varchar,
archived_by_id varchar,
PRIMARY KEY (user_group_id),
FOREIGN KEY (created_by_id) REFERENCES users (user_id),
FOREIGN KEY (archived_by_id) REFERENCES users (user_id)
);
CREATE TABLE IF NOT EXISTS user_groups_temp (
user_group_id varchar,
name varchar,
description text,
is_archived boolean,
created_at timestamp,
archived_at timestamp,
created_by_id varchar,
archived_by_id varchar
);
CREATE TYPE membership_action AS ENUM ('join', 'leave');
CREATE TABLE IF NOT EXISTS user_groups_membership_logs (
membership_id varchar,
user_group_id varchar,
user_id varchar,
action MEMBERSHIP_ACTION,
"timestamp" timestamp,
FOREIGN KEY (user_id) REFERENCES users (user_id),
FOREIGN KEY (user_group_id) REFERENCES user_groups (user_group_id)
);
CREATE TABLE IF NOT EXISTS user_groups_membership_logs_temp (
membership_id varchar,
user_group_id varchar,
user_id varchar,
action MEMBERSHIP_ACTION,
"timestamp" timestamp
);
CREATE TABLE IF NOT EXISTS user_groups_user_memberships (
user_group_id varchar,
user_id varchar,
is_active boolean,
PRIMARY KEY (user_group_id, user_id),
FOREIGN KEY (user_id) REFERENCES users (user_id),
FOREIGN KEY (user_group_id) REFERENCES user_groups (user_group_id)
);
CREATE TABLE IF NOT EXISTS user_groups_user_memberships_temp (
user_group_id varchar,
user_id varchar
);
CREATE TABLE IF NOT EXISTS mapping_sessions (
project_id varchar,
group_id varchar,
user_id varchar,
mapping_session_id bigserial unique,
start_time timestamp DEFAULT NULL,
end_time timestamp DEFAULT NULL,
items_count int2 not null,
app_version varchar,
client_type varchar,
PRIMARY KEY (project_id, group_id, user_id),
FOREIGN KEY (project_id, group_id)
REFERENCES groups (project_id, group_id),
FOREIGN KEY (user_id)
REFERENCES users (user_id)
);
CREATE TABLE IF NOT EXISTS mapping_sessions_results (
mapping_session_id int8,
task_id varchar,
result int2 not null,
PRIMARY KEY (mapping_session_id, task_id),
FOREIGN KEY (mapping_session_id)
references mapping_sessions (mapping_session_id)
);
CREATE TABLE IF NOT EXISTS mapping_sessions_results_geometry (
mapping_session_id int8,
task_id varchar,
result geometry not null,
PRIMARY KEY (mapping_session_id, task_id),
FOREIGN KEY (mapping_session_id)
references mapping_sessions (mapping_session_id)
);
CREATE TABLE IF NOT EXISTS mapping_sessions_refs (
mapping_session_id int8,
task_id varchar,
ref JSONB not null,
PRIMARY KEY (mapping_session_id, task_id),
FOREIGN KEY (mapping_session_id)
references mapping_sessions (mapping_session_id)
);
CREATE OR REPLACE FUNCTION mapping_sessions_results_constraint() RETURNS trigger
LANGUAGE plpgsql AS
$$
DECLARE v mapping_sessions;
BEGIN
IF NOT EXISTS(
SELECT 1
FROM tasks
JOIN mapping_sessions ms
ON ms.mapping_session_id = NEW.mapping_session_id
WHERE tasks.task_id = NEW.task_id AND
tasks.group_id = ms.group_id AND
tasks.project_id = ms.project_id AND
ms.mapping_session_id = NEW.mapping_session_id
)
THEN
SELECT ms.project_id, ms.group_id, ms.user_id
FROM mapping_sessions ms
WHERE ms.mapping_session_id = NEW.mapping_session_id
INTO v;
RAISE EXCEPTION
'Tried to insert invalid result: Project: % Group: % Task: % - User: %', v.project_id, v.group_id, NEW.task_id, v.user_id
USING ERRCODE = '23503';
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER insert_mapping_sessions_results BEFORE INSERT ON mapping_sessions_results
FOR EACH ROW EXECUTE PROCEDURE mapping_sessions_results_constraint();
CREATE TRIGGER insert_mapping_sessions_results_geometry BEFORE INSERT ON mapping_sessions_results_geometry
FOR EACH ROW EXECUTE PROCEDURE mapping_sessions_results_constraint();
-- Used to group results by user groups
CREATE TABLE IF NOT EXISTS mapping_sessions_user_groups (
mapping_session_id int8,
user_group_id varchar, -- user group primary key
PRIMARY KEY (mapping_session_id, user_group_id),
FOREIGN KEY (mapping_session_id) REFERENCES mapping_sessions (mapping_session_id),
FOREIGN KEY (user_group_id) REFERENCES user_groups (user_group_id)
);
-- create table for user_group_results import through csv
CREATE TABLE IF NOT EXISTS results_user_groups_temp (
project_id varchar,
group_id varchar,
user_id varchar,
user_group_id varchar
);