[Koha-cvs] koha/C4 SearchMarc.pm [rel_2_2]

Joshua Ferraro jmf at kados.org
Thu Feb 23 04:16:37 CET 2006


CVSROOT:	/sources/koha
Module name:	koha
Branch: 	rel_2_2
Changes by:	Joshua Ferraro <kados at savannah.gnu.org>	06/02/23 03:16:37

Modified files:
	C4             : SearchMarc.pm 

Log message:
	Adds the option to sort titles by nonfilingchars in MARC records. Note
	that for systems with a lot of records (more than 100,000) this will be
	a significant performance hit. Also note that if you don't have your
	syspref for sortbynonfiling chars set the code will not execute.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/koha/C4/SearchMarc.pm.diff?only_with_tag=rel_2_2&tr1=1.36.2.22&tr2=1.36.2.23&r1=text&r2=text

Patches:
Index: koha/C4/SearchMarc.pm
diff -u koha/C4/SearchMarc.pm:1.36.2.22 koha/C4/SearchMarc.pm:1.36.2.23
--- koha/C4/SearchMarc.pm:1.36.2.22	Sat Feb 18 08:41:44 2006
+++ koha/C4/SearchMarc.pm	Thu Feb 23 03:16:37 2006
@@ -335,7 +335,68 @@
 			push @result,$bibid;
 		}
 	}
-
+if (C4::Context->preference("sortbynonfilingchars")==1) {
+#~~#~~# next part added by SH Modified by JF
+# This code resorts the biblio.title results eliminating the
+# marc non-filing chars
+#this is a big problem perf wise
+#
+# A better way is to create a new column in marc_word called
+# subfield_string.  it's made without non-filing chars and you
+# sort by it ...
+# or maybe you just quer marc_subfield_table in the origiinal query.
+#
+#
+#
+#
+#
+        if ($orderby eq "biblio.title") {    #don't sort by title if another orderby is specified
+                my $msth = $dbh->prepare("SELECT tagfield, tagsubfield FROM marc_subfield_structure WHERE kohafield='biblio.title'");
+		$msth->execute();    #  get MARC tag and subfield that is mapped to biblio.title
+                my $tagdata = $msth->fetchrow_hashref;
+                my $tag = $tagdata->{tagfield};
+                my $subfieldcode = $tagdata->{tagsubfield};
+                $msth->finish;
+
+                my $tsth = $dbh->prepare("SELECT title, tag_indicator FROM marc_biblio, marc_subfield_table, biblio
+                                                         WHERE marc_biblio.bibid = ?
+                                                         AND marc_subfield_table.bibid=marc_biblio.bibid
+                                                         AND biblio.biblionumber=marc_biblio.biblionumber
+                                                         AND tag=? and subfieldcode=?");
+                my %titles = ();    #to hold title data for sorting
+                my $sorttitle;
+                my $bibidno;
+                my @resultnew = ();    #clear previous list of bibids
+
+                foreach my $bibidno (@result) {
+                        $tsth->execute($bibidno,$tag,$subfieldcode);
+                        my $titledat = $tsth->fetchrow_hashref;
+                        $sorttitle = lc($titledat->{title});
+                        #warn "Here's the sorttitle beforehand:".$sorttitle;
+                        if (length($titledat->{tag_indicator})==2) {
+                                my $filechar=substr($titledat->{tag_indicator},1,1);
+                                $sorttitle = substr($sorttitle,$filechar,-1,"");  #remove nonfiling characters
+                        #       warn "Here it is afterwards:".$sorttitle;
+                        }
+                        $titles{$bibidno} = $sorttitle; #} = $bibidno;
+#                       push @resultnew, $titles{$sorttitle};
+# sorttitle is key ... biblionumber is value
+# but it needs to be the other way around
+                }
+
+                $tsth->finish;
+                #while ( my ($k,$v) = each %titles ) { warn "$k => $v\n"; }
+
+
+                foreach my $bibses (sort {$titles{$a} cmp $titles{$b}} (keys(%titles))) {
+                        push @resultnew, $bibses;
+                }
+                #@resultnew = sort { $titles{$a} <=> $titles{$b} } keys %titles;
+                @result = ();
+                @result = @resultnew;
+        }
+#~~#~~#  above added by SH
+}    
 	# we have bibid list. Now, loads title and author from [offset] to [offset]+[length]
 	my $counter = $offset;
 	# HINT : biblionumber as bn is important. The hash is fills biblionumber with items.biblionumber.





More information about the Koha-cvs mailing list