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

(-)a/Koha/SearchEngine/Elasticsearch.pm (-94 / +96 lines)
Lines 645-690 sub marc_records_to_documents { Link Here
645
                        $altscript = 1;
645
                        $altscript = 1;
646
                    }
646
                    }
647
                }
647
                }
648
648
                $self->_process_data_field_rules(
649
                my $data_field_rules = $data_fields_rules->{$tag};
649
                    $data_fields_rules->{$tag},
650
                if ($data_field_rules) {
650
                    $field,
651
                    my $subfields_mappings = $data_field_rules->{subfields};
651
                    $record_document,
652
                    my $wildcard_mappings = $subfields_mappings->{'*'};
652
                    $altscript
653
                    foreach my $subfield ($field->subfields()) {
653
                );
654
                        my ($code, $data) = @{$subfield};
655
                        my $mappings = $subfields_mappings->{$code} // [];
656
                        if ($wildcard_mappings) {
657
                            $mappings = [@{$mappings}, @{$wildcard_mappings}];
658
                        }
659
                        if (@{$mappings}) {
660
                            $self->_process_mappings($mappings, $data, $record_document, {
661
                                    altscript => $altscript,
662
                                    data_source => 'subfield',
663
                                    code => $code,
664
                                    field => $field
665
                                }
666
                            );
667
                        }
668
                    }
669
670
                    my $subfields_join_mappings = $data_field_rules->{subfields_join};
671
                    if ($subfields_join_mappings) {
672
                        foreach my $subfields_group (keys %{$subfields_join_mappings}) {
673
                            my $data_field = $field->clone; #copy field to preserve for alt scripts
674
                            $data_field->delete_subfield(match => qr/^$/); #remove empty subfields, otherwise they are printed as a space
675
                            my $data = $data_field->as_string( $subfields_group ); #get values for subfields as a combined string, preserving record order
676
                            if ($data) {
677
                                $self->_process_mappings($subfields_join_mappings->{$subfields_group}, $data, $record_document, {
678
                                        altscript => $altscript,
679
                                        data_source => 'subfields_group',
680
                                        codes => $subfields_group,
681
                                        field => $field
682
                                    }
683
                                );
684
                            }
685
                        }
686
                    }
687
                }
688
            }
654
            }
689
        }
655
        }
690
656
Lines 702-762 sub marc_records_to_documents { Link Here
702
            if ( C4::Context->preference('IncludeSeeAlsoFromInSearches') ) {
668
            if ( C4::Context->preference('IncludeSeeAlsoFromInSearches') ) {
703
                push @other_headings, 'see_also_from';
669
                push @other_headings, 'see_also_from';
704
            }
670
            }
671
705
            $marc_filter->initialize( { options => { other_headings => \@other_headings } } );
672
            $marc_filter->initialize( { options => { other_headings => \@other_headings } } );
706
            foreach my $field ( $marc_filter->fields($record) ) {
673
            foreach my $field ( $marc_filter->fields($record) ) {
707
                my $data_field_rules = $data_fields_rules->{ $field->tag() };
674
                $self->_process_data_field_rules(
708
                if ($data_field_rules) {
675
                    $data_fields_rules->{$field->tag()},
709
                    my $subfields_mappings = $data_field_rules->{subfields};
676
                    $field,
710
                    my $wildcard_mappings  = $subfields_mappings->{'*'};
677
                    $record_document,
711
                    foreach my $subfield ( $field->subfields() ) {
678
                    0,
712
                        my ( $code, $data ) = @{$subfield};
679
                    # Do not include "see from" into these kind of fields
713
                        my @mappings;
680
                    qr/__(sort|facet|suggestion)$/
714
                        push @mappings, @{ $subfields_mappings->{$code} } if $subfields_mappings->{$code};
681
                );
715
                        push @mappings, @$wildcard_mappings               if $wildcard_mappings;
716
717
                        # Do not include "see from" into these kind of fields
718
                        @mappings = grep { $_->[0] !~ /__(sort|facet|suggestion)$/ } @mappings;
719
                        if (@mappings) {
720
                            $self->_process_mappings(
721
                                \@mappings,
722
                                $data,
723
                                $record_document,
724
                                {
725
                                    data_source => 'subfield',
726
                                    code        => $code,
727
                                    field       => $field
728
                                }
729
                            );
730
                        }
731
                    }
732
733
                    my $subfields_join_mappings = $data_field_rules->{subfields_join};
734
                    if ($subfields_join_mappings) {
735
                        foreach my $subfields_group ( keys %{$subfields_join_mappings} ) {
736
                            my $data_field = $field->clone;
737
738
                            # remove empty subfields, otherwise they are printed as a space
739
                            $data_field->delete_subfield( match => qr/^$/ );
740
                            my $data = $data_field->as_string($subfields_group);
741
                            if ($data) {
742
                                my @mappings = @{ $subfields_join_mappings->{$subfields_group} };
743
744
                                # Do not include "see from" into these kind of fields
745
                                @mappings = grep { $_->[0] !~ /__(sort|facet|suggestion)$/ } @mappings;
746
                                $self->_process_mappings(
747
                                    \@mappings,
748
                                    $data,
749
                                    $record_document,
750
                                    {
751
                                        data_source => 'subfields_group',
752
                                        codes       => $subfields_group,
753
                                        field       => $field
754
                                    }
755
                                );
756
                            }
757
                        }
758
                    }
759
                }
760
            }
682
            }
761
        }
