add copy locations as a search filter
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 18 Jun 2008 16:19:09 +0000 (16:19 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 18 Jun 2008 16:19:09 +0000 (16:19 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@9846 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm
Open-ILS/src/sql/Pg/300.schema.staged_search.sql

index 9384334..0beac85 100644 (file)
@@ -2346,12 +2346,17 @@ sub staged_fts {
                die "No search arguments were passed to ".$self->api_name;
        }
 
-       my (@statuses,@types,@forms,@lang,@aud,@lit_form,@vformats,@bib_level);
+       my (@statuses,@locations,@types,@forms,@lang,@aud,@lit_form,@vformats,@bib_level);
 
        if ($args{available}) {
                @statuses = (0,7);
        }
 
+       if (my $s = $args{locations}) {
+               $s = [$s] if (!ref($s));
+               @locations = @$s;
+       }
+
        if (my $s = $args{statuses}) {
                $s = [$s] if (!ref($s));
                @statuses = @$s;
@@ -2444,6 +2449,7 @@ sub staged_fts {
        my $param_depth = $args{depth}; $param_depth = 'NULL' unless (defined($param_depth) and length($param_depth) > 0 );
        my $param_searches = OpenSRF::Utils::JSON->perl2JSON( \%stored_proc_search_args ); $param_searches =~ s/\$//go; $param_searches = '$$'.$param_searches.'$$';
        my $param_statuses = '$${' . join(',', map { s/\$//go; "\"$_\""} @statuses) . '}$$';
+       my $param_locations = '$${' . join(',', map { s/\$//go; "\"$_\""} @locations) . '}$$';
        my $param_audience = '$${' . join(',', map { s/\$//go; "\"$_\"" } @aud) . '}$$';
        my $param_language = '$${' . join(',', map { s/\$//go; "\"$_\""} @lang) . '}$$';
        my $param_lit_form = '$${' . join(',', map { s/\$//go; "\"$_\"" } @lit_form) . '}$$';
@@ -2468,6 +2474,7 @@ sub staged_fts {
                     $param_depth,
                     $param_searches,
                     $param_statuses,
+                    $param_locations,
                     $param_audience,
                     $param_language,
                     $param_lit_form,
index ec5bdd3..c663f5b 100644 (file)
@@ -49,6 +49,7 @@ CREATE OR REPLACE FUNCTION search.staged_fts (
     param_depth     INT,
     param_searches  TEXT, -- JSON hash, to be turned into a resultset via search.parse_search_args
     param_statuses  INT[],
+    param_locations INT[],
     param_audience  TEXT[],
     param_language  TEXT[],
     param_lit_form  TEXT[],
@@ -429,6 +430,26 @@ BEGIN
 
         END IF;
 
+        IF param_locations IS NOT NULL AND array_upper(param_locations, 1) > 0 THEN
+
+            PERFORM 1
+              FROM  asset.call_number cn
+                    JOIN asset.copy cp ON (cp.call_number = cn.id)
+              WHERE NOT cn.deleted
+                    AND NOT cp.deleted
+                    AND cp.location IN ( SELECT * FROM search.explode_array( param_locations ) )
+                    AND cn.record IN ( SELECT * FROM search.explode_array( core_result.records ) )
+                    AND cp.circ_lib IN ( SELECT * FROM search.explode_array( search_org_list ) )
+              LIMIT 1;
+
+            IF NOT FOUND THEN
+                -- RAISE NOTICE ' % were all copy_location-excluded ... ', core_result.records;
+                excluded_count := excluded_count + 1;
+                CONTINUE;
+            END IF;
+
+        END IF;
+
         IF staff IS NULL OR NOT staff THEN
 
             PERFORM 1