LP#1596595 AOUS lookup batch by org id
authorBill Erickson <berickxx@gmail.com>
Tue, 7 Feb 2017 17:25:01 +0000 (12:25 -0500)
committerKathy Lussier <klussier@masslnc.org>
Fri, 17 Feb 2017 05:58:53 +0000 (00:58 -0500)
Org unit setting value lookup for batches of org units, instead of the
traditional batches by setting name.

Perl live test included.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
Signed-off-by: Kathy Lussier <klussier@masslnc.org>
Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
Open-ILS/src/perlmods/live_t/21-batch-org-settings.t [new file with mode: 0644]
Open-ILS/src/sql/Pg/020.schema.functions.sql
Open-ILS/src/sql/Pg/upgrade/YYYY.schema.batch_settings_by_org.sql [new file with mode: 0644]

index dca778d..a8c6c9f 100644 (file)
@@ -1333,6 +1333,44 @@ sub ou_ancestor_setting_batch_insecure {
     return %result;
 }
 
+# Returns a hash of hashes like so:
+# { 
+#   $lookup_org_id => {org => $context_org, value => $setting_value},
+#   $lookup_org_id2 => {org => $context_org2, value => $setting_value2},
+#   $lookup_org_id3 => {} # example of no setting value exists
+#   ...
+# }
+sub ou_ancestor_setting_batch_by_org_insecure {
+    my ($self, $org_ids, $name, $e) = @_;
+
+    $e ||= OpenILS::Utils::CStoreEditor->new();
+    my %result = map { $_ => {value => undef} } @$org_ids;
+
+    my $query = {
+        from => [
+            'actor.org_unit_ancestor_setting_batch_by_org',
+            $name, '{' . join(',', @$org_ids) . '}'
+        ]
+    };
+
+    # DB func returns an array of settings matching the order of the
+    # list of org unit IDs.  If the setting does not contain a valid
+    # ->id value, then no setting value exists for that org unit.
+    my $settings = $e->json_query($query);
+    for my $idx (0 .. $#$org_ids) {
+        my $setting = $settings->[$idx];
+        my $org_id = $org_ids->[$idx];
+
+        next unless $setting->{id}; # null ID means no value is present.
+
+        $result{$org_id}->{org} = $setting->{org_unit};
+        $result{$org_id}->{value} = 
+            OpenSRF::Utils::JSON->JSON2perl($setting->{value});
+    }
+
+    return %result;
+}
+
 # returns the ISO8601 string representation of the requested epoch in GMT
 sub epoch2ISO8601 {
     my( $self, $epoch ) = @_;
diff --git a/Open-ILS/src/perlmods/live_t/21-batch-org-settings.t b/Open-ILS/src/perlmods/live_t/21-batch-org-settings.t
new file mode 100644 (file)
index 0000000..27d88b5
--- /dev/null
@@ -0,0 +1,43 @@
+#!perl
+use strict; use warnings;
+use Test::More tests => 180; # 15 orgs * 12 settings
+use OpenILS::Utils::TestUtils;
+use OpenILS::Application::AppUtils;
+my $U = 'OpenILS::Application::AppUtils';
+
+diag("Tests batch org setting retrieval");
+
+my $script = OpenILS::Utils::TestUtils->new();
+$script->bootstrap;
+
+my $org_ids = [1 .. 15];
+# All settings at time of writing.  None of these have view perms.
+my @settings = qw/
+    circ.patron_search.diacritic_insensitive
+    circ.checkout_auto_renew_age
+    cat.label.font.weight
+    cat.spine.line.height
+    circ.grace.extend
+    cat.label.font.size
+    circ.booking_reservation.default_elbow_room
+    cat.spine.line.width
+    lib.info_url
+    circ.hold_go_home_interval
+    cat.label.font.family
+    cat.spine.line.margin
+/;
+
+# compare the values returned from the batch-by-org setting to the
+# traditional setting value lookup call.
+for my $setting (@settings) {
+    my %batch_settings = 
+        $U->ou_ancestor_setting_batch_by_org_insecure($org_ids, $setting);
+
+    for my $org_id (@$org_ids) {
+        my $value = $U->ou_ancestor_setting_value($org_id, $setting);
+        is($value, $batch_settings{$org_id}->{value}, 
+            "Value matches for setting $setting and org $org_id");
+    }
+}
+
+
index 7cc5be0..b256087 100644 (file)
@@ -321,6 +321,26 @@ For each setting name passed, search "up" the org_unit tree until
 we find the first occurrence of an org_unit_setting with the given name.
 $$;
 
+CREATE OR REPLACE FUNCTION actor.org_unit_ancestor_setting_batch_by_org(
+    setting_name TEXT, org_ids INTEGER[]) 
+    RETURNS SETOF actor.org_unit_setting AS 
+$FUNK$
+DECLARE
+    setting RECORD;
+    org_id INTEGER;
+BEGIN
+    /*  Returns one actor.org_unit_setting row per org unit ID provided.
+        When no setting exists for a given org unit, the setting row
+        will contain all empty values. */
+    FOREACH org_id IN ARRAY org_ids LOOP
+        SELECT INTO setting * FROM 
+            actor.org_unit_ancestor_setting(setting_name, org_id);
+        RETURN NEXT setting;
+    END LOOP;
+    RETURN;
+END;
+$FUNK$ LANGUAGE plpgsql STABLE;
+
 CREATE OR REPLACE FUNCTION evergreen.get_barcodes(select_ou INT, type TEXT, in_barcode TEXT) RETURNS SETOF evergreen.barcode_set AS $$
 DECLARE
     cur_barcode TEXT;
diff --git a/Open-ILS/src/sql/Pg/upgrade/YYYY.schema.batch_settings_by_org.sql b/Open-ILS/src/sql/Pg/upgrade/YYYY.schema.batch_settings_by_org.sql
new file mode 100644 (file)
index 0000000..567183f
--- /dev/null
@@ -0,0 +1,24 @@
+BEGIN;
+
+CREATE OR REPLACE FUNCTION actor.org_unit_ancestor_setting_batch_by_org(
+    setting_name TEXT, org_ids INTEGER[]) 
+    RETURNS SETOF actor.org_unit_setting AS 
+$FUNK$
+DECLARE
+    setting RECORD;
+    org_id INTEGER;
+BEGIN
+    /*  Returns one actor.org_unit_setting row per org unit ID provided.
+        When no setting exists for a given org unit, the setting row
+        will contain all empty values. */
+    FOREACH org_id IN ARRAY org_ids LOOP
+        SELECT INTO setting * FROM 
+            actor.org_unit_ancestor_setting(setting_name, org_id);
+        RETURN NEXT setting;
+    END LOOP;
+    RETURN;
+END;
+$FUNK$ LANGUAGE plpgsql STABLE;
+
+COMMIT;
+