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

(-)a/Koha/SearchEngine/Elasticsearch.pm (-104 / +111 lines)
Lines 697-752 sub marc_records_to_documents { Link Here
697
                        $altscript = 1;
697
                        $altscript = 1;
698
                    }
698
                    }
699
                }
699
                }
700
700
                $self->_process_data_field_rules(
701
                my $data_field_rules = $data_fields_rules->{$tag};
701
                    $data_fields_rules->{$tag},
702
                if ($data_field_rules) {
702
                    $field,
703
                    my $subfields_mappings = $data_field_rules->{subfields};
703
                    $record_document,
704
                    my $wildcard_mappings  = $subfields_mappings->{'*'};
704
                    $altscript
705
                    foreach my $subfield ( $field->subfields() ) {
705
                );
706
                        my ( $code, $data ) = @{$subfield};
707
                        my $mappings = $subfields_mappings->{$code} // [];
708
                        if ($wildcard_mappings) {
709
                            $mappings = [ @{$mappings}, @{$wildcard_mappings} ];
710
                        }
711
                        if ( @{$mappings} ) {
712
                            $self->_process_mappings(
713
                                $mappings,
714
                                $data,
715
                                $record_document,
716
                                {
717
                                    altscript   => $altscript,
718
                                    data_source => 'subfield',
719
                                    code        => $code,
720
                                    field       => $field
721
                                }
722
                            );
723
                        }
724
                    }
725
726
                    my $subfields_join_mappings = $data_field_rules->{subfields_join};
727
                    if ($subfields_join_mappings) {
728
                        foreach my $subfields_group ( keys %{$subfields_join_mappings} ) {
729
                            my $data_field = $field->clone;    #copy field to preserve for alt scripts
730
                            $data_field->delete_subfield( match => qr/^$/ )
731
                                ;    #remove empty subfields, otherwise they are printed as a space
732
                            my $data = $data_field->as_string($subfields_group)
733
                                ;    #get values for subfields as a combined string, preserving record order
734
                            if ($data) {
735
                                $self->_process_mappings(
736
                                    $subfields_join_mappings->{$subfields_group},
737
                                    $data,
738
                                    $record_document,
739
                                    {
740
                                        altscript   => $altscript,
741
                                        data_source => 'subfields_group',
742
                                        codes       => $subfields_group,
743
                                        field       => $field
744
                                    }
745
                                );
746
                            }
747
                        }
748
                    }
749
                }
750
            }
706
            }
751
        }
707
        }
752
708
Lines 764-824 sub marc_records_to_documents { Link Here
764
            if ( C4::Context->preference('IncludeSeeAlsoFromInSearches') ) {
720
            if ( C4::Context->preference('IncludeSeeAlsoFromInSearches') ) {
765
                push @other_headings, 'see_also_from';
721
                push @other_headings, 'see_also_from';
766
            }
722
            }
723
767
            $marc_filter->initialize( { options => { other_headings => \@other_headings } } );
724
            $marc_filter->initialize( { options => { other_headings => \@other_headings } } );
768
            foreach my $field ( $marc_filter->fields($record) ) {
725
            foreach my $field ( $marc_filter->fields($record) ) {
769
                my $data_field_rules = $data_fields_rules->{ $field->tag() };
726
                $self->_process_data_field_rules(
770
                if ($data_field_rules) {
727
                    $data_fields_rules->{ $field->tag() },
771
                    my $subfields_mappings = $data_field_rules->{subfields};
728
                    $field,
772
                    my $wildcard_mappings  = $subfields_mappings->{'*'};
729
                    $record_document,
773
                    foreach my $subfield ( $field->subfields() ) {
730
                    0,
774
                        my ( $code, $data ) = @{$subfield};
731
775
                        my @mappings;
732
                    # Do not include "see from" into these kind of fields
776
                        push @mappings, @{ $subfields_mappings->{$code} } if $subfields_mappings->{$code};
733
                    qr/__(sort|facet|suggestion)$/
777
                        push @mappings, @$wildcard_mappings               if $wildcard_mappings;
734
                );
778
779
                        # Do not include "see from" into these kind of fields
780
                        @mappings = grep { $_->[0] !~ /__(sort|facet|suggestion)$/ } @mappings;
781
                        if (@mappings) {
782
                            $self->_process_mappings(
783
                                \@mappings,
784
                                $data,
785
                                $record_document,
786
                                {
787
                                    data_source => 'subfield',
788
                                    code        => $code,
789
                                    field       => $field
790
                                }
791
                            );
792
                        }
793
                    }
794
795
                    my $subfields_join_mappings = $data_field_rules->{subfields_join};
796
                    if ($subfields_join_mappings) {
797
                        foreach my $subfields_group ( keys %{$subfields_join_mappings} ) {
798
                            my $data_field = $field->clone;
799
800
                            # remove empty subfields, otherwise they are printed as a space
801
                            $data_field->delete_subfield( match => qr/^$/ );
802
                            my $data = $data_field->as_string($subfields_group);
803
                            if ($data) {
804
                                my @mappings = @{ $subfields_join_mappings->{$subfields_group} };
805
806
                                # Do not include "see from" into these kind of fields
807
                                @mappings = grep { $_->[0] !~ /__(sort|facet|suggestion)$/ } @mappings;
808
                                $self->_process_mappings(
809
                                    \@mappings,
810
                                    $data,
811
                                    $record_document,
812
                                    {
813
                                        data_source => 'subfields_group',
814
                                        codes       => $subfields_group,
815
                                        field       => $field
816
                                    }
817
                                );
818
                            }
819
                        }
820
                    }
821
                }
822
            }
735
            }
823
        }
