From: dbs Date: Tue, 11 Jan 2011 00:13:09 +0000 (+0000) Subject: Backport authority browsing fixes from trunk X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=5badf69db3520b91c002d686231b10a98d796247;p=evergreen%2Fequinox.git Backport authority browsing fixes from trunk Primary fix is to remove duplicate records from the results when dupes are returned due to similar 1XX/4XX/5XX values in the same records. git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_2_0@19151 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm b/Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm index 4d64dae483..5419a91b4e 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm @@ -982,76 +982,89 @@ __PACKAGE__->register_method( ); sub authority_tag_sf_browse { - my $self = shift; - my $client = shift; - - my $tag = shift; - my $subfield = shift; - my $value = shift; - my $page_size = shift || 9; - my $page = shift || 0; + my $self = shift; + my $client = shift; - my ($before_limit,$after_limit) = (0,0); - my ($before_offset,$after_offset) = (0,0); + my $tag = shift; + my $subfield = shift; + my $value = shift; + my $page_size = shift || 9; + my $page = shift || 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 ($before_limit,$after_limit) = (0,0); + my ($before_offset,$after_offset) = (0,0); - my $_storage = OpenSRF::AppSession->create( 'open-ils.cstore' ); + 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; + } - # .refs variant includes 4xx and 5xx variants for see / see also - if ($self->api_name =~ /\.refs\./) { - my @ref_tags; - foreach my $tagname (@$tag) { - push(@ref_tags, '4' . substr($tagname, 1, 2)); - push(@ref_tags, '5' . substr($tagname, 1, 2)); - } - push(@$tag, @ref_tags); - } + my $_storage = OpenSRF::AppSession->create( 'open-ils.cstore' ); - my @list = (); + # .refs variant includes 4xx and 5xx variants for see / see also + my @ref_tags = (); + foreach my $tagname (@$tag) { + push(@ref_tags, $tagname); + if ($self->api_name =~ /\.refs\./) { + push(@ref_tags, '4' . substr($tagname, 1, 2)); + push(@ref_tags, '5' . substr($tagname, 1, 2)); + } + } + my @list = (); + + if ($page < 0) { + my $before = $_storage->request( + "open-ils.cstore.json_query.atomic", + { select => { afr => [qw/record value/] }, + from => { 'are', 'afr' }, + where => { + '+afr' => { tag => \@ref_tags, subfield => $subfield, value => { '<' => lc($value) } }, + '+are' => { 'deleted' => 'f' } + }, + order_by => { afr => { value => 'desc' } }, + limit => $before_limit, + offset => abs($page) * $page_size - $before_offset, + } + )->gather(1); + push @list, map { $_->{record} } reverse(@$before); + } - if ($page <= 0) { - my $before = $_storage->request( - "open-ils.cstore.json_query.atomic", - { select => { afr => [qw/record value/] }, - from => { 'are', 'afr' }, - where => { - '+afr' => { tag => $tag, subfield => $subfield, value => { '<' => lc($value) } }, - '+are' => { 'deleted' => 'f' } - }, - order_by => { afr => { value => 'desc' } }, - limit => $before_limit, - offset => abs($page) * $page_size - $before_offset, - } - )->gather(1); - push @list, map { $_->{record} } reverse(@$before); - } + if ($page >= 0) { + my $after = $_storage->request( + "open-ils.cstore.json_query.atomic", + { select => { afr => [qw/record value/] }, + from => { 'are', 'afr' }, + where => { + '+afr' => { tag => \@ref_tags, subfield => $subfield, value => { '>=' => lc($value) } }, + '+are' => { 'deleted' => 'f' } + }, + order_by => { afr => { value => 'asc' } }, + limit => $after_limit, + offset => abs($page) * $page_size - $after_offset, + } + )->gather(1); + push @list, map { $_->{record} } @$after; + } - if ($page >= 0) { - my $after = $_storage->request( - "open-ils.cstore.json_query.atomic", - { select => { afr => [qw/record value/] }, - from => { 'are', 'afr' }, - where => { - '+afr' => { tag => $tag, subfield => $subfield, value => { '>=' => lc($value) } }, - '+are' => { 'deleted' => 'f' } - }, - order_by => { afr => { value => 'asc' } }, - limit => $after_limit, - offset => abs($page) * $page_size - $after_offset, - } - )->gather(1); - push @list, map { $_->{record} } @$after; - } + # If we're not pulling in see/see also references, just return the raw list + if ($self->api_name !~ /\.refs\./) { + return \@list; + } + + # Remove dupe record IDs that turn up due to 4xx and 5xx matches + my @retlist = (); + my %seen; + foreach my $record (@list) { + next if exists $seen{$record}; + push @retlist, int($record); + $seen{$record} = 1; + } - return \@list; + return \@retlist; } __PACKAGE__->register_method( method => 'authority_tag_sf_browse', @@ -1480,68 +1493,83 @@ __PACKAGE__->register_method( ); sub authority_tag_sf_startwith { - my $self = shift; - my $client = shift; - - my $tag = shift; - my $subfield = shift; - my $value = shift; - my $limit = shift || 10; - my $page = shift || 0; - - my $offset = $limit * abs($page); - my $_storage = OpenSRF::AppSession->create( 'open-ils.cstore' ); - - # .refs variant includes 4xx and 5xx variants for see / see also - if ($self->api_name =~ /\.refs\./) { - my @ref_tags; - foreach my $tagname (@$tag) { - push(@ref_tags, '4' . substr($tagname, 1, 2)); - push(@ref_tags, '5' . substr($tagname, 1, 2)); - } - push(@$tag, @ref_tags); - } + my $self = shift; + my $client = shift; + + my $tag = shift; + my $subfield = shift; + my $value = shift; + my $limit = shift || 10; + my $page = shift || 0; + + my $ref_limit = $limit; + my $offset = $limit * abs($page); + my $_storage = OpenSRF::AppSession->create( 'open-ils.cstore' ); + + my @ref_tags = (); + # .refs variant includes 4xx and 5xx variants for see / see also + foreach my $tagname (@$tag) { + push(@ref_tags, $tagname); + if ($self->api_name =~ /\.refs\./) { + push(@ref_tags, '4' . substr($tagname, 1, 2)); + push(@ref_tags, '5' . substr($tagname, 1, 2)); + } + } - my @list = (); + my @list = (); + + if ($page < 0) { + # Don't skip the first actual page of results in descending order + $offset = $offset - $limit; + + my $before = $_storage->request( + "open-ils.cstore.json_query.atomic", + { select => { afr => [qw/record value/] }, + from => { 'afr', 'are' }, + where => { + '+afr' => { tag => \@ref_tags, subfield => $subfield, value => { '<' => lc($value) } }, + '+are' => { deleted => 'f' } + }, + order_by => { afr => { value => 'desc' } }, + limit => $ref_limit, + offset => $offset, + } + )->gather(1); + push @list, map { $_->{record} } reverse(@$before); + } - if ($page < 0) { - # Don't skip the first actual page of results in descending order - $offset = $offset - $limit; + if ($page >= 0) { + my $after = $_storage->request( + "open-ils.cstore.json_query.atomic", + { select => { afr => [qw/record value/] }, + from => { 'afr', 'are' }, + where => { + '+afr' => { tag => \@ref_tags, subfield => $subfield, value => { '>=' => lc($value) } }, + '+are' => { deleted => 'f' } + }, + order_by => { afr => { value => 'asc' } }, + limit => $ref_limit, + offset => $offset, + } + )->gather(1); + push @list, map { $_->{record} } @$after; + } - my $before = $_storage->request( - "open-ils.cstore.json_query.atomic", - { select => { afr => [qw/record value/] }, - from => { 'afr', 'are' }, - where => { - '+afr' => { tag => $tag, subfield => $subfield, value => { '<' => lc($value) } }, - '+are' => { deleted => 'f' } - }, - order_by => { afr => { value => 'desc' } }, - limit => $limit, - offset => $offset - } - )->gather(1); - push @list, map { $_->{record} } reverse(@$before); - } + # If we're not pulling in see/see also references, just return the raw list + if ($self->api_name !~ /\.refs\./) { + return \@list; + } - if ($page >= 0) { - my $after = $_storage->request( - "open-ils.cstore.json_query.atomic", - { select => { afr => [qw/record value/] }, - from => { 'afr', 'are' }, - where => { - '+afr' => { tag => $tag, subfield => $subfield, value => { '>=' => lc($value) } }, - '+are' => { deleted => 'f' } - }, - order_by => { afr => { value => 'asc' } }, - limit => $limit, - offset => $offset - } - )->gather(1); - push @list, map { $_->{record} } @$after; - } + # Remove dupe record IDs that turn up due to 4xx and 5xx matches + my @retlist = (); + my %seen; + foreach my $record (@list) { + next if exists $seen{$record}; + push @retlist, int($record); + $seen{$record} = 1; + } - return \@list; + return \@retlist; } __PACKAGE__->register_method( method => 'authority_tag_sf_startwith',