From: Mike Rylander Date: Fri, 18 Feb 2011 20:25:16 +0000 (-0500) Subject: CN prefix/suffix DB bits X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=ca0d7708994770dc93035aa53036951f09a9965a;p=evergreen%2Fequinox.git CN prefix/suffix DB bits --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 60e38b8a39..55b6f9c95f 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -1732,6 +1732,44 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1749,6 +1787,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + @@ -1760,6 +1800,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm index 39eb01b2ad..454a41ce4e 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/asset.pm @@ -21,6 +21,22 @@ __PACKAGE__->columns( Primary => qw/id/ ); __PACKAGE__->columns( Essential => qw/location org position/ ); #------------------------------------------------------------------------------- +package asset::call_number_suffix; +use base qw/asset/; + +__PACKAGE__->table( 'asset_call_number_suffix' ); +__PACKAGE__->columns( Primary => qw/id/ ); +__PACKAGE__->columns( Essential => qw/owning_lib label label_sortkey/ ); + +#------------------------------------------------------------------------------- +package asset::call_number_prefix; +use base qw/asset/; + +__PACKAGE__->table( 'asset_call_number_prefix' ); +__PACKAGE__->columns( Primary => qw/id/ ); +__PACKAGE__->columns( Essential => qw/owning_lib label label_sortkey/ ); + +#------------------------------------------------------------------------------- package asset::call_number_class; use base qw/asset/; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm index 5ca6fd008b..ab987bfd59 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm @@ -322,6 +322,18 @@ asset::call_number->sequence( 'asset.call_number_id_seq' ); #--------------------------------------------------------------------- + package asset::call_number_suffix; + + asset::call_number_suffix->table( 'asset.call_number_suffix' ); + asset::call_number_suffix->sequence( 'asset.call_number_suffix_id_seq' ); + + #--------------------------------------------------------------------- + package asset::call_number_prefix; + + asset::call_number_prefix->table( 'asset.call_number_prefix' ); + asset::call_number_prefix->sequence( 'asset.call_number_prefix_id_seq' ); + + #--------------------------------------------------------------------- package asset::call_number_class; asset::call_number_class->table( 'asset.call_number_class' ); diff --git a/Open-ILS/src/sql/Pg/040.schema.asset.sql b/Open-ILS/src/sql/Pg/040.schema.asset.sql index cb738963e3..e9c4dd650c 100644 --- a/Open-ILS/src/sql/Pg/040.schema.asset.sql +++ b/Open-ILS/src/sql/Pg/040.schema.asset.sql @@ -275,6 +275,44 @@ INSERT INTO asset.call_number_class (name, normalizer, field) VALUES ('Library of Congress (LC)', 'asset.label_normalizer_lc', '050ab,055ab') ; +CREATE OR REPLACE FUNCTION asset.normalize_affix_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 TABLE asset.call_number_preffix ( + id SERIAL PRIMARY KEY, + owning_lib INT NOT NULL REFERENCES actor.org_unit (id), + label TEXT NOT NULL, -- i18n + label_sortkey TEXT +); +CREATE TRIGGER prefix_normalize_tgr ON asset.call_number_preffix BEFORE INSERT OR UPDATE FOR EACH ROW EXECUTE asset.normalize_affix_sortkey(); +CREATE UNIQUE INDEX asset_call_number_prefix_once_per_lib ON asset.call_number_prefix (label, owning_lib); +CREATE INDEX asset_call_number_prefix_sortkey_idx ON asset.call_number_prefix (label_sortkey); +INSERT INTO asset.call_number_preffix (id, owning_lib, label) VALUES (-1, 1, ''); + +CREATE TABLE asset.call_number_sufffix ( + id SERIAL PRIMARY KEY, + owning_lib INT NOT NULL REFERENCES actor.org_unit (id), + label TEXT NOT NULL, -- i18n + label_sortkey TEXT +); +CREATE TRIGGER suffix_normalize_tgr ON asset.call_number_sufffix BEFORE INSERT OR UPDATE FOR EACH ROW EXECUTE asset.normalize_affix_sortkey(); +CREATE UNIQUE INDEX asset_call_number_suffix_once_per_lib ON asset.call_number_suffix (label, owning_lib); +CREATE INDEX asset_call_number_suffix_sortkey_idx ON asset.call_number_suffix (label_sortkey); +INSERT INTO asset.call_number_sufffix (id, owning_lib, label) VALUES (-1, 1, ''); + CREATE TABLE asset.call_number ( id bigserial PRIMARY KEY, creator BIGINT NOT NULL, @@ -282,9 +320,11 @@ CREATE TABLE asset.call_number ( editor BIGINT NOT NULL, edit_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(), record bigint NOT NULL, - owning_lib INT NOT NULL, + owning_lib INT NOT NULL, label TEXT NOT NULL, deleted BOOL NOT NULL DEFAULT FALSE, + prefix INT NOT NULL DEFAULT -1 REFERENCES asset.call_number_prefix(id) DEFERRABLE INITIALLY DEFERRED, + suffix INT NOT NULL DEFAULT -1 REFERENCES asset.call_number_suffix(id) DEFERRABLE INITIALLY DEFERRED, label_class BIGINT DEFAULT 1 NOT NULL REFERENCES asset.call_number_class(id) DEFERRABLE INITIALLY DEFERRED, @@ -296,7 +336,7 @@ CREATE INDEX asset_call_number_editor_idx ON asset.call_number (editor); CREATE INDEX asset_call_number_dewey_idx ON asset.call_number (public.call_number_dewey(label)); CREATE INDEX asset_call_number_upper_label_id_owning_lib_idx ON asset.call_number (oils_text_as_bytea(label),id,owning_lib); CREATE INDEX asset_call_number_label_sortkey ON asset.call_number(oils_text_as_bytea(label_sortkey)); -CREATE UNIQUE INDEX asset_call_number_label_once_per_lib ON asset.call_number (record, owning_lib, label) WHERE deleted = FALSE OR deleted IS FALSE; +CREATE UNIQUE INDEX asset_call_number_label_once_per_lib ON asset.call_number (record, owning_lib, label, prefix, suffix) WHERE deleted = FALSE OR deleted IS FALSE; CREATE INDEX asset_call_number_label_sortkey_browse ON asset.call_number(oils_text_as_bytea(label_sortkey), oils_text_as_bytea(label), id, owning_lib) WHERE deleted IS FALSE OR deleted = FALSE; CREATE RULE protect_cn_delete AS ON DELETE TO asset.call_number DO INSTEAD UPDATE asset.call_number SET deleted = TRUE WHERE OLD.id = asset.call_number.id; CREATE TRIGGER asset_label_sortkey_trigger