View | Details | Raw Unified | Return to bug 20244
Collapse All | Expand All

(-)a/Koha/SearchEngine/Elasticsearch.pm (-10 / +38 lines)
Lines 310-318 sub sort_fields { Link Here
310
    return $self->_sort_fields_accessor();
310
    return $self->_sort_fields_accessor();
311
}
311
}
312
312
313
=head2 _process_mappings($mappings, $data, $record_document)
313
=head2 _process_mappings($mappings, $data, $record_document, $altscript)
314
314
315
    $self->_process_mappings($mappings, $marc_field_data, $record_document)
315
    $self->_process_mappings($mappings, $marc_field_data, $record_document, 0)
316
316
317
Process all C<$mappings> targets operating on a specific MARC field C<$data>.
317
Process all C<$mappings> targets operating on a specific MARC field C<$data>.
318
Since we group all mappings by MARC field targets C<$mappings> will contain
318
Since we group all mappings by MARC field targets C<$mappings> will contain
Lines 338-351 The source data from a MARC record field. Link Here
338
Hashref representing the Elasticsearch document on which mappings should be
338
Hashref representing the Elasticsearch document on which mappings should be
339
applied.
339
applied.
340
340
341
=item C<$altscript>
342
343
A boolean value indicating whether an alternate script presentation is being
344
processed.
345
341
=back
346
=back
342
347
343
=cut
348
=cut
344
349
345
sub _process_mappings {
350
sub _process_mappings {
346
    my ($_self, $mappings, $data, $record_document) = @_;
351
    my ($_self, $mappings, $data, $record_document, $altscript) = @_;
347
    foreach my $mapping (@{$mappings}) {
352
    foreach my $mapping (@{$mappings}) {
348
        my ($target, $options) = @{$mapping};
353
        my ($target, $options) = @{$mapping};
354
355
        # Don't process sort fields for alternate scripts
356
        my $sort = $target =~ /__sort$/;
357
        if ($sort && $altscript) {
358
            next;
359
        }
360
349
        # Copy (scalar) data since can have multiple targets
361
        # Copy (scalar) data since can have multiple targets
350
        # with differing options for (possibly) mutating data
362
        # with differing options for (possibly) mutating data
351
        # so need a different copy for each
363
        # so need a different copy for each
Lines 363-369 sub _process_mappings { Link Here
363
                $options->{property} => $_data
375
                $options->{property} => $_data
364
            }
376
            }
365
        }
377
        }
366
        push @{$record_document->{$target}}, $_data;
378
        # For sort fields, index only a single field with concatenated values
379
        if ($sort && @{$record_document->{$target}}) {
380
            @{$record_document->{$target}}[0] .= " $_data";
381
        } else {
382
            push @{$record_document->{$target}}, $_data;
383
        }
367
    }
384
    }
368
}
385
}
369
386
Lines 399-415 sub marc_records_to_documents { Link Here
399
        my $record_document = {};
416
        my $record_document = {};
400
        my $mappings = $rules->{leader};
417
        my $mappings = $rules->{leader};
401
        if ($mappings) {
418
        if ($mappings) {
402
            $self->_process_mappings($mappings, $record->leader(), $record_document);
419
            $self->_process_mappings($mappings, $record->leader(), $record_document, 0);
403
        }
420
        }
404
        foreach my $field ($record->fields()) {
421
        foreach my $field ($record->fields()) {
405
            if($field->is_control_field()) {
422
            if ($field->is_control_field()) {
406
                my $mappings = $control_fields_rules->{$field->tag()};
423
                my $mappings = $control_fields_rules->{$field->tag()};
407
                if ($mappings) {
424
                if ($mappings) {
408
                    $self->_process_mappings($mappings, $field->data(), $record_document);
425
                    $self->_process_mappings($mappings, $field->data(), $record_document, 0);
409
                }
426
                }
410
            }
427
            }
411
            else {
428
            else {
412
                my $data_field_rules = $data_fields_rules->{$field->tag()};
429
                my $tag = $field->tag();
430
                # Handle alternate scripts in MARC 21
431
                my $altscript = 0;
432
                if ($marcflavour eq 'marc21' && $tag eq '880') {
433
                    my $sub6 = $field->subfield('6');
434
                    if ($sub6 =~ /^(...)-\d+/) {
435
                        $tag = $1;
436
                        $altscript = 1;
437
                    }
438
                }
439
440
                my $data_field_rules = $data_fields_rules->{$tag};
413
441
414
                if ($data_field_rules) {
442
                if ($data_field_rules) {
415
                    my $subfields_mappings = $data_field_rules->{subfields};
443
                    my $subfields_mappings = $data_field_rules->{subfields};
Lines 421-427 sub marc_records_to_documents { Link Here
421
                            $mappings = [@{$mappings}, @{$wildcard_mappings}];
449
                            $mappings = [@{$mappings}, @{$wildcard_mappings}];
422
                        }
450
                        }
423
                        if (@{$mappings}) {
451
                        if (@{$mappings}) {
424
                            $self->_process_mappings($mappings, $data, $record_document);
452
                            $self->_process_mappings($mappings, $data, $record_document, $altscript);
425
                        }
453
                        }
426
                    }
454
                    }
427
455
Lines 437-443 sub marc_records_to_documents { Link Here
437
                                )
465
                                )
438
                            );
466
                            );
439
                            if ($data) {
467
                            if ($data) {
440
                                $self->_process_mappings($subfields_join_mappings->{$subfields_group}, $data, $record_document);
468
                                $self->_process_mappings($subfields_join_mappings->{$subfields_group}, $data, $record_document, $altscript);
441
                            }
469
                            }
442
                        }
