1+ DROP MATERIALIZED VIEW ap .querytable CASCADE;
2+ CREATE MATERIALIZED VIEW ap .querytable AS (
3+ WITH sgp AS (
4+ SELECT st .siteid ,
5+ array_append(gp .geoout , gp .geoin ::int ) AS geopol,
6+ rank() OVER (partition by st .siteid order by st .siteid , array_length(gp .geoout ,1 ) ASC ) AS rank
7+ FROM ndb .sites AS st
8+ INNER JOIN ndb .sitegeopolitical AS sgp ON st .siteid = sgp .siteid
9+ INNER JOIN ndb .geopoliticalunits AS gpu ON gpu .geopoliticalid = sgp .geopoliticalid
10+ INNER JOIN ndb .geopaths AS gp ON gp .geoin = sgp .geopoliticalid
11+ )
12+ SELECT st .siteid ,
13+ st .sitename ,
14+ ds .datasetid ,
15+ st .altitude ,
16+ dst .datasettype ,
17+ dsdb .databaseid ,
18+ cu .collectionunitid ,
19+ cut .colltype ,
20+ dvt .depenvt ,
21+ st .geog ,
22+ arg .older ,
23+ arg .younger ,
24+ agetypes .agetype ,
25+ array_agg(DISTINCT var .taxonid ) AS taxa,
26+ array_agg(DISTINCT smpkw .keywordid ) AS keywords,
27+ array_agg(DISTINCT dpi .contactid ) AS contacts,
28+ sgp .geopol
29+ FROM ndb .sites AS st
30+ INNER JOIN ndb .collectionunits AS cu ON cu .siteid = st .siteid
31+ INNER JOIN ndb .collectiontypes AS cut ON cut .colltypeid = cu .colltypeid
32+ INNER JOIN ndb .datasets AS ds ON ds .collectionunitid = cu .collectionunitid
33+ INNER JOIN ndb .depenvttypes AS dvt ON dvt .depenvtid = cu .depenvtid
34+ INNER JOIN ndb .datasetpis AS dpi ON dpi .datasetid = ds .datasetid
35+ INNER JOIN ndb .datasettypes AS dst ON dst .datasettypeid = ds .datasettypeid
36+ INNER JOIN ndb .datasetdatabases AS dsdb ON ds .datasetid = dsdb .datasetid
37+ LEFT OUTER JOIN ndb .dsageranges AS arg ON ds .datasetid = arg .datasetid
38+ LEFT OUTER JOIN ndb .agetypes AS agetypes ON agetypes .agetypeid = arg .agetypeid
39+ INNER JOIN ndb .samples AS smp ON smp .datasetid = ds .datasetid
40+ LEFT OUTER JOIN ndb .samplekeywords AS smpkw ON smpkw .sampleid = smp .sampleid
41+ INNER JOIN ndb .data AS dt ON dt .sampleid = smp .sampleid
42+ INNER JOIN ndb .variables AS var ON var .variableid = dt .variableid
43+ INNER JOIN sgp AS sgp ON st .siteid = sgp .siteid
44+ WHERE sgp .rank = 1
45+ GROUP BY st .siteid ,
46+ cu .collectionunitid ,
47+ st .sitename ,
48+ ds .datasetid ,
49+ cut .colltype ,
50+ dsdb .databaseid ,
51+ st .altitude ,
52+ dst .datasettype ,
53+ st .geog ,
54+ arg .older ,
55+ arg .younger ,
56+ agetypes .agetype ,
57+ sgp .geopol ,
58+ dvt .depenvt
59+ );
60+
61+ CREATE INDEX spatialgeom ON ap .querytable USING GIST(geog);
62+ CREATE INDEX dstindex ON ap .querytable (datasettype);
63+ CREATE INDEX depenvindex ON ap .querytable (depenvt);
64+ CREATE INDEX atyindex ON ap .querytable (agetype);
65+ CREATE INDEX siteidindex ON ap .querytable (siteid);
66+ CREATE INDEX sitename ON ap .querytable USING GIST (sitename gist_trgm_ops);
67+ CREATE INDEX datasetidindex ON ap .querytable (datasetid);
68+ CREATE INDEX altitudeidx ON ap .querytable (altitude);
69+ CREATE INDEX taxonidindex ON ap .querytable USING GIN(taxa gin__int_ops);
70+ CREATE INDEX contactidindex ON ap .querytable USING GIN(contacts gin__int_ops);
71+ CREATE INDEX keywordidindex ON ap .querytable USING GIN(keywords gin__int_ops);
72+ CREATE INDEX geoidindex ON ap .querytable USING GIN(geopol gin__int_ops);
73+ CREATE INDEX olderidx ON ap .querytable (older);
74+ CREATE INDEX youngeridx ON ap .querytable (younger);
75+
76+ CREATE OR REPLACE FUNCTION ap .updatequery()
77+ RETURNS TRIGGER LANGUAGE plpgsql
78+ AS $$
79+ BEGIN
80+ REFRESH MATERIALIZED VIEW CONCURRENTLY ap .querytable ;
81+ RETURN NULL ;
82+ END $$;
83+
84+ CREATE TRIGGER updatewidequeryst
85+ AFTER INSERT OR DELETE
86+ ON ndb .sites
87+ FOR EACH STATEMENT
88+ EXECUTE PROCEDURE ap .updategpsites ();
89+
90+ CREATE TRIGGER updatewidequeryds
91+ AFTER INSERT OR DELETE
92+ ON ndb .datasets
93+ FOR EACH STATEMENT
94+ EXECUTE PROCEDURE ap .updategpsites ();
0 commit comments