new CN browse interface
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 19 Jun 2006 17:10:32 +0000 (17:10 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 19 Jun 2006 17:10:32 +0000 (17:10 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@4676 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/asset.pm
Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm
Open-ILS/src/perlmods/OpenILS/Application/WoRM.pm
Open-ILS/src/sql/Pg/005.schema.actors.sql

index 729b4ea..3a813ec 100644 (file)
@@ -330,6 +330,8 @@ sub cn_browse_target {
                $descendants = "actor.org_unit_descendants($org,$depth)";
        }
 
+       my $orgs = join(',', @{ asset::call_number->db_Main->selectcol_arrayref("SELECT DISTINCT id FROM $descendants;") });
+
        my $top_sql = <<"       SQL";
                select * from (
                        select
@@ -339,10 +341,9 @@ sub cn_browse_target {
                                cn.id
                        from
                                $table cn
-                               join $descendants d
-                                       on (d.id = cn.owning_lib)
                        where
                                upper(label) < ?
+                               and owning_lib in ($orgs)
                        order by upper(label) desc, 4 desc, 2 desc
                        limit $topsize
                ) as bar
@@ -357,10 +358,9 @@ sub cn_browse_target {
                        cn.id
                from
                        $table cn
-                       join $descendants d
-                               on (d.id = cn.owning_lib)
                where
                        upper(label) >= ?
+                       and owning_lib in ($orgs)
                order by upper(label),4,2
                limit $bottomsize;
        SQL
index 677ad02..c2f686d 100644 (file)
@@ -179,6 +179,113 @@ sub tree_walker {
        return @things
 }
 
+sub cn_browse {
+       my $self = shift;
+       my $client = shift;
+
+       my $label = shift;
+       my $ou = shift;
+       my $page_size = shift || 9;
+       my $page = shift || 0;
+
+       my ($before_limit,$after_limit) = (0,0);
+       my ($before_offset,$after_offset) = (0,0);
+
+       if (!$page) {
+               $before_limit = $after_limit = int($page_size / 2);
+               $after_limit += 1 if ($page_size % 2);
+       } else {
+               $before_offset = $after_offset = int($page_size / 2);
+               $before_offset += 1 if ($page_size % 2);
+               $before_limit = $after_limit = $page_size;
+       }
+
+       my $_storage = OpenSRF::AppSession->create( 'open-ils.cstore' );
+
+       my $o_search = { shortname => $ou };
+       if (!$ou || $ou eq '-') {
+               $o_search = { parent_ou => undef };
+       }
+
+       my $orgs = $_storage->request(
+               "open-ils.cstore.direct.actor.org_unit.search",
+               $o_search,
+               { flesh         => 3,
+                 flesh_fields  => { aou        => [qw/children/] }
+               }
+       )->gather(1);
+
+       my @ou_ids = tree_walker($orgs, 'children', sub {shift->id});
+
+       $logger->debug("Searching for CNs at orgs [".join(',',@ou_ids)."], based on $ou");
+
+       my @list = ();
+
+       if ($page <= 0) {
+               my $before = $_storage->request(
+                       "open-ils.cstore.direct.asset.call_number.search.atomic",
+                       { label         => { "<" => { transform => "upper", value => ["upper", $label] } },
+                         owning_lib    => \@ou_ids,
+                       },
+                       { flesh         => 1,
+                         flesh_fields  => { acn => [qw/record owning_lib/] },
+                         order_by      => { acn => "upper(label) desc, id desc, owning_lib desc" },
+                         limit         => $before_limit,
+                         offset        => abs($page) * $page_size - $before_offset,
+                       }
+               )->gather(1);
+               push @list, reverse(@$before);
+       }
+
+       if ($page >= 0) {
+               my $after = $_storage->request(
+                       "open-ils.cstore.direct.asset.call_number.search.atomic",
+                       { label         => { ">=" => { transform => "upper", value => ["upper", $label] } },
+                         owning_lib    => \@ou_ids,
+                       },
+                       { flesh         => 1,
+                         flesh_fields  => { acn => [qw/record owning_lib/] },
+                         order_by      => { acn => "upper(label), id, owning_lib" },
+                         limit         => $after_limit,
+                         offset        => abs($page) * $page_size - $after_offset,
+                       }
+               )->gather(1);
+               push @list, @$after;
+       }
+
+       return \@list;
+}
+__PACKAGE__->register_method(
+       method    => 'cn_browse',
+       api_name  => 'open-ils.supercat.call_number.browse',
+       api_level => 1,
+       argc      => 1,
+       signature =>
+               { desc     => <<"                 DESC",
+Returns the XML representation of the requested bibliographic record's holdings
+                 DESC
+                 params   =>
+                       [
+                               { name => 'label',
+                                 desc => 'The target call number lable',
+                                 type => 'string' },
+                               { name => 'org_unit',
+                                 desc => 'The org unit shortname (or "-" or undef for global) to browse',
+                                 type => 'string' },
+                               { name => 'page_size',
+                                 desc => 'Count of call numbers to retrieve, default is 9',
+                                 type => 'number' },
+                               { name => 'page',
+                                 desc => 'The page of call numbers to retrieve, calculated based on page_size.  Can be positive, negative or 0.',
+                                 type => 'number' },
+                       ],
+                 'return' =>
+                       { desc => 'Call numbers with owning_lib and record fleshed',
+                         type => 'array' }
+               }
+);
+
+
 sub new_record_holdings {
        my $self = shift;
        my $client = shift;
index b74cd6e..b698bc5 100644 (file)
@@ -1239,8 +1239,8 @@ sub refingerprint_bibrec {
                                        }
 
                                        my $old_sm = OpenILS::Application::WoRM->storage_req(
-                                                       'open-ils.storage.direct.metabib.metarecord_source_map.search.metarecord.atomic',
-                                                       $old_mrid
+                                                       'open-ils.storage.direct.metabib.metarecord_source_map.search.atomic',
+                                                       { metarecord => $old_mrid }
                                        ) if ($old_mrid);
 
                                        if (ref($old_sm) and @$old_sm == 0) {
@@ -1252,7 +1252,7 @@ sub refingerprint_bibrec {
 
                                        my $mr = OpenILS::Application::WoRM->storage_req(
                                                        'open-ils.storage.direct.metabib.metarecord.search.fingerprint.atomic',
-                                                       $fp->{fingerprint}
+                                                       { fingerprint => $fp->{fingerprint} }
                                        )->[0];
                                
                                        unless ($mr) {
index 829c258..396b046 100644 (file)
@@ -410,10 +410,10 @@ CREATE TABLE actor.hours_of_operation (
 );
 
 CREATE TABLE actor.org_unit_closed (
-       id              SERIAL  PRIMARY KEY,
-       org_unit        INT     NOT NULL REFERENCES actor.org_unit (id),
-       close_start     DATE    NOT NULL,
-       close_end       DATE    NOT NULL,
+       id              SERIAL                          PRIMARY KEY,
+       org_unit        INT                             NOT NULL REFERENCES actor.org_unit (id),
+       close_start     TIMESTAMP WITH TIME ZONE        NOT NULL,
+       close_end       TIMESTAMP WITH TIME ZONE        NOT NULL,
        reason          TEXT
 );