[open-ils-commits] r19878 - branches/rel_2_1/Open-ILS/src/perlmods/lib/OpenILS/Application (dbwells)

svn at svn.open-ils.org svn at svn.open-ils.org
Mon Mar 28 18:43:48 EDT 2011


Author: dbwells
Date: 2011-03-28 18:43:42 -0400 (Mon, 28 Mar 2011)
New Revision: 19878

Modified:
   branches/rel_2_1/Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat.pm
Log:
Fix call-number sorting for non-generic sort keys (LP Bug #737819)

Selecting on 'label' but sorting on 'label_sortkey' did not work properly.  Instead, we will now find the single best call number we can based on the label given, then both select and sort based on that call number's sort key.


Modified: branches/rel_2_1/Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat.pm
===================================================================
--- branches/rel_2_1/Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat.pm	2011-03-28 22:43:13 UTC (rev 19877)
+++ branches/rel_2_1/Open-ILS/src/perlmods/lib/OpenILS/Application/SuperCat.pm	2011-03-28 22:43:42 UTC (rev 19878)
@@ -237,6 +237,29 @@
 	return @things
 }
 
+# find a label_sortkey for a call number with a label which is equal
+# (or close to) a given label value
+sub _label_sortkey_from_label {
+	my ($label, $_storage, $ou_ids, $cp_filter) = @_;
+
+	my $closest_cn = $_storage->request(
+			"open-ils.cstore.direct.asset.call_number.search.atomic",
+			{ label      => { ">=" => { transform => "oils_text_as_bytea", value => ["oils_text_as_bytea", $label] } },
+			  owning_lib => $ou_ids,
+			  deleted    => 'f',
+			  @$cp_filter
+			},
+			{ limit     => 1,
+			  order_by  => { acn => "oils_text_as_bytea(label), id" }
+			}
+		)->gather(1);
+	if (@$closest_cn) {
+		return $closest_cn->[0]->label_sortkey;
+	} else {
+		return '~~~'; #fallback to high ascii value, we are at the end
+	}
+}
+
 sub cn_browse {
 	my $self = shift;
 	my $client = shift;
@@ -296,10 +319,12 @@
         );
     }
 
+	my $label_sortkey = _label_sortkey_from_label($label, $_storage, \@ou_ids, \@cp_filter);
+
 	if ($page <= 0) {
 		my $before = $_storage->request(
 			"open-ils.cstore.direct.asset.call_number.search.atomic",
-			{ label		=> { "<" => $label },
+			{ label_sortkey	=> { "<" => { transform => "oils_text_as_bytea", value => ["oils_text_as_bytea", $label_sortkey] } },
 			  owning_lib	=> \@ou_ids,
               deleted => 'f',
               @cp_filter
@@ -317,7 +342,7 @@
 	if ($page >= 0) {
 		my $after = $_storage->request(
 			"open-ils.cstore.direct.asset.call_number.search.atomic",
-			{ label		=> { ">=" => { transform => "oils_text_as_bytea", value => ["oils_text_as_bytea", $label] } },
+			{ label_sortkey	=> { ">=" => { transform => "oils_text_as_bytea", value => ["oils_text_as_bytea", $label_sortkey] } },
 			  owning_lib	=> \@ou_ids,
               deleted => 'f',
               @cp_filter
@@ -419,10 +444,12 @@
         );
     }
 
+	my $label_sortkey = _label_sortkey_from_label($label, $_storage, \@ou_ids, \@cp_filter);
+
 	if ($page < 0) {
 		my $before = $_storage->request(
 			"open-ils.cstore.direct.asset.call_number.search.atomic",
-			{ label		=> { "<" => $label },
+			{ label_sortkey	=> { "<" => { transform => "oils_text_as_bytea", value => ["oils_text_as_bytea", $label_sortkey] } },
 			  owning_lib	=> \@ou_ids,
               deleted => 'f',
               @cp_filter
@@ -440,7 +467,7 @@
 	if ($page >= 0) {
 		my $after = $_storage->request(
 			"open-ils.cstore.direct.asset.call_number.search.atomic",
-			{ label		=> { ">=" => { transform => "oils_text_as_bytea", value => ["oils_text_as_bytea", $label] } },
+			{ label_sortkey	=> { ">=" => { transform => "oils_text_as_bytea", value => ["oils_text_as_bytea", $label_sortkey] } },
 			  owning_lib	=> \@ou_ids,
               deleted => 'f',
               @cp_filter



More information about the open-ils-commits mailing list