Skip to content

Commit cc82ecd

Browse files
committed
Update migration script with stricter matching to OU, add assertion
1 parent 7358397 commit cc82ecd

1 file changed

Lines changed: 46 additions & 12 deletions

File tree

‎src/main/resources/db/migration/V006_002__migrate_sample_ou_ids.sql‎

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,58 @@ WITH
44
SELECT
55
id as sample_id,
66
additional_info ->> 'obsUnitID' AS bi_ou_id
7-
FROM sample
8-
WHERE additional_info ? 'obsUnitID'
7+
FROM sample
8+
WHERE additional_info ? 'obsUnitID'
9+
),
10+
exrefid_source_with_one_ou_connected AS (
11+
SELECT ex.external_reference_id, ex.external_reference_source, (array_agg(id))[1] AS exref_pk
12+
FROM external_reference ex
13+
JOIN observation_unit_external_references ouex ON ex.id = ouex.external_references_id
14+
WHERE ex.external_reference_source = 'breedinginsight.org/observationunits'
15+
GROUP BY ex.external_reference_id, ex.external_reference_source
16+
HAVING COUNT(*) = 1
917
),
1018
ou_ids_matched_on_samples AS (
1119
-- Now match the bi-generated exref ou ids to ex refs ids, and keep samples ids for matching in update
12-
SELECT
13-
ou.id AS ou_id,
14-
samples_and_bi_ou_ids.sample_id
15-
FROM observation_unit ou
16-
JOIN observation_unit_external_references ouex ON ou.id = ouex.observation_unit_entity_id
17-
JOIN external_reference ex ON ouex.external_references_id = ex.id
18-
JOIN samples_and_bi_ou_ids ON ex.external_reference_id = samples_and_bi_ou_ids.bi_ou_id
20+
SELECT
21+
ou.id AS ou_id,
22+
samples_and_bi_ou_ids.sample_id
23+
FROM observation_unit ou
24+
JOIN observation_unit_external_references ouex ON ou.id = ouex.observation_unit_entity_id
25+
JOIN exrefid_source_with_one_ou_connected on exrefid_source_with_one_ou_connected.exref_pk = ouex.external_references_id
26+
JOIN samples_and_bi_ou_ids ON exrefid_source_with_one_ou_connected.external_reference_id = samples_and_bi_ou_ids.bi_ou_id
1927
)
2028
UPDATE sample
2129
SET additional_info = jsonb_set(
2230
additional_info,
2331
'{obsUnitID}',
2432
to_jsonb(mos.ou_id)
25-
)
26-
FROM ou_ids_matched_on_samples mos
27-
WHERE id = mos.sample_id
33+
)
34+
FROM ou_ids_matched_on_samples mos
35+
WHERE id = mos.sample_id;
36+
37+
-- Assertion to ensure all samples with ou in additional info now relate to observation unit db id
38+
DO $$
39+
DECLARE
40+
samples_with_ou_count integer;
41+
samples_with_ous_matched_to_ou_count integer;
42+
BEGIN
43+
SELECT COUNT(*)
44+
INTO samples_with_ou_count
45+
FROM sample
46+
WHERE additional_info ? 'obsUnitID';
47+
48+
SELECT COUNT(*)
49+
INTO samples_with_ous_matched_to_ou_count
50+
FROM sample s
51+
JOIN observation_unit ou on ou.id::text = s.additional_info ->> 'obsUnitID'
52+
WHERE s.additional_info ? 'obsUnitID';
53+
54+
IF samples_with_ou_count <> samples_with_ous_matched_to_ou_count THEN
55+
RAISE EXCEPTION
56+
'V006.002 After migration, expected all % sample.additional_info->>obsUnitID rows to match to observation_unit.id, but only % matched',
57+
samples_with_ou_count,
58+
samples_with_ous_matched_to_ou_count;
59+
END IF;
60+
END
61+
$$;

0 commit comments

Comments
 (0)