- my $sth_prev_items = $dbh->prepare($prev_query . $query_cond . ' ORDER BY cn_sort DESC, itemnumber LIMIT ?');
- my $sth_next_items = $dbh->prepare($next_query . $query_cond . ' ORDER BY cn_sort, itemnumber LIMIT ?');
- push @params, $num_each_side;
- $sth_prev_items->execute(@params);
- $sth_next_items->execute(@params);
-
- # Now we have the query run, suck out the data like marrow
- my @prev_items = reverse GetShelfInfo($sth_prev_items, $marcflavour);
- my @next_items = GetShelfInfo($sth_next_items, $marcflavour);
-
- my $next_itemnumber = $next_items[-1]->{itemnumber} if @next_items;
- my $next_biblionumber = $next_items[-1]->{biblionumber} if @next_items;
-
- my $prev_itemnumber = $prev_items[0]->{itemnumber} if @prev_items;
- my $prev_biblionumber = $prev_items[0]->{biblionumber} if @prev_items;
-
- my %result = (
- next => \@next_items,
- prev => \@prev_items,
- next_itemnumber => $next_itemnumber,
- next_biblionumber => $next_biblionumber,
- prev_itemnumber => $prev_itemnumber,
- prev_biblionumber => $prev_biblionumber,
- starting_itemnumber => $itemnumber,
- );
- $result{starting_homebranch} = $start_homebranch if $start_homebranch;
- $result{starting_location} = $start_location if $start_location;
- $result{starting_ccode} = $start_ccode if $start_ccode;
- return \%result;
+ my @prev_items = @{
+ $dbh->selectall_arrayref(
+ $prev_query . $query_cond . ' ORDER BY cn_sort DESC, itemnumber DESC LIMIT ?',
+ { Slice => {} },
+ ( @params, $gap )
+ )
+ };
+ my @next_items = @{
+ $dbh->selectall_arrayref(
+ $next_query . $query_cond . ' ORDER BY cn_sort, itemnumber LIMIT ?',
+ { Slice => {} },
+ ( @params, $gap + 1 )
+ )
+ };
+
+ my $prev_item = $prev_items[-1];
+ my $next_item = $next_items[-1];
+ @next_items = splice( @next_items, 0, $num_each_side + 1 );
+ @prev_items = reverse splice( @prev_items, 0, $num_each_side );
+ my @items = ( @prev_items, @next_items );
+
+ $next_item = undef
+ if not $next_item
+ or ( $next_item->{itemnumber} == $items[-1]->{itemnumber}
+ and ( @prev_items or @next_items <= 1 )
+ );
+ $prev_item = undef
+ if not $prev_item
+ or ( $prev_item->{itemnumber} == $items[0]->{itemnumber}
+ and ( @next_items or @prev_items <= 1 )
+ );
+
+ # populate the items
+ @items = GetShelfInfo( @items );
+
+ return {
+ items => \@items,
+ next_item => $next_item,
+ prev_item => $prev_item,
+ starting_homebranch => $start_homebranch,
+ starting_location => $start_location,
+ starting_ccode => $start_ccode,
+ };