From eba5988358887ce415bf2a7cee366504200b43e3 Mon Sep 17 00:00:00 2001 From: Lebbeous Fogle-Weekley Date: Thu, 23 May 2013 12:23:49 -0400 Subject: [PATCH] OPAC Browse: Better display of tracings from authorities MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We now preserve subfield order, we don't rely on inter-subfield whitespace, and we omit subfields ‡w, ‡2, ‡4, and ‡5 from display. You can actually configure which subfields are used for display now via the display_sf_list column of the authority.control_set_authority_field table. Signed-off-by: Lebbeous Fogle-Weekley --- Open-ILS/examples/fm_IDL.xml | 1 + .../perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm | 24 +++-- Open-ILS/src/sql/Pg/011.schema.authority.sql | 1 + Open-ILS/src/sql/Pg/950.data.seed-values.sql | 111 +++++++++++---------- .../sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql | 24 ++++- 5 files changed, 98 insertions(+), 63 deletions(-) diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index c274a63713..27b0f4dc2e 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -2116,6 +2116,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm index fad65f0141..ab98c46b86 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Browse.pm @@ -22,6 +22,8 @@ my $U = 'OpenILS::Application::AppUtils'; my $browse_cache; my $browse_timeout; +# Plain procedural functions start here. +# sub _init_browse_cache { if (not defined $browse_cache) { my $conf = new OpenSRF::Utils::SettingsClient; @@ -33,6 +35,18 @@ sub _init_browse_cache { } } +sub _get_authority_heading { + my ($field, $sf_lookup) = @_; + + return join( + " ", + map { $_->[1] } grep { $sf_lookup->{$_->[0]} } $field->subfields + ); +} + +# Object methods start here. +# + # Returns cache key and a list of parameters for DB proc metabib.browse(). sub prepare_browse_parameters { my ($self) = @_; @@ -134,17 +148,11 @@ sub find_authority_headings_and_notes { # therefore *aren't* main entries, which is what we want. foreach my $acsaf (grep { $_->main_entry } values(%$acsaf_table)) { my @fields = $record->field($acsaf->tag); + my %sf_lookup = map { $_ => 1 } split("", $acsaf->display_sf_list); my @headings; foreach my $field (@fields) { - my $h = { - heading => join( - "", grep( - defined, - map { $field->subfield($_) } split("", $acsaf->sf_list) - ) - ) - }; + my $h = { heading => _get_authority_heading($field, \%sf_lookup) }; # XXX I was getting "target" from authority.authority_linking, but # that makes no sense: that table can only tell you that one diff --git a/Open-ILS/src/sql/Pg/011.schema.authority.sql b/Open-ILS/src/sql/Pg/011.schema.authority.sql index 6d4fb508b7..3277555656 100644 --- a/Open-ILS/src/sql/Pg/011.schema.authority.sql +++ b/Open-ILS/src/sql/Pg/011.schema.authority.sql @@ -35,6 +35,7 @@ CREATE TABLE authority.control_set_authority_field ( tag CHAR(3) NOT NULL, nfi CHAR(1), -- non-filing indicator sf_list TEXT NOT NULL, + display_sf_list TEXT NOT NULL, name TEXT NOT NULL, -- i18n description TEXT, -- i18n linking_subfield CHAR(1) diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql index 7cc452f9d2..45dc921609 100644 --- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql +++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql @@ -10339,65 +10339,76 @@ INSERT INTO authority.control_set (id, name, description) VALUES ( ); -- Entries that need to respect an NFI -INSERT INTO authority.control_set_authority_field (id, control_set, main_entry, tag, sf_list, name, nfi) VALUES - (4, 1, NULL, '130', 'adfgklmnoprstvxyz', oils_i18n_gettext('4','Heading -- Uniform Title','acsaf','name'), '2'), - (24, 1, 4, '530', 'adfgiklmnoprstvwxyz4', oils_i18n_gettext('24','See Also From Tracing -- Uniform Title','acsaf','name'), '2'), - (44, 1, 4, '730', 'adfghklmnoprstvwxyz25', oils_i18n_gettext('44','Established Heading Linking Entry -- Uniform Title','acsaf','name'), '2'), - (64, 1, 4, '430', 'adfgiklmnoprstvwxyz4', oils_i18n_gettext('64','See Also Tracing -- Uniform Title','acsaf','name'), '2'); +INSERT INTO authority.control_set_authority_field (id, control_set, main_entry, tag, sf_list, display_sf_list, name, nfi) VALUES + (4, 1, NULL, '130', 'adfgklmnoprstvxyz', 'adfgklmnoprstvxyz', oils_i18n_gettext('4','Heading -- Uniform Title','acsaf','name'), '2'), + (24, 1, 4, '530', 'adfgiklmnoprstvwxyz4', 'adfgiklmnoprstvxyz', oils_i18n_gettext('24','See Also From Tracing -- Uniform Title','acsaf','name'), '2'), + (44, 1, 4, '730', 'adfghklmnoprstvwxyz25', 'adfghklmnoprstvxyz', oils_i18n_gettext('44','Established Heading Linking Entry -- Uniform Title','acsaf','name'), '2'), + (64, 1, 4, '430', 'adfgiklmnoprstvwxyz4', 'adfgiklmnoprstvxyz', oils_i18n_gettext('64','See Also Tracing -- Uniform Title','acsaf','name'), '2'); -INSERT INTO authority.control_set_authority_field (id, control_set, main_entry, tag, sf_list, name) VALUES +INSERT INTO authority.control_set_authority_field (id, control_set, main_entry, tag, sf_list, display_sf_list, name) VALUES -- Main entries - (1, 1, NULL, '100', 'abcdefklmnopqrstvxyz', oils_i18n_gettext('1','Heading -- Personal Name','acsaf','name')), - (2, 1, NULL, '110', 'abcdefgklmnoprstvxyz', oils_i18n_gettext('2','Heading -- Corporate Name','acsaf','name')), - (3, 1, NULL, '111', 'acdefgklnpqstvxyz', oils_i18n_gettext('3','Heading -- Meeting Name','acsaf','name')), - (5, 1, NULL, '150', 'abvxyz', oils_i18n_gettext('5','Heading -- Topical Term','acsaf','name')), - (6, 1, NULL, '151', 'avxyz', oils_i18n_gettext('6','Heading -- Geographic Name','acsaf','name')), - (7, 1, NULL, '155', 'avxyz', oils_i18n_gettext('7','Heading -- Genre/Form Term','acsaf','name')), - (8, 1, NULL, '180', 'vxyz', oils_i18n_gettext('8','Heading -- General Subdivision','acsaf','name')), - (9, 1, NULL, '181', 'vxyz', oils_i18n_gettext('9','Heading -- Geographic Subdivision','acsaf','name')), - (10, 1, NULL, '182', 'vxyz', oils_i18n_gettext('10','Heading -- Chronological Subdivision','acsaf','name')), - (11, 1, NULL, '185', 'vxyz', oils_i18n_gettext('11','Heading -- Form Subdivision','acsaf','name')), - (12, 1, NULL, '148', 'avxyz', oils_i18n_gettext('12','Heading -- Chronological Term','acsaf','name')), + (1, 1, NULL, '100', 'abcdefklmnopqrstvxyz', 'abcdefklmnopqrstvxyz', + oils_i18n_gettext('1','Heading -- Personal Name','acsaf','name')), + (2, 1, NULL, '110', 'abcdefgklmnoprstvxyz', 'abcdefgklmnoprstvxyz', + oils_i18n_gettext('2','Heading -- Corporate Name','acsaf','name')), + (3, 1, NULL, '111', 'acdefgklnpqstvxyz', 'acdefgklnpqstvxyz', + oils_i18n_gettext('3','Heading -- Meeting Name','acsaf','name')), + (5, 1, NULL, '150', 'abvxyz', 'abvxyz', + oils_i18n_gettext('5','Heading -- Topical Term','acsaf','name')), + (6, 1, NULL, '151', 'avxyz', 'avxyz', + oils_i18n_gettext('6','Heading -- Geographic Name','acsaf','name')), + (7, 1, NULL, '155', 'avxyz', 'avxyz', + oils_i18n_gettext('7','Heading -- Genre/Form Term','acsaf','name')), + (8, 1, NULL, '180', 'vxyz', 'vxyz', + oils_i18n_gettext('8','Heading -- General Subdivision','acsaf','name')), + (9, 1, NULL, '181', 'vxyz', 'vxyz', + oils_i18n_gettext('9','Heading -- Geographic Subdivision','acsaf','name')), + (10, 1, NULL, '182', 'vxyz', 'vxyz', + oils_i18n_gettext('10','Heading -- Chronological Subdivision','acsaf','name')), + (11, 1, NULL, '185', 'vxyz', 'vxyz', + oils_i18n_gettext('11','Heading -- Form Subdivision','acsaf','name')), + (12, 1, NULL, '148', 'avxyz', 'avxyz', + oils_i18n_gettext('12','Heading -- Chronological Term','acsaf','name')), -- See Also From tracings - (21, 1, 1, '500', 'abcdefiklmnopqrstvwxyz4', oils_i18n_gettext('21','See Also From Tracing -- Personal Name','acsaf','name')), - (22, 1, 2, '510', 'abcdefgiklmnoprstvwxyz4', oils_i18n_gettext('22','See Also From Tracing -- Corporate Name','acsaf','name')), - (23, 1, 3, '511', 'acdefgiklnpqstvwxyz4', oils_i18n_gettext('23','See Also From Tracing -- Meeting Name','acsaf','name')), - (25, 1, 5, '550', 'abivwxyz4', oils_i18n_gettext('25','See Also From Tracing -- Topical Term','acsaf','name')), - (26, 1, 6, '551', 'aivwxyz4', oils_i18n_gettext('26','See Also From Tracing -- Geographic Name','acsaf','name')), - (27, 1, 7, '555', 'aivwxyz4', oils_i18n_gettext('27','See Also From Tracing -- Genre/Form Term','acsaf','name')), - (28, 1, 8, '580', 'ivwxyz4', oils_i18n_gettext('28','See Also From Tracing -- General Subdivision','acsaf','name')), - (29, 1, 9, '581', 'ivwxyz4', oils_i18n_gettext('29','See Also From Tracing -- Geographic Subdivision','acsaf','name')), - (30, 1, 10, '582', 'ivwxyz4', oils_i18n_gettext('30','See Also From Tracing -- Chronological Subdivision','acsaf','name')), - (31, 1, 11, '585', 'ivwxyz4', oils_i18n_gettext('31','See Also From Tracing -- Form Subdivision','acsaf','name')), - (32, 1, 12, '548', 'aivwxyz4', oils_i18n_gettext('32','See Also From Tracing -- Chronological Term','acsaf','name')), + (21, 1, 1, '500', 'abcdefiklmnopqrstvwxyz4', 'abcdefiklmnopqrstvxyz', oils_i18n_gettext('21','See Also From Tracing -- Personal Name','acsaf','name')), + (22, 1, 2, '510', 'abcdefgiklmnoprstvwxyz4', 'abcdefgiklmnoprstvxyz', oils_i18n_gettext('22','See Also From Tracing -- Corporate Name','acsaf','name')), + (23, 1, 3, '511', 'acdefgiklnpqstvwxyz4', 'acdefgiklnpqstvxyz', oils_i18n_gettext('23','See Also From Tracing -- Meeting Name','acsaf','name')), + (25, 1, 5, '550', 'abivwxyz4', 'abivxyz', oils_i18n_gettext('25','See Also From Tracing -- Topical Term','acsaf','name')), + (26, 1, 6, '551', 'aivwxyz4', 'aivxyz', oils_i18n_gettext('26','See Also From Tracing -- Geographic Name','acsaf','name')), + (27, 1, 7, '555', 'aivwxyz4', 'aivxyz', oils_i18n_gettext('27','See Also From Tracing -- Genre/Form Term','acsaf','name')), + (28, 1, 8, '580', 'ivwxyz4', 'ivxyz', oils_i18n_gettext('28','See Also From Tracing -- General Subdivision','acsaf','name')), + (29, 1, 9, '581', 'ivwxyz4', 'ivxyz', oils_i18n_gettext('29','See Also From Tracing -- Geographic Subdivision','acsaf','name')), + (30, 1, 10, '582', 'ivwxyz4', 'ivxyz', oils_i18n_gettext('30','See Also From Tracing -- Chronological Subdivision','acsaf','name')), + (31, 1, 11, '585', 'ivwxyz4', 'ivxyz', oils_i18n_gettext('31','See Also From Tracing -- Form Subdivision','acsaf','name')), + (32, 1, 12, '548', 'aivwxyz4', 'aivxyz', oils_i18n_gettext('32','See Also From Tracing -- Chronological Term','acsaf','name')), -- Linking entries - (41, 1, 1, '700', 'abcdefghjklmnopqrstvwxyz25', oils_i18n_gettext('41','Established Heading Linking Entry -- Personal Name','acsaf','name')), - (42, 1, 2, '710', 'abcdefghklmnoprstvwxyz25', oils_i18n_gettext('42','Established Heading Linking Entry -- Corporate Name','acsaf','name')), - (43, 1, 3, '711', 'acdefghklnpqstvwxyz25', oils_i18n_gettext('43','Established Heading Linking Entry -- Meeting Name','acsaf','name')), - (45, 1, 5, '750', 'abvwxyz25', oils_i18n_gettext('45','Established Heading Linking Entry -- Topical Term','acsaf','name')), - (46, 1, 6, '751', 'avwxyz25', oils_i18n_gettext('46','Established Heading Linking Entry -- Geographic Name','acsaf','name')), - (47, 1, 7, '755', 'avwxyz25', oils_i18n_gettext('47','Established Heading Linking Entry -- Genre/Form Term','acsaf','name')), - (48, 1, 8, '780', 'vwxyz25', oils_i18n_gettext('48','Subdivision Linking Entry -- General Subdivision','acsaf','name')), - (49, 1, 9, '781', 'vwxyz25', oils_i18n_gettext('49','Subdivision Linking Entry -- Geographic Subdivision','acsaf','name')), - (50, 1, 10, '782', 'vwxyz25', oils_i18n_gettext('50','Subdivision Linking Entry -- Chronological Subdivision','acsaf','name')), - (51, 1, 11, '785', 'vwxyz25', oils_i18n_gettext('51','Subdivision Linking Entry -- Form Subdivision','acsaf','name')), - (52, 1, 12, '748', 'avwxyz25', oils_i18n_gettext('52','Established Heading Linking Entry -- Chronological Term','acsaf','name')), + (41, 1, 1, '700', 'abcdefghjklmnopqrstvwxyz25', 'abcdefghjklmnopqrstvxyz', oils_i18n_gettext('41','Established Heading Linking Entry -- Personal Name','acsaf','name')), + (42, 1, 2, '710', 'abcdefghklmnoprstvwxyz25', 'abcdefghklmnoprstvxyz', oils_i18n_gettext('42','Established Heading Linking Entry -- Corporate Name','acsaf','name')), + (43, 1, 3, '711', 'acdefghklnpqstvwxyz25', 'acdefghklnpqstvxyz', oils_i18n_gettext('43','Established Heading Linking Entry -- Meeting Name','acsaf','name')), + (45, 1, 5, '750', 'abvwxyz25', 'abvxyz', oils_i18n_gettext('45','Established Heading Linking Entry -- Topical Term','acsaf','name')), + (46, 1, 6, '751', 'avwxyz25', 'avxyz', oils_i18n_gettext('46','Established Heading Linking Entry -- Geographic Name','acsaf','name')), + (47, 1, 7, '755', 'avwxyz25', 'avxyz', oils_i18n_gettext('47','Established Heading Linking Entry -- Genre/Form Term','acsaf','name')), + (48, 1, 8, '780', 'vwxyz25', 'vxyz', oils_i18n_gettext('48','Subdivision Linking Entry -- General Subdivision','acsaf','name')), + (49, 1, 9, '781', 'vwxyz25', 'vxyz', oils_i18n_gettext('49','Subdivision Linking Entry -- Geographic Subdivision','acsaf','name')), + (50, 1, 10, '782', 'vwxyz25', 'vxyz', oils_i18n_gettext('50','Subdivision Linking Entry -- Chronological Subdivision','acsaf','name')), + (51, 1, 11, '785', 'vwxyz25', 'vxyz', oils_i18n_gettext('51','Subdivision Linking Entry -- Form Subdivision','acsaf','name')), + (52, 1, 12, '748', 'avwxyz25', 'avxyz', oils_i18n_gettext('52','Established Heading Linking Entry -- Chronological Term','acsaf','name')), -- See From tracings - (61, 1, 1, '400', 'abcdefiklmnopqrstvwxyz4', oils_i18n_gettext('61','See Also Tracing -- Personal Name','acsaf','name')), - (62, 1, 2, '410', 'abcdefgiklmnoprstvwxyz4', oils_i18n_gettext('62','See Also Tracing -- Corporate Name','acsaf','name')), - (63, 1, 3, '411', 'acdefgiklnpqstvwxyz4', oils_i18n_gettext('63','See Also Tracing -- Meeting Name','acsaf','name')), - (65, 1, 5, '450', 'abivwxyz4', oils_i18n_gettext('65','See Also Tracing -- Topical Term','acsaf','name')), - (66, 1, 6, '451', 'aivwxyz4', oils_i18n_gettext('66','See Also Tracing -- Geographic Name','acsaf','name')), - (67, 1, 7, '455', 'aivwxyz4', oils_i18n_gettext('67','See Also Tracing -- Genre/Form Term','acsaf','name')), - (68, 1, 8, '480', 'ivwxyz4', oils_i18n_gettext('68','See Also Tracing -- General Subdivision','acsaf','name')), - (69, 1, 9, '481', 'ivwxyz4', oils_i18n_gettext('69','See Also Tracing -- Geographic Subdivision','acsaf','name')), - (70, 1, 10, '482', 'ivwxyz4', oils_i18n_gettext('70','See Also Tracing -- Chronological Subdivision','acsaf','name')), - (71, 1, 11, '485', 'ivwxyz4', oils_i18n_gettext('71','See Also Tracing -- Form Subdivision','acsaf','name')), - (72, 1, 12, '448', 'aivwxyz4', oils_i18n_gettext('72','See Also Tracing -- Chronological Term','acsaf','name')); + (61, 1, 1, '400', 'abcdefiklmnopqrstvwxyz4', 'abcdefiklmnopqrstvxyz', oils_i18n_gettext('61','See Also Tracing -- Personal Name','acsaf','name')), + (62, 1, 2, '410', 'abcdefgiklmnoprstvwxyz4', 'abcdefgiklmnoprstvxyz', oils_i18n_gettext('62','See Also Tracing -- Corporate Name','acsaf','name')), + (63, 1, 3, '411', 'acdefgiklnpqstvwxyz4', 'acdefgiklnpqstvxyz', oils_i18n_gettext('63','See Also Tracing -- Meeting Name','acsaf','name')), + (65, 1, 5, '450', 'abivwxyz4', 'abivxyz', oils_i18n_gettext('65','See Also Tracing -- Topical Term','acsaf','name')), + (66, 1, 6, '451', 'aivwxyz4', 'aivxyz', oils_i18n_gettext('66','See Also Tracing -- Geographic Name','acsaf','name')), + (67, 1, 7, '455', 'aivwxyz4', 'aivxyz', oils_i18n_gettext('67','See Also Tracing -- Genre/Form Term','acsaf','name')), + (68, 1, 8, '480', 'ivwxyz4', 'ivxyz', oils_i18n_gettext('68','See Also Tracing -- General Subdivision','acsaf','name')), + (69, 1, 9, '481', 'ivwxyz4', 'ivxyz', oils_i18n_gettext('69','See Also Tracing -- Geographic Subdivision','acsaf','name')), + (70, 1, 10, '482', 'ivwxyz4', 'ivxyz', oils_i18n_gettext('70','See Also Tracing -- Chronological Subdivision','acsaf','name')), + (71, 1, 11, '485', 'ivwxyz4', 'ivxyz', oils_i18n_gettext('71','See Also Tracing -- Form Subdivision','acsaf','name')), + (72, 1, 12, '448', 'aivwxyz4', 'aivxyz', oils_i18n_gettext('72','See Also Tracing -- Chronological Term','acsaf','name')); UPDATE authority.control_set_authority_field SET linking_subfield = '0' WHERE main_entry IS NOT NULL; diff --git a/Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql b/Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql index 2e2e8bab3e..bdd0de5abe 100644 --- a/Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql +++ b/Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib-auth-browse.sql @@ -2,7 +2,18 @@ BEGIN; -- check whether patch can be applied -- SELECT evergreen.upgrade_deps_block_check('YYYY', :eg_version); -ALTER TABLE metabib.browse_entry_def_map ADD COLUMN authority BIGINT REFERENCES authority.record_entry (id) + +ALTER TABLE authority.control_set_authority_field + ADD COLUMN display_sf_list TEXT; + +UPDATE authority.control_set_authority_field + SET display_sf_list = REGEXP_REPLACE(sf_list, '[w254]', '', 'g'); + +ALTER TABLE authority.control_set_authority_field + ALTER COLUMN display_sf_list SET NOT NULL; + +ALTER TABLE metabib.browse_entry_def_map + ADD COLUMN authority BIGINT REFERENCES authority.record_entry (id) ON DELETE SET NULL; ALTER TABLE config.metabib_field ADD COLUMN authority_xpath TEXT; @@ -7093,10 +7104,6 @@ ALTER TABLE metabib.browse_entry ALTER COLUMN sort_value SET NOT NULL; ALTER TABLE metabib.browse_entry ADD UNIQUE (value, sort_value); DROP TRIGGER IF EXISTS mbe_sort_value ON metabib.browse_entry; -\qecho This is a browse-only reingest of your bib records. It may take a while. -SELECT metabib.reingest_metabib_field_entries(id, TRUE, FALSE, TRUE) - FROM biblio.record_entry; - CREATE INDEX browse_entry_sort_value_idx ON metabib.browse_entry USING BTREE (sort_value); @@ -7362,3 +7369,10 @@ UPDATE config.metabib_field field_class = 'author'; COMMIT; + +\qecho This is a browse-only reingest of your bib records. It may take a while. +\qecho You may cancel now without losing the effect of the rest of the +\qecho upgrade script, and arrange the reingest later. +\qecho . +SELECT metabib.reingest_metabib_field_entries(id, TRUE, FALSE, TRUE) + FROM biblio.record_entry; -- 2.11.0