Fix proximity adjustment calculator
authorMike Rylander <mrylander@gmail.com>
Thu, 16 Jan 2014 18:58:12 +0000 (13:58 -0500)
committerMike Rylander <mrylander@gmail.com>
Thu, 16 Jan 2014 20:24:03 +0000 (15:24 -0500)
The canonical use case for proximity adjustment is to use it broadly
to effect the local proximity of items within a particular area, in
a like manner, across many parts of the org tree.  However, in cases
where it is lightly used, or used with non-overlapping criteria columns,
there are cases where the adjustment will spread beyond its intended
range of influence.

The changes here create a much stricter and correct test for rule
matching, which will end in the correct choice of rules in all cases.

Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/sql/Pg/090.schema.action.sql

index e8aa81e..6ab9ab4 100644 (file)
@@ -1291,12 +1291,17 @@ BEGIN
       FROM  actor.org_unit_proximity_adjustment adj
             LEFT JOIN actor.org_unit_ancestors_distance(copy_context_ou) acp_cl ON (acp_cl.id = adj.item_circ_lib)
             LEFT JOIN actor.org_unit_ancestors_distance(acn.owning_lib) acn_ol ON (acn_ol.id = adj.item_owning_lib)
-            LEFT JOIN actor.org_unit_ancestors_distance(acl.owning_lib) acl_ol ON (acn_ol.id = adj.copy_location)
+            LEFT JOIN actor.org_unit_ancestors_distance(acl.owning_lib) acl_ol ON (acl_ol.id = adj.copy_location)
             LEFT JOIN actor.org_unit_ancestors_distance(ahr.pickup_lib) ahr_pl ON (ahr_pl.id = adj.hold_pickup_lib)
             LEFT JOIN actor.org_unit_ancestors_distance(ahr.request_lib) ahr_rl ON (ahr_rl.id = adj.hold_request_lib)
       WHERE (adj.circ_mod IS NULL OR adj.circ_mod = acp.circ_modifier) AND
-        absolute_adjustment AND
-        COALESCE(acp_cl.id, acn_ol.id, acl_ol.id, ahr_pl.id, ahr_rl.id) IS NOT NULL
+            (adj.item_circ_lib IS NULL OR adj.item_circ_lib = acp_cl.id) AND
+            (adj.item_owning_lib IS NULL OR adj.item_owning_lib = acn_ol.id) AND
+            (adj.copy_location IS NULL OR adj.copy_location = acl_ol.id) AND
+            (adj.hold_pickup_lib IS NULL OR adj.hold_pickup_lib = ahr_pl.id) AND
+            (adj.hold_request_lib IS NULL OR adj.hold_request_lib = ahr_rl.id) AND
+            absolute_adjustment AND
+            COALESCE(acp_cl.id, acn_ol.id, acl_ol.id, ahr_pl.id, ahr_rl.id) IS NOT NULL
       ORDER BY
             COALESCE(acp_cl.distance,999)
                 + COALESCE(acn_ol.distance,999)
@@ -1320,8 +1325,13 @@ BEGIN
                 LEFT JOIN actor.org_unit_ancestors_distance(ahr.pickup_lib) ahr_pl ON (ahr_pl.id = adj.hold_pickup_lib)
                 LEFT JOIN actor.org_unit_ancestors_distance(ahr.request_lib) ahr_rl ON (ahr_rl.id = adj.hold_request_lib)
           WHERE (adj.circ_mod IS NULL OR adj.circ_mod = acp.circ_modifier) AND
-            NOT absolute_adjustment AND
-            COALESCE(acp_cl.id, acn_ol.id, acl_ol.id, ahr_pl.id, ahr_rl.id) IS NOT NULL
+                (adj.item_circ_lib IS NULL OR adj.item_circ_lib = acp_cl.id) AND
+                (adj.item_owning_lib IS NULL OR adj.item_owning_lib = acn_ol.id) AND
+                (adj.copy_location IS NULL OR adj.copy_location = acl_ol.id) AND
+                (adj.hold_pickup_lib IS NULL OR adj.hold_pickup_lib = ahr_pl.id) AND
+                (adj.hold_request_lib IS NULL OR adj.hold_request_lib = ahr_rl.id) AND
+                NOT absolute_adjustment AND
+                COALESCE(acp_cl.id, acn_ol.id, acl_ol.id, ahr_pl.id, ahr_rl.id) IS NOT NULL
     LOOP
         baseline_prox := baseline_prox + aoupa.prox_adjustment;
     END LOOP;