683
        }
762
684
Lines 891-896 sub marc_records_to_documents { Link Here
891
    return \@record_documents;
813
    return \@record_documents;
892
}
814
}
893
815
816
=head2 _process_data_field_rules($rules, $field, $record_document, $altscript, $exclude_target_fields_regexp)
817
818
Process mapping rules for a single MARC::Field data field.
819
820
=over 4
821
822
=item C<$rules>
823
824
Data field mapping rules to be applied.
825
826
=item C<$field>
827
828
The source Marc::Field data field.
829
830
=item C<$record_document>
831
832
The target elasticsearch document.
833
834
=item C<$altscript>
835
836
A boolean value indicating whether an alternate script presentation is being
837
processed.
838
839
=back
840
841
=item C<$exclude_target_fields_regexp>
842
843
An optional regexp for excluding target fields in mappings.
844
845
=back
846
847
=cut
848
849
sub _process_data_field_rules {
850
    my ($self, $rules, $field, $record_document, $altscript, $exclude_target_fields_regexp) = @_;
851
    if ($rules) {
852
        my $subfields_mappings = $rules->{subfields};
853
        my $wildcard_mappings = $subfields_mappings->{'*'};
854
        foreach my $subfield ($field->subfields()) {
855
            my ($code, $data) = @{$subfield};
856
            my @mappings;
857
            push @mappings, @{$subfields_mappings->{$code}} if $subfields_mappings->{$code};
858
            push @mappings, @{$wildcard_mappings} if $wildcard_mappings;
859
            if (@mappings) {
860
                if ($exclude_target_fields_regexp) {
861
                    @mappings = grep { $_->[0] !~ $exclude_target_fields_regexp } @mappings;
862
                }
863
               $self->_process_mappings(\@mappings, $data, $record_document, {
864
                        altscript => $altscript,
865
                        data_source => 'subfield',
866
                        code => $code,
867
                        field => $field
868
                    }
869
                );
870
            }
871
        }
872
873
        my $subfields_join_mappings = $rules->{subfields_join};
874
        if ($subfields_join_mappings) {
875
            foreach my $subfields_group (keys %{$subfields_join_mappings}) {
876
                my $data_field = $field->clone; #copy field to preserve for alt scripts
877
                $data_field->delete_subfield(match => qr/^$/); #remove empty subfields, otherwise they are printed as a space
878
                my $data = $data_field->as_string( $subfields_group ); #get values for subfields as a combined string, preserving record order
879
                if ($data) {
880
                    my @mappings = @{$subfields_join_mappings->{$subfields_group}};
881
                    if ($exclude_target_fields_regexp) {
882
                        @mappings = grep { $_->[0] !~ /$exclude_target_fields_regexp/ } @mappings;
883
                    }
884
                    $self->_process_mappings(\@mappings, $data, $record_document, {
885
                            altscript => $altscript,
886
                            data_source => 'subfields_group',
887
                            codes => $subfields_group,
888
                            field => $field
889
                        }
890
                    );
891
                }
892
            }
893
        }
894
    }
895
}
896
894
=head2 _marc_to_array($record)
897
=head2 _marc_to_array($record)
895
898
896
    my @fields = _marc_to_array($record)
899
    my @fields = _marc_to_array($record)
897
- 

Return to bug 39158