x
1
DECLARE
2
maprow RECORD;
3
querystr TEXT;
4
queries TEXT[];
5
emptyquery TEXT;
6
matviewquery TEXT;
7
BEGIN
8
9
-- Remove exsiting materialized view, if it exists
10
DROP MATERIALIZED VIEW IF EXISTS public.materialized_markerview;
11
12
-- Get the unique species / reference genome combinations from the nd_protocolprop table
13
FOR maprow IN (
14
SELECT value->>'species_name' AS species,
15
concat(
16
substring(split_part(value->>'species_name', ' ', 1), 1, 1),
17
substring(split_part(value->>'species_name', ' ', 2), 1, 1)
18
) AS species_abbreviation,
19
value->>'reference_genome_name' AS reference_genome,
20
replace(replace(value->>'reference_genome_name', '_', ''), ' ', '') AS reference_genome_cleaned
21
FROM nd_protocolprop
22
WHERE type_id = (SELECT cvterm_id FROM public.cvterm WHERE name = 'vcf_map_details')
23
GROUP BY species, reference_genome
24
)
25
26
-- Loop through each unique combination of species / reference genome and build the marker query
27
LOOP
28
querystr := 'SELECT nd_protocolprop.nd_protocol_id, ''' || maprow.species || ''' AS species_name, ''' || maprow.reference_genome || ''' AS reference_genome_name, s.value->>''name'' AS marker_name, s.value->>''chrom'' AS chrom, cast(coalesce(nullif(s.value->>''pos'',''''),NULL) as numeric) AS pos, s.value->>''ref'' AS ref, s.value->>''alt'' AS alt, CASE WHEN s.value->>''alt'' < s.value->>''ref'' THEN concat(''' || maprow.species_abbreviation || ''', ''' || maprow.reference_genome_cleaned || ''', ''_'', REGEXP_REPLACE(s.value->>''chrom'', ''^chr?'', ''''), ''_'', s.value->>''pos'', ''_'', s.value->>''alt'', ''_'', s.value->>''ref'') ELSE concat(''' || maprow.species_abbreviation || ''', ''' || maprow.reference_genome_cleaned || ''', ''_'', REGEXP_REPLACE(s.value->>''chrom'', ''^chr?'', ''''), ''_'', s.value->>''pos'', ''_'', s.value->>''ref'', ''_'', s.value->>''alt'') END AS variant_name FROM nd_protocolprop, LATERAL jsonb_each(nd_protocolprop.value) s(key, value) WHERE type_id = (SELECT cvterm_id FROM public.cvterm WHERE name = ''vcf_map_details_markers'') AND nd_protocol_id IN (SELECT nd_protocol_id FROM nd_protocolprop WHERE value->>''species_name'' = ''' || maprow.species || ''' and value->>''reference_genome_name'' = ''' || maprow.reference_genome || ''' AND type_id = (SELECT cvterm_id FROM public.cvterm WHERE name = ''vcf_map_details''))';
29
queries := array_append(queries, querystr);
30
31
END LOOP;
32
33
-- Add an empty query in case there is no existing marker data
34
emptyquery := 'SELECT column1::int AS nd_protocol_id, column2::text AS species_name, column3::text AS reference_genome_name, column4::text AS marker_name, column5::text AS chrom, column6::numeric AS pos, column7::text AS ref, column8::text AS alt, column9::text AS variant_name FROM (values (null,null,null,null,null,null,null,null,null)) AS x WHERE false';
35
queries := array_append(queries, emptyquery);
36
37
-- Combine queries with a UNION
38
matviewquery := array_to_string(queries, ' UNION ');
39
40
-- Build the materialized view
41
EXECUTE 'CREATE MATERIALIZED VIEW public.materialized_markerview AS (' || matviewquery || ') WITH NO DATA';
42
ALTER MATERIALIZED VIEW public.materialized_markerview OWNER TO web_usr;
43
44
-- Add indexes
45
CREATE INDEX materialized_markerview_idx1 ON public.materialized_markerview(nd_protocol_id);
46
CREATE INDEX materialized_markerview_idx2 ON public.materialized_markerview(species_name);
47
CREATE INDEX materialized_markerview_idx3 ON public.materialized_markerview(reference_genome_name);
48
CREATE INDEX materialized_markerview_idx4 ON public.materialized_markerview(marker_name);
49
CREATE INDEX materialized_markerview_idx5 ON public.materialized_markerview(UPPER(marker_name));
50
CREATE INDEX materialized_markerview_idx6 ON public.materialized_markerview(chrom);
51
CREATE INDEX materialized_markerview_idx7 ON public.materialized_markerview(pos);
52
CREATE INDEX materialized_markerview_idx8 ON public.materialized_markerview(variant_name);
53
CREATE INDEX materialized_markerview_idx9 ON public.materialized_markerview(UPPER(variant_name));
54
CREATE INDEX materialized_markerview_idx10 ON public.materialized_markerview USING GIN(marker_name gin_trgm_ops);
55
CREATE INDEX materialized_markerview_idx11 ON public.materialized_markerview USING GIN(variant_name gin_trgm_ops);
56
57
-- Refresh materialzied view, if requested with function argument
58
IF $1 THEN
59
EXECUTE 'REFRESH MATERIALIZED VIEW public.materialized_markerview';
60
END IF;
61
62
-- Return true if the materialized view is refreshed
63
RETURN $1;
64
65
END