-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconstraints_pre-import.sql
149 lines (135 loc) · 4.43 KB
/
constraints_pre-import.sql
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
-- In susc_results, one of fold_cmp/fold or resistance_level should not be NULL
ALTER TABLE susc_results
ADD CONSTRAINT chk_fold_resistance_level CHECK (
(
-- case 1, fold_cmp/fold are presented
fold_cmp IS NOT NULL AND
fold IS NOT NULL AND
resistance_level IS NULL
) OR
(
-- case 2, resistance_level is presented
fold_cmp IS NULL AND
fold IS NULL AND
resistance_level IS NOT NULL
)
);
-- In rx_potency, potency must be greater than 0
CREATE FUNCTION checkPotencyNonzero(
potency NUMERIC(10,3),
ref_name VARCHAR,
rx_name VARCHAR,
iso_name VARCHAR,
potency_type VARCHAR,
lower_limit NUMERIC(10,3),
upper_limit NUMERIC(10,3)
) RETURNS BOOLEAN
AS
$$
DECLARE
lim NUMERIC(10,3);
msg VARCHAR;
BEGIN
IF potency > 0 THEN
RETURN TRUE;
END IF;
lim := lower_limit;
msg := FORMAT('(potency_lower_limit for %s)', potency_type);
IF potency_type LIKE 'IC%' THEN
lim := upper_limit;
msg := FORMAT('(potency_upper_limit for %s)', potency_type);
END IF;
RAISE EXCEPTION E'rx_potency.potency must be greater than 0 (ref_name=\x1b[1m%\x1b[0m rx_name=\x1b[1m%\x1b[0m iso_name=\x1b[1m%\x1b[0m potency=\x1b[1m%\x1b[0m); consider changing it to \x1b[1m%\x1b[0m %', ref_name, rx_name, iso_name, potency, lim, msg;
END;
$$ LANGUAGE PLPGSQL IMMUTABLE;
ALTER TABLE rx_potency
ADD CONSTRAINT chk_potency_nonzero CHECK (checkPotencyNonzero(potency, ref_name, rx_name, iso_name, potency_type::text, potency_lower_limit, potency_upper_limit));
ALTER TABLE rx_potency
ADD CONSTRAINT chk_potency_limit_and_unit CHECK (
(
-- case 1
potency_type IN ('NT50', 'NT80', 'NT90', 'NT100') AND
potency_lower_limit IS NOT NULL AND
potency_unit IS NULL
) OR
(
-- case 2
potency_type IN ('IC50', 'IC80', 'IC90', 'IC100', 'EC50', 'EC90', 'RC50') AND
potency_upper_limit IS NOT NULL AND
potency_unit IN ('ng/ml', 'µM', 'pM', 'nM', 'IU/ml')
) OR
(
-- case 3
potency_type IN ('NC20', 'NC') AND
potency_lower_limit IS NOT NULL AND
potency_unit = 'percent'
) OR
(
-- case 4
potency_type = 'Ki' AND
potency_unit IN ('ng/ml', 'µM', 'pM', 'nM', 'IU/ml')
) OR
(
-- case 5
potency_type = 'Kcat/Km' AND
potency_lower_limit IS NULL AND
potency_upper_limit IS NULL AND
potency_unit IN ('s⁻¹µM⁻¹', 's⁻¹M⁻¹', 'min⁻¹µM⁻¹', 'min⁻¹M⁻¹')
)
);
-- In subject_vaccines, infection_date of later dose must be later than eariler dose
CREATE FUNCTION checkVaccineDosageOrder(
rname VARCHAR,
sname VARCHAR,
dose INT,
vacc_date DATE
) RETURNS BOOLEAN
AS $$
SELECT NOT EXISTS (
SELECT 1 FROM subject_vaccines
WHERE rname = ref_name AND sname = subject_name AND (
(dose > dosage AND vacc_date <= vaccination_date) OR
(dose < dosage AND vacc_date >= vaccination_date)
)
)
$$ LANGUAGE SQL;
ALTER TABLE subject_vaccines
ADD CONSTRAINT chk_vaccine_dosage_order CHECK (checkVaccineDosageOrder(ref_name, subject_name, dosage, vaccination_date));
-- In subject_treatments, start date must be not greater than end date
ALTER TABLE subject_treatments
ADD CONSTRAINT chk_sbjrx_time_range CHECK (
start_date <= end_date
);
CREATE FUNCTION hasPreviousInfection(rname varchar, sname varchar, event_date date) RETURNS boolean AS $$
SELECT EXISTS (
SELECT 1 FROM subject_infections
WHERE rname = ref_name AND sname = subject_name AND event_date >= infection_date
)
$$ LANGUAGE SQL;
CREATE FUNCTION hasPreviousVaccine(rname varchar, sname varchar, event_date date) RETURNS boolean AS $$
SELECT EXISTS (
SELECT 1 FROM subject_vaccines
WHERE rname = ref_name AND sname = subject_name AND event_date >= vaccination_date
)
$$ LANGUAGE SQL;
ALTER TABLE subject_plasma
ADD CONSTRAINT chk_previous_infection_or_vaccine CHECK (
hasPreviousInfection(ref_name, subject_name, collection_date) OR
hasPreviousVaccine(ref_name, subject_name, collection_date)
);
ALTER TABLE subject_isolates
ADD CONSTRAINT chk_previous_infection CHECK (
hasPreviousInfection(ref_name, subject_name, collection_date)
);
ALTER TABLE isolates
ADD CONSTRAINT no_private_var_name CHECK (
var_name NOT LIKE '\_%'
);
ALTER TABLE subject_infections
ADD CONSTRAINT no_private_infected_var_name CHECK (
infected_var_name NOT LIKE '\_%'
);
ALTER TABLE dms_escape_results
ADD CONSTRAINT max_escape_score_is_one CHECK (
escape_score <= 1
)