LP#1155313: upgrade script and pgTAP tests for monograph_part label normalization fix
authorDan Pearl <dpearl@cwmars.org>
Mon, 5 Jan 2015 18:28:13 +0000 (13:28 -0500)
committerGalen Charlton <gmc@esilibrary.com>
Mon, 2 Mar 2015 14:00:26 +0000 (14:00 +0000)
Signed-off-by: Daniel Pearl <dpearl@cwmars.org>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>

Open-ILS/src/sql/Pg/t/lpad_number_substrings.pg [new file with mode: 0644]
Open-ILS/src/sql/Pg/upgrade/XXXX.schema.lpad-number-repair.sql [new file with mode: 0644]

diff --git a/Open-ILS/src/sql/Pg/t/lpad_number_substrings.pg b/Open-ILS/src/sql/Pg/t/lpad_number_substrings.pg
new file mode 100644 (file)
index 0000000..e7f2729
--- /dev/null
@@ -0,0 +1,41 @@
+
+-- Turn off echo and keep things quiet.
+\set ECHO
+\set QUIET 1
+
+-- Format the output for nice TAP.
+\pset format unaligned
+\pset tuples_only true
+\pset pager
+
+-- Revert all changes on failure.
+\set ON_ERROR_ROLLBACK 1
+\set ON_ERROR_STOP true
+\set QUIET 1
+
+-- Load the TAP functions.
+BEGIN;
+
+-- Plan the tests.
+SELECT plan(5);
+
+-- Run the tests.
+SELECT is(evergreen.lpad_number_substrings(
+       'Appendix','0',5), 'Appendix','Non-numeric string');
+
+SELECT is(evergreen.lpad_number_substrings(
+       'DISC 11','0',5), 'DISC 00011','Prefix, 1 number');
+
+SELECT is(evergreen.lpad_number_substrings(
+       'DISC 14.1','0',5), 'DISC 00014.00001','Prefix, 2 numbers');
+
+SELECT is(evergreen.lpad_number_substrings(
+       'DISC 12.12.13','0',5), 'DISC 00012.00012.00013','Prefix, 3 numbers');
+
+SELECT is(evergreen.lpad_number_substrings(
+       'Vol 5a-15','0',5), 'DISC 00005a-00015','Mixed format');
+
+
+-- Finish the tests and clean up.
+SELECT * FROM finish();
+ROLLBACK;
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.lpad-number-repair.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.lpad-number-repair.sql
new file mode 100644 (file)
index 0000000..7b79fc4
--- /dev/null
@@ -0,0 +1,19 @@
+BEGIN;
+
+CREATE OR REPLACE FUNCTION evergreen.lpad_number_substrings( TEXT, TEXT, INT ) RETURNS TEXT AS $$
+    my $string = shift;            # Source string
+    my $pad = shift;               # string to fill.  Typically '0'. This should be a single character.
+    my $len = shift;               # length of resultant padded field
+    my $find = $len - 1;
+
+    while ($string =~ /(^|\D)(\d{1,$find})($|\D)/) {
+        my $padded = $2;
+        $padded = $pad x ($len - length($padded)) . $padded;
+        $string = $` . $1 . $padded . $3 . $';
+    }
+
+    return $string;
+$$ LANGUAGE PLPERLU;
+
+COMMIT;
+