736
        }
824
737
Lines 979-984 sub marc_records_to_documents { Link Here
979
    return \@record_documents;
892
    return \@record_documents;
980
}
893
}
981
894
895
=head2 _process_data_field_rules($rules, $field, $record_document, $altscript, $exclude_target_fields_regexp)
896
897
Process mapping rules for a single MARC::Field data field.
898
899
=over 4
900
901
=item C<$rules>
902
903
Data field mapping rules to be applied.
904
905
=item C<$field>
906
907
The source Marc::Field data field.
908
909
=item C<$record_document>
910
911
The target elasticsearch document.
912
913
=item C<$altscript>
914
915
A boolean value indicating whether an alternate script presentation is being
916
processed.
917
918
=back
919
920
=item C<$exclude_target_fields_regexp>
921
922
An optional regexp for excluding target fields in mappings.
923
924
=back
925
926
=cut
927
928
sub _process_data_field_rules {
929
    my ( $self, $rules, $field, $record_document, $altscript, $exclude_target_fields_regexp ) = @_;
930
    if ($rules) {
931
        my $subfields_mappings = $rules->{subfields};
932
        my $wildcard_mappings  = $subfields_mappings->{'*'};
933
        foreach my $subfield ( $field->subfields() ) {
934
            my ( $code, $data ) = @{$subfield};
935
            my @mappings;
936
            push @mappings, @{ $subfields_mappings->{$code} } if $subfields_mappings->{$code};
937
            push @mappings, @{$wildcard_mappings}             if $wildcard_mappings;
938
            if (@mappings) {
939
                if ($exclude_target_fields_regexp) {
940
                    @mappings = grep { $_->[0] !~ $exclude_target_fields_regexp } @mappings;
941
                }
942
                $self->_process_mappings(
943
                    \@mappings,
944
                    $data,
945
                    $record_document,
946
                    {
947
                        altscript   => $altscript,
948
                        data_source => 'subfield',
949
                        code        => $code,
950
                        field       => $field
951
                    }
952
                );
953
            }
954
        }
955
956
        my $subfields_join_mappings = $rules->{subfields_join};
957
        if ($subfields_join_mappings) {
958
            foreach my $subfields_group ( keys %{$subfields_join_mappings} ) {
959
960
                # copy field to preserve for alt scripts
961
                my $data_field = $field->clone;
962
963
                #remove empty subfields, otherwise they are printed as a space
964
                $data_field->delete_subfield( match => qr/^$/ );
965
966
                #get values for subfields as a combined string, preserving record order
967
                my $data = $data_field->as_string($subfields_group);
968
                if ($data) {
969
                    my @mappings = @{ $subfields_join_mappings->{$subfields_group} };
970
                    if ($exclude_target_fields_regexp) {
971
                        @mappings = grep { $_->[0] !~ /$exclude_target_fields_regexp/ } @mappings;
972
                    }
973
                    $self->_process_mappings(
974
                        \@mappings,
975
                        $data,
976
                        $record_document,
977
                        {
978
                            altscript   => $altscript,
979
                            data_source => 'subfields_group',
980
                            codes       => $subfields_group,
981
                            field       => $field
982
                        }
983
                    );
984
                }
985
            }
986
        }
987
    }
988
}
989
982
=head2 _marc_to_array($record)
990
=head2 _marc_to_array($record)
983
991
984
    my @fields = _marc_to_array($record)
992
    my @fields = _marc_to_array($record)
985
- 

Return to bug 39158