Bug 18098: Add an index with the count of not onloan items
authorTomas Cohen Arazi <tomascohen@theke.io>
Fri, 3 Mar 2017 21:32:06 +0000 (18:32 -0300)
committerKyle M Hall <kyle@bywatersolutions.com>
Mon, 8 May 2017 13:21:41 +0000 (09:21 -0400)
This patch adds a numeric index 'not-onloan-count' containing the value
of 999$x. This subfield is filled by 'rebuild_zebra.pl' by making use of
(bug's 18208) 'EmbedItemsAvailability' filter.

bib1.att and indexes definitions are updated accordingly.

To test:
- Apply the patch
- Pick the right biblio-zebra-indexdefs.xsl file for your setup and
  replace the one your Zebra uses [1]
- Replace your bib1.att
- Replace your ccl.properties
- Have at least one record with more than one item, checkout some
  item(s) from that record(s).
- Rebuild zebra's indexes:
  $ sudo koha-shell kohadev
 k$ cd kohaclone
 k$ misc/migration_tools/rebuild_zebra.pl -r -b -v -k
 (notice the dump directory is kept, you can try the XSLT yourself
  running:
    $ xsltproc \
       etc/zebradb/marc_defs/marc21/biblios/biblio-zebra-indexdefs.xsl \
       /tmp/the_dump_dir/biblios/exported_records | less
=> SUCCESS: There are records with the not-onloan-count index, and the
            value is correct!
- Check Zebra yourself:
  $ yaz-client unix:/var/run/koha/kohadev/bibliosocket
 Z> base biblios
 Z> find @attr 1=9013 @attr 2=5 @attr 4=109 0
=> SUCCESS: The search matches the amount of records with not-onloan
            items.
 Z> s 1+1
=> SUCCESS: Records with 999$x having a value higher than 0 are rendered
- Sign off :-D

Note: While this work is complete on its purpose, it is part of an
attempt to create a better way of filtering by availability.

Sponsored-by: ByWater Solutions
 [1] In kohadevbox this would be
/etc/koha/zebradb/marc_defs/marc21/biblios/biblio-zebra-indexdefs.xsl

Edit: Added the missing XSLT changes for UNIMARC and NORMARC

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
etc/zebradb/biblios/etc/bib1.att
etc/zebradb/ccl.properties
etc/zebradb/marc_defs/marc21/biblios/biblio-koha-indexdefs.xml
etc/zebradb/marc_defs/marc21/biblios/biblio-zebra-indexdefs.xsl
etc/zebradb/marc_defs/normarc/biblios/biblio-koha-indexdefs.xml
etc/zebradb/marc_defs/normarc/biblios/biblio-zebra-indexdefs.xsl
etc/zebradb/marc_defs/unimarc/biblios/biblio-koha-indexdefs.xml
etc/zebradb/marc_defs/unimarc/biblios/biblio-zebra-indexdefs.xsl
misc/migration_tools/rebuild_zebra.pl

index 5ebc316..7acdc18 100644 (file)
@@ -220,6 +220,7 @@ att 9009    cn-prefix
 att 9010    cn-suffix
 att 9011    Suppress
 att 9012    Identifier-other
+att 9013    not-onloan-count
 
 # Items Index
 att 8001    withdrawn
index 27def12..a1ea690 100644 (file)
@@ -994,6 +994,7 @@ date-entered-on-file 1=date-entered-on-file
 extent 1=Extent
 llength 1=llength
 Summary 1=Summary
+not-onloan-count 1=9013 4=109
 
 ###
 # Items Index
index 355a6e3..b67da41 100644 (file)
     <target_index>Note:p</target_index>
   </index_subfields>
 
+  <index_subfields tag="999" subfields="x">
+    <target_index>not-onloan-count:n</target_index>
+  </index_subfields>
+
   <facet tag="100" subfields="a">
     <target_index>au:0</target_index>
   </facet>
index c63bd5e..035d3bc 100644 (file)
@@ -1242,6 +1242,13 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
         </z:index>
       </xslo:if>
     </xslo:for-each>
+    <xslo:for-each select="marc:subfield">
+      <xslo:if test="contains('x', @code)">
+        <z:index name="not-onloan-count:n">
+          <xslo:value-of select="."/>
+        </z:index>
+      </xslo:if>
+    </xslo:for-each>
   </xslo:template>
   <xslo:template mode="index_subfields" match="marc:datafield[@tag='942']">
     <xslo:for-each select="marc:subfield">
index dff2d75..7d2cf08 100644 (file)
     <target_index>itype:w</target_index>
   </index_subfields>
 
+  <index_subfields tag="999" subfields="x">
+    <target_index>not-onloan-count:n</target_index>
+  </index_subfields>
+
   <facet tag="100" subfields="a">
     <target_index>au:0</target_index>
   </facet>
index 301f9a7..851deaf 100644 (file)
@@ -760,6 +760,13 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
         </z:index>
       </xslo:if>
     </xslo:for-each>
+    <xslo:for-each select="marc:subfield">
+      <xslo:if test="contains('x', @code)">
+        <z:index name="not-onloan-count:n">
+          <xslo:value-of select="."/>
+        </z:index>
+      </xslo:if>
+    </xslo:for-each>
   </xslo:template>
   <xslo:template mode="index_subfields" match="marc:datafield[@tag='942']">
     <xslo:for-each select="marc:subfield">
index 90e92a0..7c550f8 100644 (file)
     <target_index>totalissues:s</target_index>
   </index_subfields>
 
+  <index_subfields tag="999" subfields="x">
+    <target_index>not-onloan-count:n</target_index>
+  </index_subfields>
+
   <facet tag="225" subfields="a">
     <target_index>se:0</target_index>
   </facet>
index 32e1742..04fb841 100644 (file)
@@ -1880,6 +1880,15 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml)
       </xslo:if>
     </xslo:for-each>
   </xslo:template>
+  <xslo:template mode="index_subfields" match="marc:datafield[@tag='999']">
+    <xslo:for-each select="marc:subfield">
+      <xslo:if test="contains('x', @code)">
+        <z:index name="not-onloan-count:n">
+          <xslo:value-of select="."/>
+        </z:index>
+      </xslo:if>
+    </xslo:for-each>
+  </xslo:template>
   <xslo:template mode="index_data_field" match="marc:datafield[@tag='700']">
     <z:index name="Author:w Personal-name:w Author:p Personal-name:p Personal-name:p">
       <xslo:variable name="raw_heading">
index 3b2cb43..f8750d9 100755 (executable)
@@ -635,19 +635,26 @@ sub generate_deleted_marc_records {
 }
 
 sub get_corrected_marc_record {
-    my ($record_type, $record_number) = @_;
+    my ( $record_type, $record_number ) = @_;
 
-    my $marc = get_raw_marc_record($record_type, $record_number);
+    my $marc = get_raw_marc_record( $record_type, $record_number );
 
-    if (defined $marc) {
+    if ( defined $marc ) {
         fix_leader($marc);
-        if ($record_type eq 'authority') {
-            fix_authority_id($marc, $record_number);
-        } elsif ($record_type eq 'biblio' && C4::Context->preference('IncludeSeeFromInSearches')) {
-            my $normalizer = Koha::RecordProcessor->new( { filters => 'EmbedSeeFromHeadings' } );
+        if ( $record_type eq 'authority' ) {
+            fix_authority_id( $marc, $record_number );
+        }
+        elsif ( $record_type eq 'biblio' ) {
+
+            my @filters;
+            push @filters, 'EmbedItemsAvailability';
+            push @filters, 'IncludeSeeFromInSearches'
+                if C4::Context->preference('IncludeSeeFromInSearches');
+
+            my $normalizer = Koha::RecordProcessor->new( { filters => \@filters } );
             $marc = $normalizer->process($marc);
         }
-        if (C4::Context->preference("marcflavour") eq "UNIMARC") {
+        if ( C4::Context->preference("marcflavour") eq "UNIMARC" ) {
             fix_unimarc_100($marc);
         }
     }