LP#1773832: Empty deleted records can be surfaced in search results
authorMike Rylander <mrylander@gmail.com>
Wed, 20 Jun 2018 13:22:38 +0000 (09:22 -0400)
committerJason Stephenson <jason@sigio.com>
Wed, 27 Jun 2018 23:12:57 +0000 (19:12 -0400)
There are cases where we avoid checking the deleted flag of bibs as an
optimization that avoids a JOIN in the search query.  However, for some
shapes of real-world data, particularly in upgraded instances, deleted
records can slip through.  This commit adds an explicit check for the
flag to all search queries.

Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Daniel Pearl <dpearl@cwmars.org>
Signed-off-by: Jason Stephenson <jason@sigio.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm

index 981bff9..6141d66 100644 (file)
@@ -883,8 +883,8 @@ sub toSQL {
         $bre_join = 'INNER JOIN biblio.record_entry bre ON m.source = bre.id AND bre.deleted';
         # The above suffices for filters too when the #deleted modifier
         # is in use.
         $bre_join = 'INNER JOIN biblio.record_entry bre ON m.source = bre.id AND bre.deleted';
         # The above suffices for filters too when the #deleted modifier
         # is in use.
-    } elsif ($$flat_plan{uses_bre} or !$self->find_modifier('staff')) {
-        $bre_join = 'INNER JOIN biblio.record_entry bre ON m.source = bre.id';
+    } else {
+        $bre_join = 'INNER JOIN biblio.record_entry bre ON m.source = bre.id AND NOT bre.deleted';
     }
 
     my $desc = 'ASC';
     }
 
     my $desc = 'ASC';
@@ -1064,7 +1064,7 @@ sub toSQL {
                 "AND (bre.vis_attr_vector IS NULL OR NOT ( int4range(0,268435455,'[]') @> ANY(bre.vis_attr_vector) ))".
             "))";
         # We need bre here, regardless
                 "AND (bre.vis_attr_vector IS NULL OR NOT ( int4range(0,268435455,'[]') @> ANY(bre.vis_attr_vector) ))".
             "))";
         # We need bre here, regardless
-        $bre_join ||= 'INNER JOIN biblio.record_entry bre ON m.source = bre.id';
+        $bre_join ||= 'INNER JOIN biblio.record_entry bre ON m.source = bre.id AND NOT bre.deleted';
     }
 
     my $final_b_attr_test;
     }
 
     my $final_b_attr_test;