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

(-)a/C4/Matcher.pm (-29 / +47 lines)
Lines 17-30 package C4::Matcher; Link Here
17
# You should have received a copy of the GNU General Public License
17
# You should have received a copy of the GNU General Public License
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
19
20
use strict;
20
use Modern::Perl;
21
use warnings;
22
21
23
use C4::Context;
24
use MARC::Record;
22
use MARC::Record;
25
23
26
use Koha::SearchEngine;
24
use Koha::SearchEngine;
27
use Koha::SearchEngine::Search;
25
use Koha::SearchEngine::Search;
26
use Koha::Util::Normalize qw/legacy_default remove_spaces upper_case lower_case/;
28
27
29
=head1 NAME
28
=head1 NAME
30
29
Lines 774-779 sub _passes_required_checks { Link Here
774
}
773
}
775
774
776
sub _get_match_keys {
775
sub _get_match_keys {
776
777
    my $source_record = shift;
777
    my $source_record = shift;
778
    my $matchpoint = shift;
778
    my $matchpoint = shift;
779
    my $check_only_first_repeat = @_ ? shift : 0;
779
    my $check_only_first_repeat = @_ ? shift : 0;
Lines 792-798 sub _get_match_keys { Link Here
792
    # If there are two 003s and two 001s, there will be two keys:
792
    # If there are two 003s and two 001s, there will be two keys:
793
    #    first 003 + first 001
793
    #    first 003 + first 001
794
    #    second 003 + second 001
794
    #    second 003 + second 001
795
    
795
796
    my @keys = ();
796
    my @keys = ();
797
    for (my $i = 0; $i <= $#{ $matchpoint->{'components'} }; $i++) {
797
    for (my $i = 0; $i <= $#{ $matchpoint->{'components'} }; $i++) {
798
        my $component = $matchpoint->{'components'}->[$i];
798
        my $component = $matchpoint->{'components'}->[$i];
Lines 801-824 sub _get_match_keys { Link Here
801
            $j++;
801
            $j++;
802
            last FIELD if $j > 0 and $check_only_first_repeat;
802
            last FIELD if $j > 0 and $check_only_first_repeat;
803
            last FIELD if $i > 0 and $j > $#keys;
803
            last FIELD if $i > 0 and $j > $#keys;
804
            my $key = "";
804
805
			my $string;
805
            my $string;
806
            if ($field->is_control_field()) {
806
            if ( $field->is_control_field() ) {
807
				$string=$field->data();
807
                $string = $field->data();
808
            } else {
808
            } else {
809
                foreach my $subfield ($field->subfields()) {
809
                $string = $field->as_string(
810
                    if (exists $component->{'subfields'}->{$subfield->[0]}) {
810
                    join('', keys %{ $component->{ subfields } }), ' ' # ' ' as separator
811
                        $string .= " " . $subfield->[1]; #FIXME: It would be better to create an array and join with a space later...
811
                );
812
                    }
812
            }
813
                }
813
814
			}
815
            if ($component->{'length'}>0) {
814
            if ($component->{'length'}>0) {
816
                    $string= substr($string, $component->{'offset'}, $component->{'length'});
815
                $string= substr($string, $component->{'offset'}, $component->{'length'});
817
                            # FIXME normalize, substr
818
            } elsif ($component->{'offset'}) {
816
            } elsif ($component->{'offset'}) {
819
                    $string= substr($string, $component->{'offset'});
817
                $string= substr($string, $component->{'offset'});
820
            }
818
            }
821
            $key = _normalize($string);
819
820
            my $norms = $component->{'norms'};
821
            my $key = $string;
822
823
            foreach my $norm ( @{ $norms } ) {
824
                if ( grep { $norm eq $_ } valid_normalization_routines() ) {
825
                    if ( $norm eq 'remove_spaces' ) {
826
                        $key = remove_spaces($key);
827
                    }
828
                    elsif ( $norm eq 'upper_case' ) {
829
                        $key = upper_case($key);
830
                    }
831
                    elsif ( $norm eq 'lower_case' ) {
832
                        $key = lower_case($key);
833
                    }
834
                    elsif ( $norm eq 'legacy_default' ) {
835
                        $key = legacy_default($key);
836
                    }
837
                } else {
838
                    warn "Invalid normalization routine required ($norm)"
839
                        unless $norm eq 'none';
840
                }
841
            }
842
822
            if ($i == 0) {
843
            if ($i == 0) {
823
                push @keys, $key if $key;
844
                push @keys, $key if $key;
824
            } else {
845
            } else {
Lines 843-858 sub _parse_match_component { Link Here
843
    return $component;
864
    return $component;
844
}
865
}
845
866
846
# FIXME - default normalizer
867
sub valid_normalization_routines {
847
sub _normalize {
868
848
    my $value = uc shift;
869
    return (
849
    $value =~ s/[.;:,\]\[\)\(\/'"]//g;
870
        'remove_spaces',
850
    $value =~ s/^\s+//;
871
        'upper_case',
851
    #$value =~ s/^\s+$//;
872
        'lower_case',
852
    $value =~ s/\s+$//;
873
        'legacy_default'
853
    $value =~ s/\s+/ /g;
874
    );
854
    #$value =~ s/[.;,\]\[\)\(\/"']//g;
855
    return $value;
856
}
875
}
857
876
858
1;
877
1;
859
- 

Return to bug 17318