2235c363695ea5b94fa369baab93b7faaa44fd81
[working/Evergreen.git] / Open-ILS / src / sql / Pg / 210.schema.serials.sql
1
2
3 DROP SCHEMA IF EXISTS serial CASCADE;
4
5 BEGIN;
6
7 CREATE SCHEMA serial;
8
9 CREATE TABLE serial.record_entry (
10         id              BIGSERIAL       PRIMARY KEY,
11         record          BIGINT          REFERENCES biblio.record_entry (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
12         owning_lib      INT             NOT NULL DEFAULT 1 REFERENCES actor.org_unit (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
13         creator         INT             NOT NULL DEFAULT 1,
14         editor          INT             NOT NULL DEFAULT 1,
15         source          INT,
16         create_date     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT now(),
17         edit_date       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT now(),
18         active          BOOL            NOT NULL DEFAULT TRUE,
19         deleted         BOOL            NOT NULL DEFAULT FALSE,
20         marc            TEXT,
21         last_xact_id    TEXT            NOT NULL
22 );
23 CREATE INDEX serial_record_entry_creator_idx ON serial.record_entry ( creator );
24 CREATE INDEX serial_record_entry_editor_idx ON serial.record_entry ( editor );
25 CREATE INDEX serial_record_entry_owning_lib_idx ON serial.record_entry ( owning_lib, deleted );
26 CREATE TRIGGER b_maintain_901 BEFORE INSERT OR UPDATE ON serial.record_entry FOR EACH ROW EXECUTE PROCEDURE maintain_901();
27 CREATE TRIGGER c_maintain_control_numbers BEFORE INSERT OR UPDATE ON serial.record_entry FOR EACH ROW EXECUTE PROCEDURE maintain_control_numbers();
28
29 CREATE RULE protect_mfhd_delete AS ON DELETE TO serial.record_entry DO INSTEAD UPDATE serial.record_entry SET deleted = true WHERE old.id = serial.record_entry.id;
30
31 CREATE TABLE serial.subscription (
32         id                     SERIAL       PRIMARY KEY,
33         owning_lib             INT     NOT NULL DEFAULT 1 REFERENCES actor.org_unit (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
34         start_date             TIMESTAMP WITH TIME ZONE     NOT NULL,
35         end_date               TIMESTAMP WITH TIME ZONE,    -- interpret NULL as current subscription
36         record_entry           BIGINT       REFERENCES biblio.record_entry (id)
37                                             ON DELETE SET NULL
38                                             DEFERRABLE INITIALLY DEFERRED,
39         expected_date_offset   INTERVAL
40         -- acquisitions/business-side tables link to here
41 );
42
43
44 CREATE TABLE serial.caption_and_pattern (
45         id           SERIAL       PRIMARY KEY,
46         subscription INT          NOT NULL
47                                   REFERENCES serial.subscription (id)
48                                   ON DELETE CASCADE
49                                   DEFERRABLE INITIALLY DEFERRED,
50         type         TEXT         NOT NULL
51                                   CONSTRAINT cap_type CHECK ( type in
52                                   ( 'basic', 'supplement', 'index' )),
53         create_time  TIMESTAMPTZ  NOT NULL DEFAULT now(),
54         active       BOOL         NOT NULL DEFAULT FALSE,
55         pattern_code TEXT         NOT NULL,       -- must contain JSON
56         enum_1       TEXT,
57         enum_2       TEXT,
58         enum_3       TEXT,
59         enum_4       TEXT,
60         enum_5       TEXT,
61         enum_6       TEXT,
62         chron_1      TEXT,
63         chron_2      TEXT,
64         chron_3      TEXT,
65         chron_4      TEXT,
66         chron_5      TEXT
67 );
68
69 --at least one distribution per org_unit holding issues
70 CREATE TABLE serial.distribution (
71         id                    SERIAL  PRIMARY KEY,
72         record_entry          BIGINT  REFERENCES serial.record_entry (id)
73                                                                   ON DELETE SET NULL
74                                                                   DEFERRABLE INITIALLY DEFERRED,
75         subscription          INT     NOT NULL
76                                       REFERENCES serial.subscription (id)
77                                                                   ON DELETE CASCADE
78                                                                   DEFERRABLE INITIALLY DEFERRED,
79         holding_lib           INT     NOT NULL
80                                       REFERENCES actor.org_unit (id)
81                                                                   DEFERRABLE INITIALLY DEFERRED,
82         label                 TEXT    NOT NULL,
83         receive_call_number   BIGINT  REFERENCES asset.call_number (id)
84                                       DEFERRABLE INITIALLY DEFERRED,
85         receive_unit_template INT     REFERENCES asset.copy_template (id)
86                                       DEFERRABLE INITIALLY DEFERRED,
87         bind_call_number      BIGINT  REFERENCES asset.call_number (id)
88                                       DEFERRABLE INITIALLY DEFERRED,
89         bind_unit_template    INT     REFERENCES asset.copy_template (id)
90                                       DEFERRABLE INITIALLY DEFERRED,
91         unit_label_base       TEXT,
92         unit_label_suffix     TEXT
93 );
94 CREATE UNIQUE INDEX one_dist_per_sre_idx ON serial.distribution (record_entry);
95
96 CREATE TABLE serial.stream (
97         id              SERIAL  PRIMARY KEY,
98         distribution    INT     NOT NULL
99                                 REFERENCES serial.distribution (id)
100                                 ON DELETE CASCADE
101                                 DEFERRABLE INITIALLY DEFERRED,
102         routing_label   TEXT
103 );
104
105 CREATE UNIQUE INDEX label_once_per_dist
106         ON serial.stream (distribution, routing_label)
107         WHERE routing_label IS NOT NULL;
108
109 CREATE TABLE serial.routing_list_user (
110         id             SERIAL       PRIMARY KEY,
111         stream         INT          NOT NULL
112                                     REFERENCES serial.stream
113                                     ON DELETE CASCADE
114                                     DEFERRABLE INITIALLY DEFERRED,
115         pos            INT          NOT NULL DEFAULT 1,
116         reader         INT          REFERENCES actor.usr
117                                     ON DELETE CASCADE
118                                     DEFERRABLE INITIALLY DEFERRED,
119         department     TEXT,
120         note           TEXT,
121         CONSTRAINT one_pos_per_routing_list UNIQUE ( stream, pos ),
122         CONSTRAINT reader_or_dept CHECK
123         (
124             -- Recipient is a person or a department, but not both
125                 (reader IS NOT NULL AND department IS NULL) OR
126                 (reader IS NULL AND department IS NOT NULL)
127         )
128 );
129
130 CREATE TABLE serial.issuance (
131         id              SERIAL    PRIMARY KEY,
132         creator         INT       NOT NULL
133                                   REFERENCES actor.usr (id)
134                                                           DEFERRABLE INITIALLY DEFERRED,
135         editor          INT       NOT NULL
136                                   REFERENCES actor.usr (id)
137                                   DEFERRABLE INITIALLY DEFERRED,
138         create_date     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT now(),
139         edit_date       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT now(),
140         subscription    INT       NOT NULL
141                                   REFERENCES serial.subscription (id)
142                                   ON DELETE CASCADE
143                                   DEFERRABLE INITIALLY DEFERRED,
144         label           TEXT,
145         date_published  TIMESTAMP WITH TIME ZONE,
146         holding_code    TEXT,
147         holding_type    TEXT      CONSTRAINT valid_holding_type CHECK
148                                   (
149                                       holding_type IS NULL
150                                       OR holding_type IN ('basic','supplement','index')
151                                   ),
152         holding_link_id INT
153         -- TODO: add columns for separate enumeration/chronology values
154 );
155
156 CREATE TABLE serial.unit (
157         label           TEXT,
158         label_sort_key  TEXT,
159         contents        TEXT    NOT NULL
160 ) INHERITS (asset.copy);
161
162 ALTER TABLE serial.unit ADD PRIMARY KEY (id);
163
164 -- must create this rule explicitly; it is not inherited from asset.copy
165 CREATE RULE protect_serial_unit_delete AS ON DELETE TO serial.unit DO INSTEAD UPDATE serial.unit SET deleted = TRUE WHERE OLD.id = serial.unit.id;
166
167 CREATE TABLE serial.item (
168         id              SERIAL  PRIMARY KEY,
169         creator         INT     NOT NULL
170                                 REFERENCES actor.usr (id)
171                                 DEFERRABLE INITIALLY DEFERRED,
172         editor          INT     NOT NULL
173                                 REFERENCES actor.usr (id)
174                                 DEFERRABLE INITIALLY DEFERRED,
175         create_date     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT now(),
176         edit_date       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT now(),
177         issuance        INT     NOT NULL
178                                 REFERENCES serial.issuance (id)
179                                 ON DELETE CASCADE
180                                 DEFERRABLE INITIALLY DEFERRED,
181         stream          INT     NOT NULL
182                                 REFERENCES serial.stream (id)
183                                 ON DELETE CASCADE
184                                 DEFERRABLE INITIALLY DEFERRED,
185         unit            INT     REFERENCES serial.unit (id)
186                                 ON DELETE SET NULL
187                                 DEFERRABLE INITIALLY DEFERRED,
188         uri             INT     REFERENCES asset.uri (id)
189                                 ON DELETE SET NULL
190                                 DEFERRABLE INITIALLY DEFERRED,
191         date_expected   TIMESTAMP WITH TIME ZONE,
192         date_received   TIMESTAMP WITH TIME ZONE
193 );
194
195 CREATE TABLE serial.item_note (
196         id          SERIAL  PRIMARY KEY,
197         item        INT     NOT NULL
198                             REFERENCES serial.item (id)
199                             ON DELETE CASCADE
200                             DEFERRABLE INITIALLY DEFERRED,
201         creator     INT     NOT NULL
202                             REFERENCES actor.usr (id)
203                             DEFERRABLE INITIALLY DEFERRED,
204         create_date TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
205         pub         BOOL    NOT NULL    DEFAULT FALSE,
206         title       TEXT    NOT NULL,
207         value       TEXT    NOT NULL
208 );
209
210 CREATE TABLE serial.bib_summary (
211         id                  SERIAL  PRIMARY KEY,
212         distribution        INT     NOT NULL
213                                     REFERENCES serial.distribution (id)
214                                     ON DELETE CASCADE
215                                     DEFERRABLE INITIALLY DEFERRED,
216         generated_coverage  TEXT    NOT NULL,
217         textual_holdings    TEXT
218 );
219
220 CREATE TABLE serial.sup_summary (
221         id                  SERIAL  PRIMARY KEY,
222         distribution        INT     NOT NULL
223                                     REFERENCES serial.distribution (id)
224                                     ON DELETE CASCADE
225                                     DEFERRABLE INITIALLY DEFERRED,
226         generated_coverage  TEXT    NOT NULL,
227         textual_holdings    TEXT
228 );
229
230 CREATE TABLE serial.index_summary (
231         id                  SERIAL  PRIMARY KEY,
232         distribution        INT     NOT NULL
233                                     REFERENCES serial.distribution (id)
234                                     ON DELETE CASCADE
235                                     DEFERRABLE INITIALLY DEFERRED,
236         generated_coverage  TEXT    NOT NULL,
237         textual_holdings    TEXT
238 );
239
240 COMMIT;