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 |
- |
|
|