TPac: Avoid long-running, unintended empty searches user/berick/tpac-avoid-empty-query
authorBill Erickson <berick@esilibrary.com>
Mon, 23 Jan 2012 20:00:45 +0000 (15:00 -0500)
committerBill Erickson <berick@esilibrary.com>
Mon, 23 Jan 2012 20:10:05 +0000 (15:10 -0500)
If a page that executes a search is accessed with no viable search
query, cut the search short to avoid meaningless, long-running searches.
This primarily affects direct links to record detail pages.  For
example:

http://example.org/eg/opac/record/123

The RD page attempts to load the currrently active search (for paging) and,
if there is no query, will search for strings like 'site(BR1) depth(2)',
which are unintended and quite slow, which delays page rendering.

---

While we're in there, let's silence the following Apache error log
warning by ensuring that int() gets a value.

Use of uninitialized value in int at
/usr/local/share/perl/5.10.1/OpenILS/WWW/EGCatLoader/Search.pm line 192.

Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm

index bce9cdb..b8907a6 100644 (file)
@@ -70,18 +70,6 @@ sub _prepare_biblio_search {
         $query .= " $1($term)" if length $term;
     }
 
-    # sort is treated specially, even though it's actually a filter
-    if ($cgi->param('sort')) {
-        $query =~ s/sort\([^\)]*\)//g;  # override existing sort(). no stacking.
-        my ($axis, $desc) = split /\./, $cgi->param('sort');
-        $query .= " sort($axis)";
-        if ($desc and not $query =~ /\#descending/) {
-            $query .= '#descending';
-        } elsif (not $desc) {
-            $query =~ s/\#descending//;
-        }
-    }
-
     if ($cgi->param("bookbag")) {
         $query .= " container(bre,bookbag," . int($cgi->param("bookbag")) . ")";
     }
@@ -100,6 +88,23 @@ sub _prepare_biblio_search {
         }
     }
 
+    # ---------------------------------------------------------------------
+    # Nothing below here constitutes a query by itself.  If the query value 
+    # is still empty up to this point, there is no query.  abandon ship.
+    return () unless $query;
+
+    # sort is treated specially, even though it's actually a filter
+    if ($cgi->param('sort')) {
+        $query =~ s/sort\([^\)]*\)//g;  # override existing sort(). no stacking.
+        my ($axis, $desc) = split /\./, $cgi->param('sort');
+        $query .= " sort($axis)";
+        if ($desc and not $query =~ /\#descending/) {
+            $query .= '#descending';
+        } elsif (not $desc) {
+            $query =~ s/\#descending//;
+        }
+    }
+
     my $site;
     my $org = $ctx->{search_ou};
     if (defined($org) and $org ne '' and ($org ne $ctx->{aou_tree}->()->id) and not $query =~ /site\(\S+\)/) {
@@ -184,7 +189,7 @@ sub tag_circed_items {
 sub load_rresults_bookbag {
     my ($self) = @_;
 
-    my $bookbag_id = int($self->cgi->param("bookbag"));
+    my $bookbag_id = int($self->cgi->param("bookbag") || 0);
     return if $bookbag_id < 1;
 
     my %authz = $self->ctx->{"user"} ?