Merging affix/parts/unified-item-editor from upstream
authorMike Rylander <mrylander@gmail.com>
Wed, 30 Mar 2011 13:34:45 +0000 (09:34 -0400)
committerMike Rylander <mrylander@gmail.com>
Wed, 30 Mar 2011 13:34:45 +0000 (09:34 -0400)
1  2 
Open-ILS/examples/fm_IDL.xml
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/biblio.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm
Open-ILS/src/sql/Pg/010.schema.biblio.sql
Open-ILS/src/sql/Pg/040.schema.asset.sql
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/990.schema.unapi.sql

Simple merge
@@@ -23,20 -23,12 +23,28 @@@ biblio::record_note->columns( Essentia
  #-------------------------------------------------------------------------------
  
  #-------------------------------------------------------------------------------
 +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;
  
@@@ -1,18 -1,17 +1,29 @@@
  {
  
+     #-------------------------------------------------------------------------------
+     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' );
@@@ -79,16 -79,30 +79,42 @@@ CREATE INDEX biblio_record_note_record_
  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;
@@@ -91,9 -91,15 +91,16 @@@ CREATE INDEX cp_editor_idx   ON asset.c
  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
  );
@@@ -576,18 -608,17 +619,25 @@@ CREATE OR REPLACE FUNCTION unapi.acp ( 
                      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