[Koha-patches] [PATCH] fix for bug 2477: Improve Speed of the Shelf Browser
Jesse Weaver
jesse.weaver at liblime.com
Tue Aug 19 20:16:48 CEST 2008
This patch updates the queries for the shelf browser in opac-detail.pl for a slight performance gain. It also adds a param for dateformat to C4::Auth to fix a warning.
---
C4/Auth.pm | 1 +
.../opac-tmpl/prog/en/modules/opac-detail.tmpl | 4 +-
opac/opac-detail.pl | 151 +++++++++++---------
3 files changed, 88 insertions(+), 68 deletions(-)
diff --git a/C4/Auth.pm b/C4/Auth.pm
index 029a957..6058a6b 100755
--- a/C4/Auth.pm
+++ b/C4/Auth.pm
@@ -265,6 +265,7 @@ sub get_template_and_user {
LoginSurname => C4::Context->userenv?C4::Context->userenv->{"surname"}:"Inconnu",
TagsEnabled => C4::Context->preference("TagsEnabled"),
hide_marc => C4::Context->preference("hide_marc"),
+ dateformat => C4::Context->preference("dateformat"),
'item-level_itypes' => C4::Context->preference('item-level_itypes'),
patronimages => C4::Context->preference("patronimages"),
singleBranchMode => C4::Context->preference("singleBranchMode"),
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
index 639b018..a921e48 100755
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
@@ -314,7 +314,7 @@
<table><tr>
<td rowspan="2" style="width:20px;"><a style="height: 10em;" href="/cgi-bin/koha/opac-detail.pl?biblionumber=<!-- TMPL_IF NAME="shelfbrowser_prev_biblionumber" --><!-- TMPL_VAR NAME="shelfbrowser_prev_biblionumber" --><!-- TMPL_ELSE --><!-- TMPL_VAR NAME="biblionumber" --><!-- /TMPL_IF -->&shelfbrowse_itemnumber=<!-- TMPL_VAR NAME="shelfbrowser_prev_itemnumber" -->#shelfbrowser"><img src="/opac-tmpl/prog/images/browse-prev.gif" alt="Previous" border="0" /></a></td>
<!-- TMPL_LOOP NAME="PREVIOUS_SHELF_BROWSE" -->
- <td> <a href="/cgi-bin/koha/opac-detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&shelfbrowse_itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->#shelfbrowser">
+ <td><a href="/cgi-bin/koha/opac-detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&shelfbrowse_itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->#shelfbrowser">
<!-- TMPL_IF NAME="AmazonContent" -->
<img border="0" src="http://images.amazon.com/images/P/<!-- TMPL_VAR NAME="isbn"-->.01._AA75_PU_PU-5_.jpg" alt="" /><!-- /TMPL_IF -->
@@ -326,7 +326,7 @@
<!-- /TMPL_LOOP -->
<!-- TMPL_LOOP NAME="NEXT_SHELF_BROWSE" -->
- <td> <a href="/cgi-bin/koha/opac-detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&shelfbrowse_itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->#shelfbrowser">
+ <td><a href="/cgi-bin/koha/opac-detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&shelfbrowse_itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->#shelfbrowser">
<!-- TMPL_IF NAME="AmazonContent" -->
<img border="0" src="http://images.amazon.com/images/P/<!-- TMPL_VAR NAME="isbn"-->.01._AA75_PU_PU-5_.jpg" alt="" /><!-- /TMPL_IF -->
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index 6f6b7ca..56fef80 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -297,74 +297,93 @@ if ( C4::Context->preference("OPACAmazonContent") == 1 ) {
}
# Shelf Browser Stuff
if (C4::Context->preference("OPACShelfBrowser")) {
-# pick the first itemnumber unless one was selected by the user
-my $starting_itemnumber = $query->param('shelfbrowse_itemnumber'); # || $items[0]->{itemnumber};
-$template->param( OpenOPACShelfBrowser => 1) if $starting_itemnumber;
-# find the right cn_sort value for this item
-my ($starting_cn_sort, $starting_homebranch, $starting_location);
-my $sth_get_cn_sort = $dbh->prepare("SELECT cn_sort,homebranch,location from items where itemnumber=?");
-$sth_get_cn_sort->execute($starting_itemnumber);
-while (my $result = $sth_get_cn_sort->fetchrow_hashref()) {
- $starting_cn_sort = $result->{'cn_sort'};
- $starting_homebranch->{code} = $result->{'homebranch'};
- $starting_homebranch->{description} = $branches->{$result->{'homebranch'}}{branchname};
- $starting_location->{code} = $result->{'location'};
- $starting_location->{description} = GetAuthorisedValueDesc('','', $result->{'location'} ,'','','LOC');
-
-}
-
-## List of Previous Items
-# order by cn_sort, which should include everything we need for ordering purposes (though not
-# for limits, those need to be handled separately
-my $sth_shelfbrowse_previous = $dbh->prepare("SELECT * FROM items WHERE CONCAT(cn_sort,itemnumber) <= ? AND homebranch=? AND location=? ORDER BY CONCAT(cn_sort,itemnumber) DESC LIMIT 3");
-$sth_shelfbrowse_previous->execute($starting_cn_sort.$starting_itemnumber, $starting_homebranch->{code}, $starting_location->{code});
-my @previous_items;
-while (my $this_item = $sth_shelfbrowse_previous->fetchrow_hashref()) {
- my $sth_get_biblio = $dbh->prepare("SELECT biblio.*,biblioitems.isbn AS isbn FROM biblio LEFT JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber WHERE biblio.biblionumber=?");
- $sth_get_biblio->execute($this_item->{biblionumber});
- while (my $this_biblio = $sth_get_biblio->fetchrow_hashref()) {
- $this_item->{'title'} = $this_biblio->{'title'};
- if ($clean2 = isbn_cleanup($this_biblio->{'isbn'})) {
- $this_item->{'isbn'} = $clean2;
- } else {
- $this_item->{'isbn'} = $this_biblio->{'isbn'};
- }
+ # pick the first itemnumber unless one was selected by the user
+ my $starting_itemnumber = $query->param('shelfbrowse_itemnumber'); # || $items[0]->{itemnumber};
+ $template->param( OpenOPACShelfBrowser => 1) if $starting_itemnumber;
+ # find the right cn_sort value for this item
+ my ($starting_cn_sort, $starting_homebranch, $starting_location);
+ my $sth_get_cn_sort = $dbh->prepare("SELECT cn_sort,homebranch,location from items where itemnumber=?");
+ $sth_get_cn_sort->execute($starting_itemnumber);
+ while (my $result = $sth_get_cn_sort->fetchrow_hashref()) {
+ $starting_cn_sort = $result->{'cn_sort'};
+ $starting_homebranch->{code} = $result->{'homebranch'};
+ $starting_homebranch->{description} = $branches->{$result->{'homebranch'}}{branchname};
+ $starting_location->{code} = $result->{'location'};
+ $starting_location->{description} = GetAuthorisedValueDesc('','', $result->{'location'} ,'','','LOC');
+
}
- unshift @previous_items, $this_item;
-}
-my $throwaway = pop @previous_items;
-## List of Next Items
-my $sth_shelfbrowse_next = $dbh->prepare("SELECT * FROM items WHERE CONCAT(cn_sort,itemnumber) >= ? AND homebranch=? AND location=? ORDER BY CONCAT(cn_sort,itemnumber) ASC LIMIT 3");
-$sth_shelfbrowse_next->execute($starting_cn_sort.$starting_itemnumber, $starting_homebranch->{code}, $starting_location->{code});
-my @next_items;
-while (my $this_item = $sth_shelfbrowse_next->fetchrow_hashref()) {
- my $sth_get_biblio = $dbh->prepare("SELECT biblio.*,biblioitems.isbn AS isbn FROM biblio LEFT JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber WHERE biblio.biblionumber=?");
- $sth_get_biblio->execute($this_item->{biblionumber});
- while (my $this_biblio = $sth_get_biblio->fetchrow_hashref()) {
- $this_item->{'title'} = $this_biblio->{'title'};
- if ($clean2 = isbn_cleanup($this_biblio->{'isbn'})) {
- $this_item->{'isbn'} = $clean2;
- } else {
- $this_item->{'isbn'} = $this_biblio->{'isbn'};
- }
+
+ ## List of Previous Items
+ # order by cn_sort, which should include everything we need for ordering purposes (though not
+ # for limits, those need to be handled separately
+ my $sth_shelfbrowse_previous = $dbh->prepare("
+ SELECT *
+ FROM items
+ WHERE
+ ((cn_sort = ? AND itemnumber < ?) || cn_sort < ?) AND
+ homebranch = ? AND location = ?
+ ORDER BY cn_sort DESC, itemnumber ASC LIMIT 3
+ ");
+ $sth_shelfbrowse_previous->execute($starting_cn_sort, $starting_itemnumber, $starting_cn_sort, $starting_homebranch->{code}, $starting_location->{code});
+ my @previous_items;
+ while (my $this_item = $sth_shelfbrowse_previous->fetchrow_hashref()) {
+ my $sth_get_biblio = $dbh->prepare("SELECT biblio.*,biblioitems.isbn AS isbn FROM biblio LEFT JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber WHERE biblio.biblionumber=?");
+ $sth_get_biblio->execute($this_item->{biblionumber});
+ while (my $this_biblio = $sth_get_biblio->fetchrow_hashref()) {
+ $this_item->{'title'} = $this_biblio->{'title'};
+ if ($clean2 = isbn_cleanup($this_biblio->{'isbn'})) {
+ $this_item->{'isbn'} = $clean2;
+ } else {
+ $this_item->{'isbn'} = $this_biblio->{'isbn'};
+ }
+ }
+ unshift @previous_items, $this_item;
+ warn "p$this_item->{itemnumber}" . '@' . "$this_item->{biblionumber}: $this_item->{cn_sort}";
}
- push @next_items, $this_item;
-}
-
-# alas, these won't auto-vivify, see http://www.perlmonks.org/?node_id=508481
-my $shelfbrowser_next_itemnumber = $next_items[-1]->{itemnumber} if @next_items;
-my $shelfbrowser_next_biblionumber = $next_items[-1]->{biblionumber} if @next_items;
-
-$template->param(
- starting_homebranch => $starting_homebranch->{description},
- starting_location => $starting_location->{description},
- shelfbrowser_prev_itemnumber => $previous_items[0]->{itemnumber},
- shelfbrowser_next_itemnumber => $shelfbrowser_next_itemnumber,
- shelfbrowser_prev_biblionumber => $previous_items[0]->{biblionumber},
- shelfbrowser_next_biblionumber => $shelfbrowser_next_biblionumber,
- PREVIOUS_SHELF_BROWSE => \@previous_items,
- NEXT_SHELF_BROWSE => \@next_items,
-);
+ warn "p: " . (@previous_items ? 'yes' : 'no');
+
+ ## List of Next Items; this also intentionally catches the current item
+ my $sth_shelfbrowse_next = $dbh->prepare("
+ SELECT *
+ FROM items
+ WHERE
+ ((cn_sort = ? AND itemnumber >= ?) || cn_sort > ?) AND
+ homebranch = ? AND location = ?
+ ORDER BY cn_sort DESC, itemnumber ASC LIMIT 3
+ ");
+ $sth_shelfbrowse_next->execute($starting_cn_sort, $starting_itemnumber, $starting_cn_sort, $starting_homebranch->{code}, $starting_location->{code});
+ my @next_items;
+ while (my $this_item = $sth_shelfbrowse_next->fetchrow_hashref()) {
+ my $sth_get_biblio = $dbh->prepare("SELECT biblio.*,biblioitems.isbn AS isbn FROM biblio LEFT JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber WHERE biblio.biblionumber=?");
+ $sth_get_biblio->execute($this_item->{biblionumber});
+ while (my $this_biblio = $sth_get_biblio->fetchrow_hashref()) {
+ $this_item->{'title'} = $this_biblio->{'title'};
+ if ($clean2 = isbn_cleanup($this_biblio->{'isbn'})) {
+ $this_item->{'isbn'} = $clean2;
+ } else {
+ $this_item->{'isbn'} = $this_biblio->{'isbn'};
+ }
+ }
+ push @next_items, $this_item;
+ warn "n$this_item->{itemnumber}" . '@' . "$this_item->{biblionumber}: $this_item->{cn_sort}";
+ }
+ warn "n: " . (@next_items ? 'yes' : 'no');
+
+ # alas, these won't auto-vivify, see http://www.perlmonks.org/?node_id=508481
+ my $shelfbrowser_next_itemnumber = $next_items[-1]->{itemnumber} if @next_items;
+ my $shelfbrowser_next_biblionumber = $next_items[-1]->{biblionumber} if @next_items;
+
+ $template->param(
+ starting_homebranch => $starting_homebranch->{description},
+ starting_location => $starting_location->{description},
+ starting_itemnumber => $starting_itemnumber,
+ shelfbrowser_prev_itemnumber => (@previous_items ? $previous_items[0]->{itemnumber} : 0),
+ shelfbrowser_next_itemnumber => $shelfbrowser_next_itemnumber,
+ shelfbrowser_prev_biblionumber => (@previous_items ? $previous_items[0]->{biblionumber} : 0),
+ shelfbrowser_next_biblionumber => $shelfbrowser_next_biblionumber,
+ PREVIOUS_SHELF_BROWSE => \@previous_items,
+ NEXT_SHELF_BROWSE => \@next_items,
+ );
}
if (C4::Context->preference("BakerTaylorEnabled")) {
--
1.5.5.GIT
More information about the Koha-patches
mailing list