Bug 38416: Failover to MARCXML if cannot roundtrip USMARC during indexing

This change failsover to MARCXML from USMARC if there are any
warnings generated by MARC::File::USMARC::decode when trying to
roundtrip the record.

Test plan:
0. Apply the patch
1. Setup your koha-testing-docker to use Elasticsearch
2. Create a new record with 15,000 characters in the 500$a field
3. Index that record
(e.g. perl misc/search_tools/rebuild_elasticsearch.pl --biblios -v -v)
4. Note that a warning saying the following appears:
"Warnings encountered while roundtripping a MARC record to/from USMARC.
Failing over to MARCXML"
5. View the "Elasticsearch record" on the detail page and note that the
marc_format is MARCXML
6. Perform a search for the record (the keyword should be something that
brings up other results too)
7. Note that the record appears correctly in the search results

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
(cherry picked from commit 0d862343dd)
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
This commit is contained in:
David Cook 2024-11-11 04:30:06 +00:00 committed by Lucas Gass
parent 20c59c0171
commit 714775e370
1 changed files with 13 additions and 1 deletions

View File

@ -790,7 +790,19 @@ sub marc_records_to_documents {
local $SIG{__WARN__} = sub {
push @warnings, $_[0];
};
$record_document->{'marc_data'} = encode_base64(encode('UTF-8', $record->as_usmarc()));
my $usmarc_record = $record->as_usmarc();
#NOTE: Try to round-trip the record to prove it will work for retrieval after searching
my $decoded_usmarc_record = MARC::Record->new_from_usmarc($usmarc_record);
if ($decoded_usmarc_record->warnings()){
#NOTE: We override the warnings since they're many and misleading
@warnings = (
"Warnings encountered while roundtripping a MARC record to/from USMARC. Failing over to MARCXML.",
);
}
my $marc_data = encode_base64(encode('UTF-8', $usmarc_record));
$record_document->{'marc_data'} = $marc_data;
}
if (@warnings) {
# Suppress warnings if record length exceeded