LP#1269911: Database elements of MVF and CRA
[working/Evergreen.git] / Open-ILS / src / sql / Pg / 002.schema.config.sql
index e0aea4c..ef517e9 100644 (file)
@@ -74,7 +74,7 @@ DECLARE
     fld     TEXT;
     cnt     INT;
 BEGIN
-    fld := TG_ARGV[1];
+    fld := TG_ARGV[0];
     EXECUTE 'SELECT COUNT(*) FROM '|| TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME ||' WHERE '|| fld ||' && ($1).'|| fld INTO cnt USING NEW;
     IF cnt > 0 THEN
         RAISE EXCEPTION 'Cannot insert duplicate array into field % of table %', fld, TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME;
@@ -91,7 +91,7 @@ CREATE TRIGGER no_overlapping_deps
     BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
-INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0788', :eg_version); -- bshum/dbwells
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0863', :eg_version); -- senator/dbwells
 
 CREATE TABLE config.bib_source (
        id              SERIAL  PRIMARY KEY,
@@ -174,6 +174,7 @@ CREATE TABLE config.metabib_class (
     label    TEXT    NOT NULL UNIQUE,
     buoyant  BOOL    DEFAULT FALSE NOT NULL,
     restrict BOOL    DEFAULT FALSE NOT NULL,
+    combined BOOL    DEFAULT FALSE NOT NULL,
     a_weight NUMERIC  DEFAULT 1.0 NOT NULL,
     b_weight NUMERIC  DEFAULT 0.4 NOT NULL,
     c_weight NUMERIC  DEFAULT 0.2 NOT NULL,
@@ -192,7 +193,10 @@ CREATE TABLE config.metabib_field (
        facet_field     BOOL    NOT NULL DEFAULT FALSE,
        browse_field    BOOL    NOT NULL DEFAULT TRUE,
        browse_xpath   TEXT,
+       browse_sort_xpath TEXT,
        facet_xpath     TEXT,
+       authority_xpath TEXT,
+       joiner      TEXT,
        restrict        BOOL    DEFAULT FALSE NOT NULL
 );
 COMMENT ON TABLE config.metabib_field IS $$
@@ -235,7 +239,7 @@ $$;
 
 CREATE TABLE config.metabib_field_ts_map (
        id                              SERIAL PRIMARY KEY,
-       metabib_field   INT NOT NULL REFERENCES config.metabib_field (id),
+       metabib_field   INT NOT NULL REFERENCES config.metabib_field (id) ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
        ts_config               TEXT NOT NULL REFERENCES config.ts_config_list (id),
        active                  BOOL NOT NULL DEFAULT TRUE,
        index_weight    CHAR(1) NOT NULL DEFAULT 'C' CHECK (index_weight IN ('A','B','C','D')),
@@ -252,7 +256,7 @@ $$;
 CREATE TABLE config.metabib_search_alias (
     alias       TEXT    PRIMARY KEY,
     field_class TEXT    NOT NULL REFERENCES config.metabib_class (name),
-    field       INT     REFERENCES config.metabib_field (id)
+    field       INT     REFERENCES config.metabib_field (id) ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED
 );
 
 CREATE TABLE config.non_cataloged_type (
@@ -613,6 +617,7 @@ CREATE TABLE config.usr_setting_type (
     grp             TEXT    REFERENCES config.settings_group (name),
     datatype TEXT NOT NULL DEFAULT 'string',
     fm_class TEXT,
+    reg_default TEXT,
 
     --
     -- define valid datatypes
@@ -765,8 +770,10 @@ CREATE TABLE config.record_attr_definition (
     name        TEXT    PRIMARY KEY,
     label       TEXT    NOT NULL, -- I18N
     description TEXT,
+    multi       BOOL    NOT NULL DEFAULT TRUE,  -- will store all values from a record
     filter      BOOL    NOT NULL DEFAULT TRUE,  -- becomes QP filter if true
     sorter      BOOL    NOT NULL DEFAULT FALSE, -- becomes QP sort() axis if true
+    composite   BOOL    NOT NULL DEFAULT FALSE, -- its values are derived from others
 
 -- For pre-extracted fields. Takes the first occurance, uses naive subfield ordering
     tag         TEXT, -- LIKE format
@@ -844,11 +851,16 @@ BEGIN
 END;
 $f$ LANGUAGE PLPGSQL;
 
+CREATE TABLE config.composite_attr_entry_definition(
+    coded_value PRIMARY KEY NOT NULL REFERENCES config.coded_value_map (id) ON UPDATE CASCADE ON DELETE CASCADE,
+    definition  TEXT        NOT NULL -- JSON
+);
+
 -- List applied db patches that are deprecated by (and block the application of) my_db_patch
 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecates ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
     SELECT  DISTINCT l.version
       FROM  config.upgrade_log l
-            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.deprecates)
+            JOIN config.db_patch_dependencies d ON (l.version = ANY(d.deprecates))
       WHERE d.db_patch = $1
 $$ LANGUAGE SQL;
 
@@ -856,7 +868,7 @@ $$ LANGUAGE SQL;
 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_supersedes ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
     SELECT  DISTINCT l.version
       FROM  config.upgrade_log l
-            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.supersedes)
+            JOIN config.db_patch_dependencies d ON (l.version = ANY(d.supersedes))
       WHERE d.db_patch = $1
 $$ LANGUAGE SQL;
 
@@ -902,8 +914,8 @@ Upgrade script % can not be applied:
   deprecated by %
   superseded by %',
             my_db_patch,
-            ARRAY_AGG(evergreen.upgrade_list_applied_deprecates(my_db_patch)),
-            ARRAY_AGG(evergreen.upgrade_list_applied_supersedes(my_db_patch)),
+            (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_deprecates(my_db_patch)),
+            (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_supersedes(my_db_patch)),
             evergreen.upgrade_list_applied_deprecated(my_db_patch),
             evergreen.upgrade_list_applied_superseded(my_db_patch);
     END IF;
@@ -937,7 +949,7 @@ CREATE TABLE config.org_unit_setting_type_log (
     org             INT,   --REFERENCES actor.org_unit (id),
     original_value  TEXT,
     new_value       TEXT,
-    field_name      TEXT      REFERENCES config.org_unit_setting_type (name)
+    field_name      TEXT      REFERENCES config.org_unit_setting_type (name) DEFERRABLE INITIALLY DEFERRED
 );
 
 COMMENT ON TABLE config.org_unit_setting_type_log IS $$
@@ -1035,4 +1047,39 @@ ALTER TABLE config.best_hold_order ADD CHECK ((
     rtime IS NOT NULL
 ));
 
+CREATE OR REPLACE FUNCTION 
+    evergreen.z3950_attr_name_is_valid(TEXT) RETURNS BOOLEAN AS $func$
+    SELECT EXISTS (SELECT 1 FROM config.z3950_attr WHERE name = $1);
+$func$ LANGUAGE SQL STRICT IMMUTABLE;
+
+COMMENT ON FUNCTION evergreen.z3950_attr_name_is_valid(TEXT) IS $$
+Results in TRUE if there exists at least one config.z3950_attr
+with the provided name.  Used by config.z3950_index_field_map
+to verify z3950_attr_type maps.
+$$;
+
+-- drop these in down here since they reference config.metabib_field
+-- and config.record_attr_definition
+CREATE TABLE config.z3950_index_field_map (
+    id              SERIAL  PRIMARY KEY,
+    label           TEXT    NOT NULL, -- i18n
+    metabib_field   INTEGER REFERENCES config.metabib_field(id) ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    record_attr     TEXT    REFERENCES config.record_attr_definition(name),
+    z3950_attr      INTEGER REFERENCES config.z3950_attr(id),
+    z3950_attr_type TEXT,-- REFERENCES config.z3950_attr(name)
+    CONSTRAINT metabib_field_or_record_attr CHECK (
+        metabib_field IS NOT NULL OR 
+        record_attr IS NOT NULL
+    ),
+    CONSTRAINT attr_or_attr_type CHECK (
+        z3950_attr IS NOT NULL OR 
+        z3950_attr_type IS NOT NULL
+    ),
+    -- ensure the selected z3950_attr_type refers to a valid attr name
+    CONSTRAINT valid_z3950_attr_type CHECK (
+        z3950_attr_type IS NULL OR 
+            evergreen.z3950_attr_name_is_valid(z3950_attr_type)
+    )
+);
+
 COMMIT;