--- loncom/interface/lonsearchcat.pm 2002/06/27 19:28:50 1.133 +++ loncom/interface/lonsearchcat.pm 2002/07/08 14:28:10 1.137 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.133 2002/06/27 19:28:50 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.137 2002/07/08 14:28:10 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -107,7 +107,7 @@ button that closes the search window =item $importbutton -button to take the selecte results and go to group sorting +button to take the select results and go to group sorting =item %hash @@ -219,16 +219,29 @@ END ## ## What are we doing? ## - if ($ENV{'form.basicsubmit'} eq 'SEARCH') { - # Perform basic search and give results - return &basicsearch($r,$hidden); - } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { - # Perform advanced search and give results - return &advancedsearch($r,$hidden); + my $searchtype; + $searchtype = 'Basic' if ($ENV{'form.basicsubmit'} eq 'SEARCH'); + $searchtype = 'Advanced' if ($ENV{'form.advancedsubmit'} eq 'SEARCH'); + if ($searchtype) { + my ($query,$customquery,$customshow,$libraries) = + (undef,undef,undef,undef); + if ($searchtype eq 'Basic') { + $query = &parse_basic_search($r); + } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { + ($query,$customquery,$customshow,$libraries) + = &parse_advanced_search($r); + return OK if (! defined($query)); + } + # Send query statements over the network to be processed by + # either the SQL database or a recursive scheme of 'grep'-like + # actions (for custom metadata). + $r->rflush(); + my $reply=&Apache::lonnet::metadata_query($query,$customquery, + $customshow,$libraries); + &output_results($searchtype,$r,$reply,$hidden); } elsif ($ENV{'form.reqinterface'} eq 'advanced') { # Output the advanced interface $r->print(&advanced_search_form($closebutton,$hidden)); - return OK; } else { # Output normal search interface $r->print(&basic_search_form($closebutton,$hidden)); @@ -362,22 +375,13 @@ $hidden ENDHEADER - $scrout.=&searchphrasefield('title','title', - $ENV{'form.title'}); - $scrout.=&searchphrasefield('author','author', - $ENV{'form.author'}); - $scrout.=&searchphrasefield('subject','subject', - $ENV{'form.subject'}); - $scrout.=&searchphrasefield('keywords','keywords', - $ENV{'form.keywords'}); - $scrout.=&searchphrasefield('URL','url', - $ENV{'form.url'}); -# $scrout.=&searchphrasefield('Limit by version','version', -# $ENV{'form.version'}); - $scrout.=&searchphrasefield('notes','notes', - $ENV{'form.notes'}); - $scrout.=&searchphrasefield('abstract','abstract', - $ENV{'form.abstract'}); + $scrout.=&searchphrasefield('title', 'title' ,$ENV{'form.title'}); + $scrout.=&searchphrasefield('author', 'author' ,$ENV{'form.author'}); + $scrout.=&searchphrasefield('subject', 'subject' ,$ENV{'form.subject'}); + $scrout.=&searchphrasefield('keywords','keywords',$ENV{'form.keywords'}); + $scrout.=&searchphrasefield('URL', 'url' ,$ENV{'form.url'}); + $scrout.=&searchphrasefield('notes', 'notes' ,$ENV{'form.notes'}); + $scrout.=&searchphrasefield('abstract','abstract',$ENV{'form.abstract'}); # Hack - an empty table row. $scrout.="  \n"; $scrout.=&searchphrasefield('file
extension','mime', @@ -425,8 +429,6 @@ ENDHEADER $scrout.="\n"; } #---------------------------------------------------------------- - # - # $scrout.=&selectbox('Limit by language','language', $ENV{'form.language'},'any','Any Language', \&{Apache::loncommon::languagedescription}, @@ -721,16 +723,28 @@ sub selectbox { =pod -=item &advancedsearch() +=item &parse_advanced_search() + +Parse advanced search form and return the following: + +=over 4 -Parse advanced search results. +=item $query Scalar containing an SQL query. + +=item $customquery Scalar containing a custom query. + +=item $customshow Scalar containing commands to show custom metadata. + +=item $libraries_to_query Reference to array of domains to search. + +=back =cut ###################################################################### ###################################################################### -sub advancedsearch { - my ($r,$hidden)=@_; +sub parse_advanced_search { + my ($r)=@_; my $fillflag=0; # Clean up fields for safety for my $field ('title','author','subject','keywords','url','version', @@ -766,7 +780,7 @@ sub advancedsearch { } unless ($fillflag) { &output_blank_field_error($r); - return OK; + return ; } # Turn the form input into a SQL-based query my $query=''; @@ -778,6 +792,10 @@ sub advancedsearch { push @queries,&build_SQL_query($field,$ENV{'form.'.$field}); } } + # I dislike the hack below. + if ($ENV{'form.category'}) { + $ENV{'form.mime'}=''; + } # Evaluate option lists if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') { push @queries,"(language like \"$ENV{'form.language'}\")"; @@ -803,18 +821,18 @@ sub advancedsearch { # Test to see if date windows are legitimate if ($datequery=~/^Incorrect/) { &output_date_error($r,$datequery); - return OK; + return ; } elsif ($datequery) { push @queries,$datequery; } # Process form information for custom metadata querying - my $customquery=''; + my $customquery=undef; if ($ENV{'form.custommetadata'}) { $customquery=&build_custommetadata_query('custommetadata', $ENV{'form.custommetadata'}); } - my $customshow=''; + my $customshow=undef; if ($ENV{'form.customshow'}) { $customshow=$ENV{'form.customshow'}; $customshow=~s/[^\w\s]//g; @@ -842,36 +860,14 @@ sub advancedsearch { push @$libraries_to_query,$_; } } - ## --------------------------------------------------------------- # - # Send query statements over the network to be processed by either the SQL - # database or a recursive scheme of 'grep'-like actions (for custom - # metadata). if (@queries) { $query=join(" AND ",@queries); $query="select * from metadata where $query"; - my $reply; # reply hash reference - unless ($customquery or $customshow) { - $reply=&Apache::lonnet::metadata_query($query,undef,undef, - $libraries_to_query); - } - else { - $reply=&Apache::lonnet::metadata_query($query, - $customquery,$customshow, - $libraries_to_query); - } - &output_results('Advanced',$r,$customquery,$reply,$hidden); - return OK; } elsif ($customquery) { - my $reply; # reply hash reference - $reply=&Apache::lonnet::metadata_query('', - $customquery,$customshow, - $libraries_to_query); - &output_results('Advanced',$r,$customquery,$reply,$hidden); - return OK; + $query = ''; } - # should not get to this point - return 'Error. Should not have gone to this point.'; + return ($query,$customquery,$customshow,$libraries_to_query); } ###################################################################### @@ -879,16 +875,16 @@ sub advancedsearch { =pod -=item &basicsearch() +=item &parse_basic_search() -Parse basic search form. +Parse the basic search form and return a scalar containing an sql query. =cut ###################################################################### ###################################################################### -sub basicsearch { - my ($r,$hidden)=@_; +sub parse_basic_search { + my ($r)=@_; # Clean up fields for safety for my $field ('basicexp') { $ENV{"form.$field"}=~s/[^\w\s\(\)\-]//g; @@ -914,16 +910,7 @@ sub basicsearch { $concatarg='title' if $ENV{'form.titleonly'}; $query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'}); - - # Get reply (either a hash reference to filehandles or bad connection) -# &Apache::lonnet::logthis("metadata query started:".time); - my $reply=&Apache::lonnet::metadata_query('select * from metadata where '.$query); -# &Apache::lonnet::logthis("metadata query finished:".time); - # Output search results - - &output_results('Basic',$r,$query,$reply,$hidden); - - return OK; + return 'select * from metadata where '.$query; } @@ -1113,20 +1100,39 @@ contacted, etc.) sub output_results { # &Apache::lonnet::logthis("output_results:".time); my $fnum; # search result counter - my ($mode,$r,$query,$replyref,$hidden)=@_; + my ($mode,$r,$replyref,$hidden)=@_; my %rhash=%{$replyref}; my $compiledresult=''; my $timeremain=300; # (seconds) my $elapsetime=0; my $resultflag=0; my $tflag=1; - my $viewselect=$ENV{'form.viewselect'}; + ## + ## Set viewing function + ## + my $viewfunction = undef; + if ($ENV{'form.viewselect'} eq 'Detailed Citation View') { + $viewfunction = \&detailed_citation_view; + } elsif ($ENV{'form.viewselect'} eq 'Summary View') { + $viewfunction = \&summary_view; + } elsif ($ENV{'form.viewselect'} eq 'Fielded Format') { + $viewfunction = \&fielded_format_view; + } elsif ($ENV{'form.viewselect'} eq 'XML/SGML') { + $viewfunction = \&xml_sgml_view; + } + if (!defined($viewfunction)) { + $r->print("Internal Error - Bad view selected.\n"); + $r->rflush(); + return; + } # # make query information persistent to allow for subsequent revision my $persistent=&make_persistent(\%ENV); - # spit out the results header + # + # Begin producing output $r->print(&search_results_header($mode)); $r->rflush(); + # # begin showing the cataloged results my $action = "/adm/searchcat"; if ($mode eq 'Basic') { @@ -1147,7 +1153,6 @@ $persistent CATALOGCONTROLS # # make the pop-up window for status - # $r->print(&make_popwin(%rhash)); $r->rflush(); ## @@ -1224,7 +1229,8 @@ CATALOGCONTROLS } # end of if ($reply eq 'con_lost') else statement my %Fields = undef; # Holds the data to be sent to the various # *_view routines. - my ($extrashow,$customfields,$customhash) = &handle_custom_fields(\@results); + my ($extrashow,$customfields,$customhash) = + &handle_custom_fields(\@results); my @customfields = @$customfields; my %customhash = %$customhash; untie %hash if (keys %hash); @@ -1241,6 +1247,23 @@ CATALOGCONTROLS chomp $result; next unless $result; %Fields = &parse_raw_result($result,$rkey); + # + # Check copyright tags and skip results the user cannot use + my (undef,undef,$resdom,$resname) = split('/',$Fields{'url'}); + # Check for priv + if (($Fields{'copyright'} eq 'priv') && + (($ENV{'user.name'} ne $resname) && + ($ENV{'user.domain'} ne $resdom))) { +$r->print("
copyright = 'priv' -> Skipping $Fields{'url'}
\n"); + next; + } + # Check for domain + if (($Fields{'copyright'} eq 'domain') && + ($ENV{'user.domain'} ne $resdom)) { +$r->print("
copyright = 'domain' -> Skipping $Fields{'url'}
\n"); + next; + } + # $Fields{'extrashow'}=$extrashow; if ($extrashow) { foreach my $field (@customfields) { @@ -1275,22 +1298,8 @@ END # $fnum++; } - if ($viewselect eq 'Detailed Citation View') { - $compiledresult.=&detailed_citation_view - (%Fields, hostname => $rkey ); - } - elsif ($viewselect eq 'Summary View') { - $compiledresult.=&summary_view - (%Fields, hostname => $rkey ); - } - elsif ($viewselect eq 'Fielded Format') { - $compiledresult.=&fielded_format_view - (%Fields, hostname => $rkey ); - } - elsif ($viewselect eq 'XML/SGML') { - $compiledresult.=&xml_sgml_view - (%Fields, hostname => $rkey ); - } + # Render the result into html + $compiledresult.= &$viewfunction(%Fields, hostname => $rkey ); if ($compiledresult or $servercount!=$servernum) { $compiledresult.="
"; } @@ -1301,14 +1310,15 @@ END $resultflag=1; $r->print($compiledresult); } - my $percent=sprintf('%3.0f',($servercount/$servernum*100)); } # End of foreach loop over servers remaining } # End of big loop - while($serversleft && $timeremain) unless ($resultflag) { $r->print("\nThere were no results that matched your query\n"); } -# $r->print(''."\n"); $r->rflush(); + $r->print(''. + "\n"); $r->print("\n\n"); + $r->rflush(); return; } @@ -1372,6 +1382,9 @@ sub parse_raw_result { &Apache::loncommon::copyrightdescription($Fields{'copyright'}); $Fields{'mimetag'} = &Apache::loncommon::filedescription($Fields{'mime'}); + if ($Fields{'author'}=~/^(\s*|error)$/) { + $Fields{'author'}="Unknown Author"; + } # Put spaces in the keyword list, if needed. $Fields{'keywords'}=~ s/,([A-z])/, $1/g; if ($Fields{'title'}=~ /^\s*$/ ) { @@ -1603,16 +1616,13 @@ sub make_popwin { # rows of 10 each. No longer used to index images. my $sn=1; foreach my $sk (sort keys %rhash) { - # '