-# Creates the SQL Request
-
-sub create_request {
- my ($dbh,$tags, $and_or, $operator, $value) = @_;
-
- my $sql_tables; # will contain marc_subfield_table as m1,...
- my $sql_where1; # will contain the "true" where
- my $sql_where2 = "("; # will contain m1.authid=m2.authid
- my $nb_active=0; # will contain the number of "active" entries. and entry is active is a value is provided.
- my $nb_table=1; # will contain the number of table. ++ on each entry EXCEPT when an OR is provided.
-
-
- for(my $i=0; $i<=@$value;$i++) {
- if (@$value[$i]) {
- $nb_active++;
- if ($nb_active==1) {
- if (@$operator[$i] eq "start") {
- $sql_tables .= "auth_subfield_table as m$nb_table,";
- $sql_where1 .= "(m1.subfieldvalue like ".$dbh->quote("@$value[$i]%");
- if (@$tags[$i]) {
- $sql_where1 .=" and m1.tag+m1.subfieldcode in (@$tags[$i])";
- }
- $sql_where1.=")";
- } elsif (@$operator[$i] eq "contains") {
- $sql_tables .= "auth_word as m$nb_table,";
- $sql_where1 .= "(m1.word like ".$dbh->quote("@$value[$i]%");
- if (@$tags[$i]) {
- $sql_where1 .=" and m1.tagsubfield in (@$tags[$i])";
- }
- $sql_where1.=")";
- } else {
-
- $sql_tables .= "auth_subfield_table as m$nb_table,";
- $sql_where1 .= "(m1.subfieldvalue @$operator[$i] ".$dbh->quote("@$value[$i]");
- if (@$tags[$i]) {
- $sql_where1 .=" and m1.tag+m1.subfieldcode in (@$tags[$i])";
- }
- $sql_where1.=")";
- }
- } else {
- if (@$operator[$i] eq "start") {
- $nb_table++;
- $sql_tables .= "auth_subfield_table as m$nb_table,";
- $sql_where1 .= "@$and_or[$i] (m$nb_table.subfieldvalue like ".$dbh->quote("@$value[$i]%");
- if (@$tags[$i]) {
- $sql_where1 .=" and m$nb_table.tag+m$nb_table.subfieldcode in (@$tags[$i])";
- }
- $sql_where1.=")";
- $sql_where2 .= "m1.authid=m$nb_table.authid and ";
- } elsif (@$operator[$i] eq "contains") {
- if (@$and_or[$i] eq 'and') {
- $nb_table++;
- $sql_tables .= "auth_word as m$nb_table,";
- $sql_where1 .= "@$and_or[$i] (m$nb_table.word like ".$dbh->quote("@$value[$i]%");
- if (@$tags[$i]) {
- $sql_where1 .=" and m$nb_table.tagsubfield in(@$tags[$i])";
- }
- $sql_where1.=")";
- $sql_where2 .= "m1.authid=m$nb_table.authid and ";
- } else {
- $sql_where1 .= "@$and_or[$i] (m$nb_table.word like ".$dbh->quote("@$value[$i]%");
- if (@$tags[$i]) {
- $sql_where1 .=" and m$nb_table.tag+m$nb_table.subfieldid in (@$tags[$i])";
- }
- $sql_where1.=")";
- $sql_where2 .= "m1.authid=m$nb_table.authid and ";
- }
- } else {
- $nb_table++;
- $sql_tables .= "auth_subfield_table as m$nb_table,";
- $sql_where1 .= "@$and_or[$i] (m$nb_table.subfieldvalue @$operator[$i] ".$dbh->quote(@$value[$i]);
- if (@$tags[$i]) {
- $sql_where1 .=" and m$nb_table.tag+m$nb_table.subfieldcode in (@$tags[$i])";
- }
- $sql_where2 .= "m1.authid=m$nb_table.authid and ";
- $sql_where1.=")";
- }
- }
- }
- }
-
- if($sql_where2 ne "(") # some datas added to sql_where2, processing
- {
- $sql_where2 = substr($sql_where2, 0, (length($sql_where2)-5)); # deletes the trailing ' and '
- $sql_where2 .= ")";
- }
- else # no sql_where2 statement, deleting '('
- {
- $sql_where2 = "";
- }
- chop $sql_tables; # deletes the trailing ','
-
- return ($sql_tables, $sql_where1, $sql_where2);
+=head2 SearchAuthorities
+
+=over 4
+
+(\@finalresult, $nbresults)= &SearchAuthorities($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby)
+returns ref to array result and count of results returned
+
+=back
+
+=cut
+sub SearchAuthorities {
+ my ($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby) = @_;
+# warn "CALL : $tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby";
+ my $dbh=C4::Context->dbh;
+ if (C4::Context->preference('NoZebra')) {
+
+ #
+ # build the query
+ #
+ my $query;
+ my @auths=split / /,$authtypecode ;
+ foreach my $auth (@auths){
+ $query .="AND auth_type= $auth ";
+ }
+ $query =~ s/^AND //;
+ my $dosearch;
+ for(my $i = 0 ; $i <= $#{$value} ; $i++)
+ {
+ if (@$value[$i]){
+ if (@$tags[$i] eq "mainmainentry") {
+ $query .=" AND mainmainentry";
+ }elsif (@$tags[$i] eq "mainentry") {
+ $query .=" AND mainentry";
+ } else {
+ $query .=" AND ";
+ }
+ if (@$operator[$i] eq 'is') {
+ $query.=(@$tags[$i]?"=":""). '"'.@$value[$i].'"';
+ }elsif (@$operator[$i] eq "="){
+ $query.=(@$tags[$i]?"=":""). '"'.@$value[$i].'"';
+ }elsif (@$operator[$i] eq "start"){
+ $query.=(@$tags[$i]?"=":"").'"'.@$value[$i].'%"';
+ } else {
+ $query.=(@$tags[$i]?"=":"").'"'.@$value[$i].'%"';
+ }
+ $dosearch=1;
+ }#if value
+ }
+ #
+ # do the query (if we had some search term
+ #
+ if ($dosearch) {
+# warn "QUERY : $query";
+ my $result = C4::Search::NZanalyse($query,'authorityserver');
+# warn "result : $result";
+ my %result;
+ foreach (split /;/,$result) {
+ my ($authid,$title) = split /,/,$_;
+ # hint : the result is sorted by title.biblionumber because we can have X biblios with the same title
+ # and we don't want to get only 1 result for each of them !!!
+ # hint & speed improvement : we can order without reading the record
+ # so order, and read records only for the requested page !
+ $result{$title.$authid}=$authid;
+ }
+ # sort the hash and return the same structure as GetRecords (Zebra querying)
+ my @finalresult = ();
+ my $numbers=0;
+ if ($sortby eq 'HeadingDsc') { # sort by mainmainentry desc
+ foreach my $key (sort {$b cmp $a} (keys %result)) {
+ push @finalresult, $result{$key};
+# warn "push..."$#finalresult;
+ $numbers++;
+ }
+ } else { # sort by mainmainentry ASC
+ foreach my $key (sort (keys %result)) {
+ push @finalresult, $result{$key};
+# warn "push..."$#finalresult;
+ $numbers++;
+ }
+ }
+ # limit the $results_per_page to result size if it's more
+ $length = $numbers-1 if $numbers < $length;
+ # for the requested page, replace authid by the complete record
+ # speed improvement : avoid reading too much things
+ for (my $counter=$offset;$counter<=$offset+$length;$counter++) {
+# $finalresult[$counter] = GetAuthority($finalresult[$counter])->as_usmarc;
+ my $separator=C4::Context->preference('authoritysep');
+ my $authrecord = MARC::File::USMARC::decode(GetAuthority($finalresult[$counter])->as_usmarc);
+ my $authid=$authrecord->field('001')->data();
+ my $summary=BuildSummary($authrecord,$authid,$authtypecode);
+ my $query_auth_tag = "SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?";
+ my $sth = $dbh->prepare($query_auth_tag);
+ $sth->execute($authtypecode);
+ my $auth_tag_to_report = $sth->fetchrow;
+ my %newline;
+ $newline{used}=CountUsage($authid);
+ $newline{summary} = $summary;
+ $newline{authid} = $authid;
+ $newline{even} = $counter % 2;
+ $finalresult[$counter]= \%newline;
+ }
+ return (\@finalresult, $numbers);
+ } else {
+ return;
+ }
+ } else {
+ my $query;
+ my $attr;
+ # the marclist may contain "mainentry". In this case, search the tag_to_report, that depends on
+ # the authtypecode. Then, search on $a of this tag_to_report
+ # also store main entry MARC tag, to extract it at end of search
+ my $mainentrytag;
+ ##first set the authtype search and may be multiple authorities
+ my $n=0;
+ my @authtypecode;
+ my @auths=split / /,$authtypecode ;
+ foreach my $auth (@auths){
+ $query .=" \@attr 1=Authority/format-id \@attr 5=100 ".$auth; ##No truncation on authtype
+ push @authtypecode ,$auth;
+ $n++;
+ }
+ if ($n>1){
+ while ($n>1){$query= "\@or ".$query;$n--;}
+ }
+
+ my $dosearch;
+ my $and;
+ my $q2;
+ for(my $i = 0 ; $i <= $#{$value} ; $i++)
+ {
+ if (@$value[$i]){
+ ##If mainentry search $a tag
+ if (@$tags[$i] eq "mainmainentry") {
+ $attr =" \@attr 1=Heading ";
+ }elsif (@$tags[$i] eq "mainentry") {
+ $attr =" \@attr 1=Heading-Entity ";
+ }else{
+ $attr =" \@attr 1=Any ";
+ }
+ if (@$operator[$i] eq 'is') {
+ $attr.=" \@attr 4=1 \@attr 5=100 ";##Phrase, No truncation,all of subfield field must match
+ }elsif (@$operator[$i] eq "="){
+ $attr.=" \@attr 4=107 "; #Number Exact match
+ }elsif (@$operator[$i] eq "start"){
+ $attr.=" \@attr 4=1 \@attr 5=1 ";#Phrase, Right truncated
+ } else {
+ $attr .=" \@attr 5=1 \@attr 4=6 ";## Word list, right truncated, anywhere
+ }
+ $and .=" \@and " ;
+ $attr =$attr."\"".@$value[$i]."\"";
+ $q2 .=$attr;
+ $dosearch=1;
+ }#if value
+ }
+ ##Add how many queries generated
+ if ($query=~/\S+/){
+ $query= $and.$query.$q2
+ } else {
+ $query=$q2;
+ }
+ ## Adding order
+ $query=' @or @attr 7=1 @attr 1=Heading 0 @or @attr 7=1 @attr 1=Heading-Entity 1'.$query if ($sortby eq "HeadingAsc");
+ $query=' @or @attr 7=2 @attr 1=Heading 0 @or @attr 7=1 @attr 1=Heading-Entity 1'.$query if ($sortby eq "HeadingDsc");
+
+ $offset=0 unless $offset;
+ my $counter = $offset;
+ $length=10 unless $length;
+ my @oAuth;
+ my $i;
+ $oAuth[0]=C4::Context->Zconn("authorityserver" , 1);
+ my $Anewq= new ZOOM::Query::PQF($query,$oAuth[0]);
+ my $oAResult;
+ $oAResult= $oAuth[0]->search($Anewq) ;
+ while (($i = ZOOM::event(\@oAuth)) != 0) {
+ my $ev = $oAuth[$i-1]->last_event();
+ last if $ev == ZOOM::Event::ZEND;
+ }
+ my($error, $errmsg, $addinfo, $diagset) = $oAuth[0]->error_x();
+ if ($error) {
+ warn "oAuth error: $errmsg ($error) $addinfo $diagset\n";
+ goto NOLUCK;
+ }
+
+ my $nbresults;
+ $nbresults=$oAResult->size();
+ my $nremains=$nbresults;
+ my @result = ();
+ my @finalresult = ();
+
+ if ($nbresults>0){
+
+ ##Find authid and linkid fields
+ ##we may be searching multiple authoritytypes.
+ ## FIXME this assumes that all authid and linkid fields are the same for all authority types
+ # my ($authidfield,$authidsubfield)=GetAuthMARCFromKohaField($dbh,"auth_header.authid",$authtypecode[0]);
+ # my ($linkidfield,$linkidsubfield)=GetAuthMARCFromKohaField($dbh,"auth_header.linkid",$authtypecode[0]);
+ while (($counter < $nbresults) && ($counter < ($offset + $length))) {
+
+ ##Here we have to extract MARC record and $authid from ZEBRA AUTHORITIES
+ my $rec=$oAResult->record($counter);
+ my $marcdata=$rec->raw();
+ my $authrecord;
+ my $separator=C4::Context->preference('authoritysep');
+ $authrecord = MARC::File::USMARC::decode($marcdata);
+ my $authid=$authrecord->field('001')->data();
+ my $summary=BuildSummary($authrecord,$authid,$authtypecode);
+ my $query_auth_tag = "SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?";
+ my $sth = $dbh->prepare($query_auth_tag);
+ $sth->execute($authtypecode);
+ my $auth_tag_to_report = $sth->fetchrow;
+ my %newline;
+ $newline{summary} = $summary;
+ $newline{authid} = $authid;
+ $newline{even} = $counter % 2;
+ $counter++;
+ push @finalresult, \%newline;
+ }## while counter
+ ###
+ for (my $z=0; $z<@finalresult; $z++){
+ my $count=CountUsage($finalresult[$z]{authid});
+ $finalresult[$z]{used}=$count;
+ }# all $z's
+
+ }## if nbresult
+ NOLUCK:
+ # $oAResult->destroy();
+ # $oAuth[0]->destroy();
+
+ return (\@finalresult, $nbresults);
+ }