133 lines
5.0 KiB
PL/PgSQL
133 lines
5.0 KiB
PL/PgSQL
begin;
|
|
|
|
alter table public.birth_time_rectification_event_evidence
|
|
add column if not exists event_kind text check (
|
|
event_kind is null or (
|
|
public.conversational_rectification_text_utf16_length(event_kind) between 1 and 120
|
|
and public.conversational_rectification_text_is_nonblank(event_kind)
|
|
)
|
|
),
|
|
add column if not exists subject text check (
|
|
subject is null or subject in ('self', 'family', 'partner', 'other')
|
|
),
|
|
add column if not exists related_person text check (
|
|
related_person is null or related_person in (
|
|
'father', 'mother', 'grandparent', 'sibling', 'partner'
|
|
)
|
|
),
|
|
add column if not exists scoreability text check (
|
|
scoreability is null or scoreability in (
|
|
'scoreable', 'context_only', 'pending_review', 'unsupported'
|
|
)
|
|
);
|
|
|
|
-- Keep old rows valid while persisting the richer optional semantics emitted by
|
|
-- the application. Patch the deployed function bodies because these RPCs were
|
|
-- created by earlier immutable migrations.
|
|
do $migration$
|
|
declare
|
|
v_definition text;
|
|
v_updated text;
|
|
v_signature text;
|
|
begin
|
|
select pg_catalog.pg_get_functiondef(
|
|
'public.conversational_rectification_valid_life_event_evidence(jsonb)'::regprocedure
|
|
) into v_definition;
|
|
v_updated := pg_catalog.replace(
|
|
v_definition,
|
|
'''datePrecision'', ''extractionStatus'', ''scoreable'', ''correctsEvidenceIds''',
|
|
'''datePrecision'', ''extractionStatus'', ''eventKind'', ''subject'', ''relatedPerson'', ''scoreability'', ''scoreable'', ''correctsEvidenceIds'''
|
|
);
|
|
v_updated := pg_catalog.replace(
|
|
v_updated,
|
|
$$ or pg_catalog.jsonb_typeof(p_value -> 'eventSummary') is distinct from 'string'$$,
|
|
$$ or (
|
|
p_value ? 'eventKind'
|
|
and (
|
|
pg_catalog.jsonb_typeof(p_value -> 'eventKind') is distinct from 'string'
|
|
or public.conversational_rectification_text_utf16_length(
|
|
p_value ->> 'eventKind'
|
|
) not between 1 and 120
|
|
or public.conversational_rectification_text_is_nonblank(
|
|
p_value ->> 'eventKind'
|
|
) is not true
|
|
)
|
|
)
|
|
or (
|
|
p_value ? 'subject'
|
|
and (
|
|
pg_catalog.jsonb_typeof(p_value -> 'subject') is distinct from 'string'
|
|
or p_value ->> 'subject' not in ('self', 'family', 'partner', 'other')
|
|
)
|
|
)
|
|
or (
|
|
p_value ? 'relatedPerson'
|
|
and p_value -> 'relatedPerson' <> 'null'::jsonb
|
|
and (
|
|
pg_catalog.jsonb_typeof(p_value -> 'relatedPerson') is distinct from 'string'
|
|
or p_value ->> 'relatedPerson' not in (
|
|
'father', 'mother', 'grandparent', 'sibling', 'partner'
|
|
)
|
|
)
|
|
)
|
|
or (
|
|
p_value ? 'scoreability'
|
|
and (
|
|
pg_catalog.jsonb_typeof(p_value -> 'scoreability') is distinct from 'string'
|
|
or p_value ->> 'scoreability' not in (
|
|
'scoreable', 'context_only', 'pending_review', 'unsupported'
|
|
)
|
|
)
|
|
)
|
|
or pg_catalog.jsonb_typeof(p_value -> 'eventSummary') is distinct from 'string'$$
|
|
);
|
|
if v_updated is not distinct from v_definition then
|
|
raise exception 'event semantics migration could not update evidence validator';
|
|
end if;
|
|
execute v_updated;
|
|
|
|
foreach v_signature in array array[
|
|
'public.save_conversational_rectification_turn(uuid,uuid,bigint,uuid,jsonb,jsonb,jsonb,jsonb,text)',
|
|
'public.import_legacy_conversational_rectification_case(uuid,uuid,uuid,bigint,uuid,integer,text,jsonb,jsonb,jsonb,jsonb,jsonb)'
|
|
] loop
|
|
select pg_catalog.pg_get_functiondef(v_signature::regprocedure) into v_definition;
|
|
v_updated := pg_catalog.replace(
|
|
v_definition,
|
|
'date_value, date_precision, extraction_status, corrects_evidence_ids, scoreable',
|
|
'date_value, date_precision, extraction_status, corrects_evidence_ids, event_kind, subject, related_person, scoreability, scoreable'
|
|
);
|
|
v_updated := pg_catalog.replace(
|
|
v_updated,
|
|
$$date_value, date_precision, extraction_status, scoreable,
|
|
corrects_evidence_ids$$,
|
|
$$date_value, date_precision, extraction_status, event_kind, subject,
|
|
related_person, scoreability, scoreable, corrects_evidence_ids$$
|
|
);
|
|
v_updated := pg_catalog.replace(
|
|
v_updated,
|
|
$$ ) else '{}'::uuid[] end,
|
|
case when item ? 'scoreable' then (item ->> 'scoreable')::boolean$$,
|
|
$$ ) else '{}'::uuid[] end,
|
|
item ->> 'eventKind', item ->> 'subject', item ->> 'relatedPerson',
|
|
item ->> 'scoreability',
|
|
case when item ? 'scoreable' then (item ->> 'scoreable')::boolean$$
|
|
);
|
|
v_updated := pg_catalog.replace(
|
|
v_updated,
|
|
$$ item ->> 'extractionStatus', (item ->> 'scoreable')::boolean,
|
|
array(select value::uuid$$,
|
|
$$ item ->> 'extractionStatus', item ->> 'eventKind', item ->> 'subject',
|
|
item ->> 'relatedPerson', item ->> 'scoreability',
|
|
(item ->> 'scoreable')::boolean,
|
|
array(select value::uuid$$
|
|
);
|
|
if v_updated is not distinct from v_definition then
|
|
raise exception 'event semantics migration could not update %', v_signature;
|
|
end if;
|
|
execute v_updated;
|
|
end loop;
|
|
end;
|
|
$migration$;
|
|
|
|
commit;
|