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