3 DROP SCHEMA IF EXISTS serial CASCADE;
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,
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,
21 last_xact_id TEXT NOT NULL
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();
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;
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)
38 DEFERRABLE INITIALLY DEFERRED,
39 expected_date_offset INTERVAL
40 -- acquisitions/business-side tables link to here
42 CREATE INDEX serial_subscription_record_idx ON serial.subscription (record_entry);
43 CREATE INDEX serial_subscription_owner_idx ON serial.subscription (owning_lib);
45 CREATE TABLE serial.subscription_note (
46 id SERIAL PRIMARY KEY,
47 subscription INT NOT NULL
48 REFERENCES serial.subscription (id)
50 DEFERRABLE INITIALLY DEFERRED,
52 REFERENCES actor.usr (id)
53 DEFERRABLE INITIALLY DEFERRED,
54 create_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
55 pub BOOL NOT NULL DEFAULT FALSE,
59 CREATE INDEX serial_subscription_note_sub_idx ON serial.subscription_note (subscription);
61 CREATE TABLE serial.caption_and_pattern (
62 id SERIAL PRIMARY KEY,
63 subscription INT NOT NULL
64 REFERENCES serial.subscription (id)
66 DEFERRABLE INITIALLY DEFERRED,
68 CONSTRAINT cap_type CHECK ( type in
69 ( 'basic', 'supplement', 'index' )),
70 create_date TIMESTAMPTZ NOT NULL DEFAULT now(),
71 active BOOL NOT NULL DEFAULT FALSE,
72 pattern_code TEXT NOT NULL, -- must contain JSON
85 CREATE INDEX serial_caption_and_pattern_sub_idx ON serial.caption_and_pattern (subscription);
87 --at least one distribution per org_unit holding issues
88 CREATE TABLE serial.distribution (
89 id SERIAL PRIMARY KEY,
90 record_entry BIGINT REFERENCES serial.record_entry (id)
92 DEFERRABLE INITIALLY DEFERRED,
93 subscription INT NOT NULL
94 REFERENCES serial.subscription (id)
96 DEFERRABLE INITIALLY DEFERRED,
97 holding_lib INT NOT NULL
98 REFERENCES actor.org_unit (id)
99 DEFERRABLE INITIALLY DEFERRED,
101 receive_call_number BIGINT REFERENCES asset.call_number (id)
102 DEFERRABLE INITIALLY DEFERRED,
103 receive_unit_template INT REFERENCES asset.copy_template (id)
104 DEFERRABLE INITIALLY DEFERRED,
105 bind_call_number BIGINT REFERENCES asset.call_number (id)
106 DEFERRABLE INITIALLY DEFERRED,
107 bind_unit_template INT REFERENCES asset.copy_template (id)
108 DEFERRABLE INITIALLY DEFERRED,
109 unit_label_prefix TEXT,
110 unit_label_suffix TEXT
112 CREATE UNIQUE INDEX one_dist_per_sre_idx ON serial.distribution (record_entry);
113 CREATE INDEX serial_distribution_sub_idx ON serial.distribution (subscription);
114 CREATE INDEX serial_distribution_holding_lib_idx ON serial.distribution (holding_lib);
116 CREATE TABLE serial.distribution_note (
117 id SERIAL PRIMARY KEY,
118 distribution INT NOT NULL
119 REFERENCES serial.distribution (id)
121 DEFERRABLE INITIALLY DEFERRED,
123 REFERENCES actor.usr (id)
124 DEFERRABLE INITIALLY DEFERRED,
125 create_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
126 pub BOOL NOT NULL DEFAULT FALSE,
130 CREATE INDEX serial_distribution_note_dist_idx ON serial.distribution_note (distribution);
132 CREATE TABLE serial.stream (
133 id SERIAL PRIMARY KEY,
134 distribution INT NOT NULL
135 REFERENCES serial.distribution (id)
137 DEFERRABLE INITIALLY DEFERRED,
140 CREATE INDEX serial_stream_dist_idx ON serial.stream (distribution);
142 CREATE UNIQUE INDEX label_once_per_dist
143 ON serial.stream (distribution, routing_label)
144 WHERE routing_label IS NOT NULL;
146 CREATE TABLE serial.routing_list_user (
147 id SERIAL PRIMARY KEY,
149 REFERENCES serial.stream
151 DEFERRABLE INITIALLY DEFERRED,
152 pos INT NOT NULL DEFAULT 1,
153 reader INT REFERENCES actor.usr
155 DEFERRABLE INITIALLY DEFERRED,
158 CONSTRAINT one_pos_per_routing_list UNIQUE ( stream, pos ),
159 CONSTRAINT reader_or_dept CHECK
161 -- Recipient is a person or a department, but not both
162 (reader IS NOT NULL AND department IS NULL) OR
163 (reader IS NULL AND department IS NOT NULL)
166 CREATE INDEX serial_routing_list_user_stream_idx ON serial.routing_list_user (stream);
167 CREATE INDEX serial_routing_list_user_reader_idx ON serial.routing_list_user (reader);
169 CREATE TABLE serial.issuance (
170 id SERIAL PRIMARY KEY,
172 REFERENCES actor.usr (id)
173 DEFERRABLE INITIALLY DEFERRED,
175 REFERENCES actor.usr (id)
176 DEFERRABLE INITIALLY DEFERRED,
177 create_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
178 edit_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
179 subscription INT NOT NULL
180 REFERENCES serial.subscription (id)
182 DEFERRABLE INITIALLY DEFERRED,
184 date_published TIMESTAMP WITH TIME ZONE,
185 caption_and_pattern INT REFERENCES serial.caption_and_pattern (id)
186 DEFERRABLE INITIALLY DEFERRED,
188 holding_type TEXT CONSTRAINT valid_holding_type CHECK
191 OR holding_type IN ('basic','supplement','index')
193 holding_link_id INT -- probably defunct
194 -- TODO: add columns for separate enumeration/chronology values
196 CREATE INDEX serial_issuance_sub_idx ON serial.issuance (subscription);
197 CREATE INDEX serial_issuance_caption_and_pattern_idx ON serial.issuance (caption_and_pattern);
198 CREATE INDEX serial_issuance_date_published_idx ON serial.issuance (date_published);
200 CREATE TABLE serial.unit (
202 detailed_contents TEXT NOT NULL,
203 summary_contents TEXT NOT NULL
204 ) INHERITS (asset.copy);
205 ALTER TABLE serial.unit ADD PRIMARY KEY (id);
206 CREATE UNIQUE INDEX unit_barcode_key ON serial.unit (barcode) WHERE deleted = FALSE OR deleted IS FALSE;
207 CREATE INDEX unit_cn_idx ON serial.unit (call_number);
208 CREATE INDEX unit_avail_cn_idx ON serial.unit (call_number);
209 CREATE INDEX unit_creator_idx ON serial.unit ( creator );
210 CREATE INDEX unit_editor_idx ON serial.unit ( editor );
212 -- must create this rule explicitly; it is not inherited from asset.copy
213 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;
215 CREATE TABLE serial.item (
216 id SERIAL PRIMARY KEY,
218 REFERENCES actor.usr (id)
219 DEFERRABLE INITIALLY DEFERRED,
221 REFERENCES actor.usr (id)
222 DEFERRABLE INITIALLY DEFERRED,
223 create_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
224 edit_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
225 issuance INT NOT NULL
226 REFERENCES serial.issuance (id)
228 DEFERRABLE INITIALLY DEFERRED,
230 REFERENCES serial.stream (id)
232 DEFERRABLE INITIALLY DEFERRED,
233 unit INT REFERENCES serial.unit (id)
235 DEFERRABLE INITIALLY DEFERRED,
236 uri INT REFERENCES asset.uri (id)
238 DEFERRABLE INITIALLY DEFERRED,
239 date_expected TIMESTAMP WITH TIME ZONE,
240 date_received TIMESTAMP WITH TIME ZONE,
241 status TEXT CONSTRAINT valid_status CHECK
243 status IN ('Bindery', 'Bound', 'Claimed', 'Discarded', 'Expected', 'Not Held', 'Not Published', 'Received')
244 ) DEFAULT 'Expected',
245 shadowed BOOL NOT NULL DEFAULT FALSE -- ignore when generating summaries/labels
247 CREATE INDEX serial_item_stream_idx ON serial.item (stream);
248 CREATE INDEX serial_item_issuance_idx ON serial.item (issuance);
249 CREATE INDEX serial_item_unit_idx ON serial.item (unit);
250 CREATE INDEX serial_item_uri_idx ON serial.item (uri);
251 CREATE INDEX serial_item_date_received_idx ON serial.item (date_received);
252 CREATE INDEX serial_item_status_idx ON serial.item (status);
254 CREATE TABLE serial.item_note (
255 id SERIAL PRIMARY KEY,
257 REFERENCES serial.item (id)
259 DEFERRABLE INITIALLY DEFERRED,
261 REFERENCES actor.usr (id)
262 DEFERRABLE INITIALLY DEFERRED,
263 create_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
264 pub BOOL NOT NULL DEFAULT FALSE,
268 CREATE INDEX serial_item_note_item_idx ON serial.item_note (item);
270 CREATE TABLE serial.basic_summary (
271 id SERIAL PRIMARY KEY,
272 distribution INT NOT NULL
273 REFERENCES serial.distribution (id)
275 DEFERRABLE INITIALLY DEFERRED,
276 generated_coverage TEXT NOT NULL,
277 textual_holdings TEXT
279 CREATE INDEX serial_basic_summary_dist_idx ON serial.basic_summary (distribution);
281 CREATE TABLE serial.supplement_summary (
282 id SERIAL PRIMARY KEY,
283 distribution INT NOT NULL
284 REFERENCES serial.distribution (id)
286 DEFERRABLE INITIALLY DEFERRED,
287 generated_coverage TEXT NOT NULL,
288 textual_holdings TEXT
290 CREATE INDEX serial_supplement_summary_dist_idx ON serial.supplement_summary (distribution);
292 CREATE TABLE serial.index_summary (
293 id SERIAL PRIMARY KEY,
294 distribution INT NOT NULL
295 REFERENCES serial.distribution (id)
297 DEFERRABLE INITIALLY DEFERRED,
298 generated_coverage TEXT NOT NULL,
299 textual_holdings TEXT
301 CREATE INDEX serial_index_summary_dist_idx ON serial.index_summary (distribution);