#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
+package biblio::peer_type;
+use base qw/biblio/;
+
+biblio::peer_type->table( 'biblio_peer_type' );
+biblio::peer_type->columns( Essential => qw/id name/ );
+#-------------------------------------------------------------------------------
+
+#-------------------------------------------------------------------------------
+package biblio::peer_record_copy_map;
+use base qw/biblio/;
+
+biblio::peer_record_copy_map->table( 'biblio_peer_record_copy_map' );
+biblio::peer_record_copy_map->columns( Essential => qw/id peer_type peer_record target_copy/ );
+#-------------------------------------------------------------------------------
+
++#-------------------------------------------------------------------------------
+ package biblio::monograph_part;
+ use base qw/biblio/;
+
+ biblio::monograph_part->table( 'biblio_monograph_part' );
+ biblio::monograph_part->columns( Essential => qw/id record label label_sortkey/ );
+ #-------------------------------------------------------------------------------
+
1;
{
+ #-------------------------------------------------------------------------------
+ package asset::copy_part_map;
+
+ asset::copy_part_map->table( 'asset.copy_part_map' );
+
+ #-------------------------------------------------------------------------------
+ package biblio::monograph_part;
+
+ biblio::monograph_part->table( 'biblio.monograph_part' );
+ biblio::monograph_part->sequence( 'biblio.monograph_part_id_seq' );
+
#-------------------------------------------------------------------------------
+ package biblio::peer_record_copy_map;
+
+ biblio::peer_record_copy_map->table( 'biblio.peer_record_copy_map' );
+ biblio::peer_record_copy_map->sequence( 'biblio.peer_record_copy_map_id_seq' );
+
+ #-------------------------------------------------------------------------------
+ package biblio::peer_type;
+
+ biblio::peer_type->table( 'biblio.peer_type' );
+ biblio::peer_type->sequence( 'biblio.peer_type_id_seq' );
+
+ #-------------------------------------------------------------------------------
package container::user_bucket;
container::user_bucket->table( 'container.user_bucket' );
CREATE INDEX biblio_record_note_creator_idx ON biblio.record_note ( creator );
CREATE INDEX biblio_record_note_editor_idx ON biblio.record_note ( editor );
+CREATE TABLE biblio.peer_type (
+ id SERIAL PRIMARY KEY,
+ name TEXT NOT NULL UNIQUE -- i18n
+);
+
+CREATE TABLE biblio.peer_bib_copy_map (
+ id SERIAL PRIMARY KEY,
+ peer_type INT NOT NULL REFERENCES biblio.peer_type (id),
+ peer_record BIGINT NOT NULL REFERENCES biblio.record_entry (id),
+ target_copy BIGINT NOT NULL -- can't use fkey because of acp subtables
+);
++=======
+ CREATE TABLE biblio.monograph_part (
+ id SERIAL PRIMARY KEY,
+ record BIGINT NOT NULL REFERENCES biblio.record_entry (id),
+ label TEXT NOT NULL,
+ label_sortkey TEXT NOT NULL,
+ CONSTRAINT record_label_unique UNIQUE (record,label)
+ );
+
+ CREATE OR REPLACE FUNCTION biblio.normalize_biblio_monograph_part_sortkey () RETURNS TRIGGER AS $$
+ BEGIN
+ NEW.label_sortkey := REGEXP_REPLACE(
+ lpad_number_substrings(
+ naco_normalize(NEW.label),
+ '0',
+ 10
+ ),
+ E'\\s+',
+ '',
+ 'g'
+ );
+ RETURN NEW;
+ END;
+ $$ LANGUAGE PLPGSQL;
+
+ CREATE TRIGGER norm_sort_label BEFORE INSERT OR UPDATE ON biblio.monograph_part FOR EACH ROW EXECUTE PROCEDURE biblio.normalize_biblio_monograph_part_sortkey();
COMMIT;
CREATE INDEX cp_create_date ON asset.copy (create_date);
CREATE RULE protect_copy_delete AS ON DELETE TO asset.copy DO INSTEAD UPDATE asset.copy SET deleted = TRUE WHERE OLD.id = asset.copy.id;
+ CREATE TABLE asset.copy_part_map (
+ id SERIAL PRIMARY KEY,
+ target_copy BIGINT NOT NULL, -- points o asset.copy
+ part INT NOT NULL REFERENCES biblio.monograph_part (id) ON DELETE CASCADE
+ );
+ CREATE UNIQUE INDEX copy_part_map_cp_part_idx ON asset.copy_part_map (target_copy, part);
+
CREATE TABLE asset.opac_visible_copies (
- id BIGINT primary key, -- copy id
+ id BIGSERIAL primary key,
+ copy_id BIGINT, -- copy id
record BIGINT,
circ_lib INTEGER
);
XMLELEMENT( name statcats,
CASE
WHEN ('ascecm' = ANY ($4)) THEN
- XMLAGG((SELECT unapi.acpn( stat_cat_entry, 'xml', 'statcat', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8) FROM asset.stat_cat_entry_copy_map WHERE owning_copy = cp.id))
+ XMLAGG((SELECT unapi.ascecm( stat_cat_entry, 'xml', 'statcat', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8) FROM asset.stat_cat_entry_copy_map WHERE owning_copy = cp.id))
ELSE NULL
END
- )
+ ),
+ XMLELEMENT( name foreign_records,
+ CASE
+ WHEN ('bre' = ANY ($4)) THEN
+ XMLAGG((SELECT unapi.bre(peer_bib,'marcxml','record','{}'::TEXT[], $5, $6, $7, $8) FROM biblio.peer_bib_copy_map WHERE target_copy = cp.id))
+ ELSE NULL
+ END,
+
- )
++ ),
+ CASE
+ WHEN ('bmp' = ANY ($4)) THEN
+ XMLELEMENT( name monograph_parts,
+ XMLAGG((SELECT unapi.bmp( part, 'xml', 'monograph_part', array_remove_item_by_value($4,'acp'), $5, $6, $7, $8) FROM asset.copy_part_map WHERE target_copy = cp.id))
+ )
+ ELSE NULL
+ END
)
FROM asset.copy cp
WHERE id = $1