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 )
2028UPDATE sample
2129SET 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