LP#1673799: new acqedim index to speed up duplicate file check
authorGalen Charlton <gmc@equinoxinitiative.org>
Fri, 17 Mar 2017 15:47:46 +0000 (11:47 -0400)
committerBill Erickson <berickxx@gmail.com>
Wed, 17 May 2017 16:55:45 +0000 (12:55 -0400)
This patch adds a new index on acq.edi_message to speed up
the check for duplicate EDI messages that edi_fetcher.pl runs,
replacing use of "ilike" with invocations of the evergreen.lowercase()
stored procedure.

To test
-------
[1] Arrange to create or simulate an EDI message that failed
    processing.
[2] Run edi_fetcher.pl to have it attempt to download the
    failed message in step #1; verify that the file is
    /not/ downloaded again and that no additonal acq.edi_message
    rows are created for it.
[3] (Extra credit) Try steps 1 and 2 in a database that has a
    very large number of rows in acq.edi_message.

Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
Open-ILS/src/sql/Pg/200.schema.acq.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.schema.index_edi_message_remote_file.sql [new file with mode: 0644]

index 8676a6b..49feb96 100644 (file)
@@ -135,7 +135,10 @@ sub retrieve_core {
                             password => $account->password,
                             in_dir => $account->in_dir
                         },
-                        remote_file => {ilike => $remote_file},
+                        remote_file => {'=' => {
+                            transform => 'evergreen.lowercase',
+                            value => ['evergreen.lowercase', $remote_file]
+                        }},
                         status      => {'in' => [qw/ processed proc_error trans_error /]},
                     },
                     { join => {"acqedi" => {}}, limit => 1 }
index 309e80f..6391e68 100644 (file)
@@ -786,6 +786,7 @@ CREATE TABLE acq.edi_message (
 );
 CREATE INDEX edi_message_account_status_idx ON acq.edi_message (account,status);
 CREATE INDEX edi_message_po_idx ON acq.edi_message (purchase_order);
+CREATE INDEX edi_message_remote_file_idx ON acq.edi_message (evergreen.lowercase(remote_file));
 
 -- Note below that the primary key is NOT a SERIAL type.  We will periodically truncate and rebuild
 -- the table, assigning ids programmatically instead of using a sequence.
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.index_edi_message_remote_file.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.index_edi_message_remote_file.sql
new file mode 100644 (file)
index 0000000..4169161
--- /dev/null
@@ -0,0 +1,7 @@
+BEGIN;
+
+-- SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+CREATE INDEX edi_message_remote_file_idx ON acq.edi_message (evergreen.lowercase(remote_file));
+
+COMMIT;