source: TI01-discovery/branches/ingestAutomation-upgrade/database/ingest_procedures.sql @ 3967

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI01-discovery/branches/ingestAutomation-upgrade/database/ingest_procedures.sql@3967
Revision 3967, 5.9 KB checked in by cbyrom, 11 years ago (diff)

Update code to allow the extraction of authors, parameters and scope
from moles files + adjust the data model to handle these new data.

Line 
1/*
2 * Procedures used by the DB code as part of the ingest process
3 *
4 * C Byrom Apr 08
5 *
6 */
7DROP FUNCTION add_document_to_history() CASCADE;
8CREATE FUNCTION add_document_to_history() RETURNS TRIGGER AS 
9$$
10    BEGIN
11        -- This inserts the currently stored information
12        -- into the original_document_history table
13                -- NB, only do this when we are not just incrementing the harvest count
14                IF OLD.harvest_count=NEW.harvest_count THEN
15                INSERT INTO original_document_history
16                SELECT * FROM original_document WHERE original_document_id=NEW.original_document_id;
17                END IF;
18                RETURN NEW;
19     END;
20$$ LANGUAGE 'plpgsql';
21
22DROP FUNCTION create_document(filename_in varchar(255), discovery_id_in varchar(255), 
23        doc_type_in text, original_document_in text, authors text, parameters text, scope text) CASCADE;
24CREATE FUNCTION create_document(filename_in varchar(255), discovery_id_in varchar(255), 
25        doc_type_in text, original_document_in text, authors text, parameters text, scope text) RETURNS integer AS 
26$$
27        DECLARE
28                db_id integer;
29    BEGIN
30        -- This inserts a new document into the DB
31        INSERT INTO ORIGINAL_DOCUMENT (original_document_id, original_document_filename, 
32            discovery_id, original_format, original_document, document_ts_vector, authors_ts_vector, 
33            parameters_ts_vector, scope_ts_vector, create_date, harvest_count, scn) VALUES (
34            DEFAULT, filename_in, discovery_id_in, doc_type_in, original_document_in, 
35                        to_tsvector('english', original_document_in), to_tsvector('english', authors), 
36                        to_tsvector('english', parameters), to_tsvector('english', scope), current_timestamp, 1, 1);
37
38                SELECT original_document_id INTO db_id FROM ORIGINAL_DOCUMENT WHERE discovery_id = discovery_id_in;
39                RETURN db_id;
40     END;
41$$ LANGUAGE 'plpgsql';
42
43
44DROP FUNCTION delete_document(original_document_id_in int) CASCADE;
45CREATE FUNCTION delete_document(original_document_id_in int) RETURNS VOID AS 
46$$
47        DECLARE
48                db_id integer;
49    BEGIN
50        -- This deletes a document from the DB
51        DELETE FROM TRANSFORMED_DOCUMENT WHERE original_document_id = original_document_id_in;
52                DELETE FROM SPATIAL_TEMPORAL_DATA WHERE original_document_id = original_document_id_in;
53        DELETE FROM ORIGINAL_DOCUMENT WHERE original_document_id = original_document_id_in;
54        END;
55$$ LANGUAGE 'plpgsql';
56
57
58DROP FUNCTION update_document(original_document_id_in int, filename_in varchar(255), 
59        discovery_id_in varchar(255), doc_type_in text, original_document_in text, 
60        authors text, parameters text, scope text, scn_in int) CASCADE;
61CREATE FUNCTION update_document(original_document_id_in int, filename_in varchar(255), 
62        discovery_id_in varchar(255), doc_type_in text, original_document_in text, 
63        authors text, parameters text, scope text, scn_in int) 
64        RETURNS VOID AS 
65$$
66        DECLARE
67                scn_current integer;
68    BEGIN
69        -- This updates an existing document
70
71                -- check the scn is valid before an update is done
72                SELECT scn INTO scn_current FROM ORIGINAL_DOCUMENT WHERE 
73                        original_document_id = original_document_id_in;
74                IF scn_in <> scn_current THEN
75                        RAISE EXCEPTION 'Invalid SCN specified (current scn=%, specified scn=%) -
76                                implies record has been changed during update - exiting...', scn_current, scn_in;
77                END IF;
78
79        UPDATE ORIGINAL_DOCUMENT SET
80                        original_document_filename = filename_in,
81            discovery_id = discovery_id_in,
82                        original_format = doc_type_in,
83                        original_document = original_document_in,
84            document_ts_vector = to_tsvector('english', original_document_in),
85            authors_ts_vector = to_tsvector('english', authors),
86            parameters_ts_vector = to_tsvector('english', parameters),
87            scope_ts_vector = to_tsvector('english', scope),
88            update_date = current_timestamp, 
89                        harvest_count = 1,
90                        scn = scn_in + 1
91                        WHERE original_document_id = original_document_id_in;
92     END;
93$$ LANGUAGE 'plpgsql';
94
95
96DROP FUNCTION add_spatiotemporal_row(original_document_id_in int, north_in real, 
97        south_in real, west_in real, east_in real, start_time_in timestamp, 
98        end_time_in timestamp) CASCADE;
99CREATE FUNCTION add_spatiotemporal_row(original_document_id_in int, north_in real, 
100        south_in real, west_in real, east_in real, start_time_in timestamp, 
101        end_time_in timestamp) RETURNS void AS 
102$$
103        DECLARE
104                spatial_db_id integer := null;
105                temporal_db_id integer := null;
106                cmdStr text;
107
108    BEGIN
109        -- This inserts a new row in the spatial data table, if required
110                IF west_in is not null AND east_in is not null AND
111                        north_in is not null AND south_in is not null THEN
112
113                        cmdStr := 'INSERT INTO SPATIAL_DATA (spatial_data_id, geometry, create_date)
114                                VALUES (DEFAULT,
115                                SetSRID(''BOX3D(' || west_in || ' ' || south_in || ', ' || east_in || ' ' || 
116                                        north_in || ')''::box3d,4326),
117                                current_timestamp)'; 
118       
119                -- For debugging only
120                        --raise notice 'cmdStr is: %', cmdStr;
121
122                EXECUTE cmdStr;
123
124                        SELECT MAX(spatial_data_id) INTO spatial_db_id FROM SPATIAL_DATA;
125                        --RAISE NOTICE 'Spatial data added - with ID: %', spatial_db_id;
126                END IF;
127
128        -- This inserts a new row in the temporal data table, if required
129        IF start_time_in is not null OR end_time_in is not null THEN
130                INSERT INTO TEMPORAL_DATA (temporal_data_id, start_time, end_time, create_date) 
131                                VALUES (DEFAULT, start_time_in, end_time_in, current_timestamp);
132
133                        SELECT MAX(temporal_data_id) INTO temporal_db_id FROM TEMPORAL_DATA;
134                        --RAISE NOTICE 'Temporal data added - with ID: %', temporal_db_id;
135                END IF;
136
137                -- Now create row in link table
138                INSERT INTO SPATIAL_TEMPORAL_DATA (spatial_temporal_data_id, original_document_id,
139                        spatial_data_id, temporal_data_id, create_date) VALUES
140                        (DEFAULT, original_document_id_in, spatial_db_id, temporal_db_id, current_timestamp);
141               
142     END;
143$$ LANGUAGE 'plpgsql';
Note: See TracBrowser for help on using the repository browser.