From: Dan Pearl Date: Fri, 13 Jan 2017 20:34:25 +0000 (-0500) Subject: LP#1613341 - Patron name search should be punctuation-insensitive X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=a5ac28bbc8bde2fb5e1585f3725f1033a02a8eb7;p=working%2FEvergreen.git LP#1613341 - Patron name search should be punctuation-insensitive O'Brien will be matched by Obrien, O'Brien, O Brien etc. Grubbly-Plank will be matched by Grubbly Plank, Grubbly-Plank, Grubblyplank, etc. This feature is controlled by the same org setting that controls ignoring of diacritical marks. Signed-off-by: Dan Pearl --- diff --git a/Open-ILS/src/sql/Pg/000.functions.general.sql b/Open-ILS/src/sql/Pg/000.functions.general.sql index 9b95af87be..8b0dd63cc2 100644 --- a/Open-ILS/src/sql/Pg/000.functions.general.sql +++ b/Open-ILS/src/sql/Pg/000.functions.general.sql @@ -89,7 +89,7 @@ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION evergreen.unaccent_and_squash ( IN arg text) RETURNS text IMMUTABLE STRICT AS $$ BEGIN - RETURN evergreen.lowercase(unaccent(regexp_replace(arg, '\s','','g'))); + RETURN evergreen.lowercase(unaccent(regexp_replace(arg, '[\s[:punct:]]','','g'))); END; $$ LANGUAGE PLPGSQL; diff --git a/Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg b/Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg index f09dcf6259..c90014fd3d 100644 --- a/Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg +++ b/Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg @@ -2,7 +2,7 @@ BEGIN; -- Number of tests that will be run -SELECT plan(15); +SELECT plan(18); -- Run the tests @@ -27,7 +27,7 @@ SELECT is(evergreen.unaccent_and_squash('aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsSt 'English Characters'); SELECT is(evergreen.unaccent_and_squash('0123456789!@#$%^&*()-+'), - '0123456789!@#$%^&*()-+', 'Numbers and Symbols'); + '0123456789', 'Numbers and Symbols'); SELECT is(evergreen.unaccent_and_squash('ÁÉÍÑÓÚÜáéíñóúü¿¡'), 'aeinouuaeinouu¿¡', 'Spanish'); @@ -56,6 +56,17 @@ SELECT is(evergreen.unaccent_and_squash('El Niño'), SELECT is(evergreen.unaccent_and_squash('Œuvres'), 'euvres', 'oe ligature'); +-- Punctuation Tests + +SELECT is(evergreen.unaccent_and_squash('O''Brien'), + 'obrien', 'Apostrophe'); + +SELECT is(evergreen.unaccent_and_squash('Grubbly-Plank'), + 'grubblyplank', 'Hyphen'); + +SELECT is(evergreen.unaccent_and_squash('p&#$(a#*&$!s))(\\s'), + 'pass', 'Punctuation hash'); + -- Finish the test and clean up. SELECT * FROM finish(); ROLLBACK; diff --git a/Open-ILS/src/sql/Pg/upgrade/0986.schema.patron_unaccent.sql b/Open-ILS/src/sql/Pg/upgrade/0986.schema.patron_unaccent.sql index 7fb0465ac8..d9730eefa0 100644 --- a/Open-ILS/src/sql/Pg/upgrade/0986.schema.patron_unaccent.sql +++ b/Open-ILS/src/sql/Pg/upgrade/0986.schema.patron_unaccent.sql @@ -7,7 +7,7 @@ CREATE EXTENSION IF NOT EXISTS unaccent SCHEMA public; CREATE OR REPLACE FUNCTION evergreen.unaccent_and_squash ( IN arg text) RETURNS text IMMUTABLE STRICT AS $$ BEGIN - RETURN evergreen.lowercase(unaccent(regexp_replace(arg, '\s','','g'))); + RETURN evergreen.lowercase(unaccent(regexp_replace(arg, '[\s[:punct:]]','','g'))); END; $$ LANGUAGE PLPGSQL; @@ -16,6 +16,14 @@ CREATE INDEX actor_usr_first_given_name_unaccent_idx ON actor.usr (evergreen.una CREATE INDEX actor_usr_second_given_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(second_given_name)); CREATE INDEX actor_usr_family_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(family_name)); +-- If the above is executed and the indices already exist, we need to +-- reindex because the definition of the unaccent_and_squash function +-- has changed. +REINDEX INDEX actor.actor_usr_first_given_name_unaccent_idx; +REINDEX INDEX actor.actor_usr_second_given_name_unaccent_idx; +REINDEX INDEX actor.actor_usr_family_name_unaccent_idx; + + -- DB setting to control behavior; true by default INSERT INTO config.org_unit_setting_type ( name, grp, label, description, datatype ) diff --git a/docs/RELEASE_NOTES_NEXT/Client/patron_punctuation b/docs/RELEASE_NOTES_NEXT/Client/patron_punctuation new file mode 100644 index 0000000000..75b160c86c --- /dev/null +++ b/docs/RELEASE_NOTES_NEXT/Client/patron_punctuation @@ -0,0 +1,10 @@ +Punctuation Insensitive Patron Search +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +When performing a patron search, punctuation characters will be +ignored. So if the patron is named O'Brien, then you can enter Obrien, +O'Brien, O Brien, etc. in the search box. + +This behavior affects the Last Name (internally: family_name), First Name +(first_given_name), and Middle Name (second_given_name) fields of the search. + +