Lines 824-862
Comments : an improvement would be to return All the records that match.
Link Here
|
824 |
|
824 |
|
825 |
=cut |
825 |
=cut |
826 |
|
826 |
|
|
|
827 |
sub _find_duplicate_authority_try { |
828 |
my ($try, $authorityfield, $authtypecode) = @_; |
829 |
|
830 |
my $filtervalues = |
831 |
qr([\001-\040\!\'\"\`\#\$\%\&\*\+,\-\./:;<=>\?\@\(\)\{\[\]\}_\|\~]); |
832 |
|
833 |
my $op = 'and'; |
834 |
if (C4::Context->preference('UseQueryParser')) { |
835 |
my $QParser = C4::Context->queryparser; |
836 |
if ($QParser) { |
837 |
$op = '&&'; |
838 |
} |
839 |
} |
840 |
|
841 |
# build a request for SearchAuthorities |
842 |
my $query = "at=$authtypecode"; |
843 |
|
844 |
my $duplicaterecord; |
845 |
if ($try->{field} and $try->{subfields}) { |
846 |
foreach my $s (@{ $try->{subfields} }) { |
847 |
my $v = $authorityfield->subfield($s); |
848 |
if ($v) { |
849 |
$v =~ s/$filtervalues/ /g; |
850 |
$v =~ s/^\s*//; |
851 |
$v =~ s/\s*$//; |
852 |
$query .= qq/ $op $try->{index}="$v"/; |
853 |
} |
854 |
} |
855 |
my $maxresults = C4::Context->preference('FindDuplicateAuthorityMaxResults') || 10; |
856 |
my ($error, $results, $total_hits) = |
857 |
C4::Search::SimpleSearch($query, 0, $maxresults, ["authorityserver"]); |
858 |
return unless (!defined $error and @{$results}); |
859 |
|
860 |
foreach my $result (@$results) { |
861 |
my $marcrecord = MARC::File::USMARC::decode($result); |
862 |
my @marcfields = $marcrecord->field($try->{field}); |
863 |
next if (scalar @marcfields == 0); |
864 |
my $stillmatch = 1; |
865 |
foreach my $marcfield (@marcfields) { |
866 |
foreach my $subfield (@{ $try->{subfields} }) { |
867 |
my $authoritysubfield = $authorityfield->subfield($subfield); |
868 |
my $marcsubfield = $marcfield->subfield($subfield); |
869 |
if ( (defined $authoritysubfield xor defined $marcsubfield) |
870 |
or (defined $authoritysubfield |
871 |
and $authoritysubfield ne $marcsubfield) |
872 |
) { |
873 |
$stillmatch = 0; |
874 |
last; |
875 |
} |
876 |
} |
877 |
last unless $stillmatch; |
878 |
} |
879 |
if ($stillmatch) { |
880 |
$duplicaterecord = $marcrecord; |
881 |
last; |
882 |
} |
883 |
} |
884 |
} else { |
885 |
foreach my $s ($authorityfield->subfields()) { |
886 |
next unless ($s->[0] =~ /[A-z]/); |
887 |
$s->[1] =~ s/$filtervalues/ /g; |
888 |
$query .= qq/ $op $try->{index}="$s->[1]"/; |
889 |
} |
890 |
my ($error, $results, $total_hits) = |
891 |
C4::Search::SimpleSearch( $query, 0, 1, ["authorityserver"] ); |
892 |
if (!defined $error and @{$results}) { |
893 |
$duplicaterecord = MARC::File::USMARC::decode($results->[0]); |
894 |
} |
895 |
} |
896 |
|
897 |
return $duplicaterecord; |
898 |
} |
899 |
|
827 |
sub FindDuplicateAuthority { |
900 |
sub FindDuplicateAuthority { |
|
|
901 |
my ($record, $authtypecode) = @_; |
902 |
|
903 |
return unless $record; |
904 |
|
905 |
my $opts = C4::Context->preference('FindDuplicateAuthorityOptions'); |
906 |
return unless $opts; |
828 |
|
907 |
|
829 |
my ($record,$authtypecode)=@_; |
|
|
830 |
# warn "IN for ".$record->as_formatted; |
831 |
my $dbh = C4::Context->dbh; |
908 |
my $dbh = C4::Context->dbh; |
832 |
# warn "".$record->as_formatted; |
909 |
my $sth = $dbh->prepare(" |
833 |
my $sth = $dbh->prepare("select auth_tag_to_report from auth_types where authtypecode=?"); |
910 |
SELECT auth_tag_to_report FROM auth_types WHERE authtypecode = ? |
|
|
911 |
"); |
834 |
$sth->execute($authtypecode); |
912 |
$sth->execute($authtypecode); |
835 |
my ($auth_tag_to_report) = $sth->fetchrow; |
913 |
my ($auth_tag_to_report) = $sth->fetchrow; |
836 |
$sth->finish; |
914 |
$sth->finish; |
837 |
# warn "record :".$record->as_formatted." auth_tag_to_report :$auth_tag_to_report"; |
915 |
|
838 |
# build a request for SearchAuthorities |
916 |
my $authorityfield = $record->field($auth_tag_to_report); |
839 |
my $QParser; |
917 |
return unless $authorityfield; |
840 |
$QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser')); |
918 |
|
841 |
my $op; |
919 |
my @tries; |
842 |
if ($QParser) { |
920 |
$opts =~ s/ //g; |
843 |
$op = '&&'; |
921 |
foreach my $try (split /\|/, $opts) { |
844 |
} else { |
922 |
my ($index, $matchcheck) = split m#/#, $try; |
845 |
$op = 'and'; |
923 |
my ($field, @subfields); |
|
|
924 |
if ($matchcheck and length($matchcheck) > 3) { |
925 |
$field = substr $matchcheck, 0, 3; |
926 |
@subfields = split(//, substr($matchcheck, 3)); |
927 |
} |
928 |
push @tries, { |
929 |
index => $index, |
930 |
field => $field, |
931 |
subfields => \@subfields, |
932 |
}; |
846 |
} |
933 |
} |
847 |
my $query='at:'.$authtypecode.' '; |
934 |
|
848 |
my $filtervalues=qr([\001-\040\!\'\"\`\#\$\%\&\*\+,\-\./:;<=>\?\@\(\)\{\[\]\}_\|\~]); |
935 |
my $duplicaterecord; |
849 |
if ($record->field($auth_tag_to_report)) { |
936 |
foreach my $try (@tries) { |
850 |
foreach ($record->field($auth_tag_to_report)->subfields()) { |
937 |
$duplicaterecord = _find_duplicate_authority_try($try, $authorityfield, |
851 |
$_->[1]=~s/$filtervalues/ /g; $query.= " $op he:\"".$_->[1]."\"" if ($_->[0]=~/[A-z]/); |
938 |
$authtypecode); |
852 |
} |
939 |
last if $duplicaterecord; |
853 |
} |
940 |
} |
854 |
my ($error, $results, $total_hits) = C4::Search::SimpleSearch( $query, 0, 1, [ "authorityserver" ] ); |
941 |
|
855 |
# there is at least 1 result => return the 1st one |
942 |
if ($duplicaterecord) { |
856 |
if (!defined $error && @{$results} ) { |
943 |
my $authid = $duplicaterecord->field('001')->data; |
857 |
my $marcrecord = MARC::File::USMARC::decode($results->[0]); |
944 |
return $authid, BuildSummary($duplicaterecord, $authid, $authtypecode); |
858 |
return $marcrecord->field('001')->data,BuildSummary($marcrecord,$marcrecord->field('001')->data,$authtypecode); |
|
|
859 |
} |
945 |
} |
|
|
946 |
|
860 |
# no result, returns nothing |
947 |
# no result, returns nothing |
861 |
return; |
948 |
return; |
862 |
} |
949 |
} |