Bug 19279: performance of linked items in search
authorFridolin Somers <fridolin.somers@biblibre.com>
Fri, 8 Sep 2017 15:20:38 +0000 (17:20 +0200)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Wed, 18 Mar 2020 17:51:25 +0000 (17:51 +0000)
When catalog has fields 773 (461 in UNIMARC), those linked items are fetched for display in search results.
Looks like the code could be more performant by replacing item search by $9 with direct call with GetMarcItem().

Test plan :
1) Enable system preference EasyAnalyticalRecords
2) Get a record A with a lot of items, it will be the 'Host record'
3) Click on 'Analytics' on this record
4) On one of its items (say item A1) click on 'Create analytics' to
create record B
5) Enter the same title as record A and all mandatory fields
6) Edit field 773 (461 in UNIMARC)
6) Check that $0 contains the biblionumber of record A
7) Check that $9 contains the itemnumber of item A1
8) Perform a search on record A title, be sure you see record B with
other results
=> Compare execution times with and without patch

Signed-off-by: Hugo Agud <hagud@orex.es>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

C4/Search.pm

index b4868d1..a10e50f 100644 (file)
@@ -1859,18 +1859,11 @@ sub searchResults {
                 my $hostbiblionumber = $hostfield->subfield("0");
                 my $linkeditemnumber = $hostfield->subfield("9");
                 if( $hostbiblionumber ) {
-                    my $hostbiblio = GetMarcBiblio({
-                        biblionumber => $hostbiblionumber,
-                        embed_items  => 1 });
-                    my ($itemfield, undef) = GetMarcFromKohaField( 'items.itemnumber' );
-                    if( $hostbiblio ) {
-                        my @hostitems = $hostbiblio->field($itemfield);
-                        foreach my $hostitem (@hostitems){
-                            if ($hostitem->subfield("9") eq $linkeditemnumber){
-                                my $linkeditem =$hostitem;
-                                # append linked items if they exist
-                                push @fields, $linkeditem if $linkeditem;
-                            }
+                    my $linkeditemmarc = C4::Items::GetMarcItem( $hostbiblionumber, $linkeditemnumber );
+                    if ($linkeditemmarc) {
+                        my $linkeditemfield = $linkeditemmarc->field($itemtag);
+                        if ($linkeditemfield) {
+                            push( @fields, $linkeditemfield );
                         }
                     }
                 }