470
                        }
443
                    }
471
                    }
(-)a/t/Koha/SearchEngine/Elasticsearch.t (-6 / +5 lines)
Lines 117-123 subtest 'get_elasticsearch_mappings() tests' => sub { Link Here
117
117
118
subtest 'Koha::SearchEngine::Elasticsearch::marc_records_to_documents () tests' => sub {
118
subtest 'Koha::SearchEngine::Elasticsearch::marc_records_to_documents () tests' => sub {
119
119
120
    plan tests => 32;
120
    plan tests => 47;
121
121
122
    t::lib::Mocks::mock_preference('marcflavour', 'MARC21');
122
    t::lib::Mocks::mock_preference('marcflavour', 'MARC21');
123
123
Lines 290-300 subtest 'Koha::SearchEngine::Elasticsearch::marc_records_to_documents () tests' Link Here
290
    is(scalar @{$docs->[0][1]->{author}}, 2, 'First document author field should contain two values');
290
    is(scalar @{$docs->[0][1]->{author}}, 2, 'First document author field should contain two values');
291
    is_deeply($docs->[0][1]->{author}, ['Author 1', 'Corp Author'], 'First document author field should be set correctly');
291
    is_deeply($docs->[0][1]->{author}, ['Author 1', 'Corp Author'], 'First document author field should be set correctly');
292
292
293
    is(scalar @{$docs->[0][1]->{author__sort}}, 2, 'First document author__sort field should have two values');
293
    is(scalar @{$docs->[0][1]->{author__sort}}, 1, 'First document author__sort field should have a single value');
294
    is_deeply($docs->[0][1]->{author__sort}, ['Author 1', 'Corp Author'], 'First document author__sort field should be set correctly');
294
    is_deeply($docs->[0][1]->{author__sort}, ['Author 1 Corp Author'], 'First document author__sort field should be set correctly');
295
295
296
    is(scalar @{$docs->[0][1]->{title__sort}}, 3, 'First document title__sort field should have three values');
296
    is(scalar @{$docs->[0][1]->{title__sort}}, 1, 'First document title__sort field should have a single');
297
    is_deeply($docs->[0][1]->{title__sort}, ['Title:', 'first record', 'Title: first record'], 'First document title__sort field should be set correctly');
297
    is_deeply($docs->[0][1]->{title__sort}, ['Title: first record Title: first record'], 'First document title__sort field should be set correctly');
298
298
299
    is(scalar @{$docs->[0][1]->{title_wildcard}}, 2, 'First document title_wildcard field should have two values');
299
    is(scalar @{$docs->[0][1]->{title_wildcard}}, 2, 'First document title_wildcard field should have two values');
300
    is_deeply($docs->[0][1]->{title_wildcard}, ['Title:', 'first record'], 'First document title_wildcard field should be set correctly');
300
    is_deeply($docs->[0][1]->{title_wildcard}, ['Title:', 'first record'], 'First document title_wildcard field should be set correctly');
301
- 

Return to bug 20244