Bug 24531: Fix OAI-PMH sets for records with repeated fields
authorMagnus Enger <magnus@libriotech.no>
Wed, 29 Jan 2020 22:59:44 +0000 (23:59 +0100)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Fri, 14 Feb 2020 12:00:35 +0000 (12:00 +0000)
Currently, an OAI-PMH set mapping will only match if the value it
is looking for occurs in the first instance of a repeated field.

To test:
- Apply the first patch with two new tests
- Run something like this:
  sudo koha-shell -c "prove -v t/db_dependent/OAI/Sets.t" kohadev
- Verify that the last test fails
- Apply this secind patch
- Rerun the test file above
- Verify that all tests now pass

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

C4/OAI/Sets.pm

index 44100e8..ad33aa3 100644 (file)
@@ -541,14 +541,25 @@ sub _evalRule {
     my $subfield = $mapping->{'marcsubfield'};
     my $operator = $mapping->{'operator'};
     my $value = $mapping->{'marcvalue'};
-    my @subfield_values = $record->subfield($field, $subfield);
+
+    my @all_subfield_values;
+    # Get all the fields with the given tag
+    my @fields = $record->field($field);
+    # Iterate over all the fields
+    foreach my $field ( @fields ) {
+        # Get the values from all the subfields with the given subfield code
+        if ( my @subfield_values = $field->subfield($subfield) ) {
+            push @all_subfield_values, @subfield_values;
+        }
+    }
+
     if ($operator eq 'notequal') {
-        if(0 == grep /^$value$/, @subfield_values) {
+        if(0 == grep /^$value$/, @all_subfield_values) {
             return 1;
         }
     }
     else {
-        if(0 < grep /^$value$/, @subfield_values) {
+        if(0 < grep /^$value$/, @all_subfield_values) {
             return 1;
         }
     }