--- loncom/interface/lonsearchcat.pm 2001/03/22 14:03:55 1.70
+++ loncom/interface/lonsearchcat.pm 2001/08/16 02:20:01 1.97
@@ -1,9 +1,11 @@
# The LearningOnline Network
# Search Catalog
#
+# YEAR=2001
# 03/08/2001 Scott Harrison
# Scott Harrison: 03/12/2001, 03/13/2001, 03/14/2001, 03/15/2001, 03/19/2001
-# Scott Harrison: 03/20/2001
+# Scott Harrison: 03/20/2001, 03/21/2001, 03/22/2001, 03/26/2001, 03/27/2001
+# Scott Harrison: 04/02/2001, 08/15/2001
#
# Functions
#
@@ -36,6 +38,21 @@
# recursive_SQL_query_build(field name, reverse notation expression) :
# builds a SQL query string from a reverse notation expression
# logical expression with AND/OR keywords
+# build_custommetadata_query(field_name, logic_statement) : builds a perl
+# regular expression from a logical expression with AND/OR
+# keywords
+# detailed_citation_view, summary_view, fielded_format_view, xml_sgml_view:
+# four different ways to view metadata records. Outputs a HTML-ified string.
+# Input arguments are title, author, subject, url, keywords, version, notes,
+# short abstract, mime, language, creation date, last revision date, owner,
+# copyright, hostname, httphost, and extra custom metadata to show.
+# build_date_queries(cmonth1, cday1, cyear1, cmonth2, cday2, cyear2,
+# lmonth1, lday1, lyear1, lmonth2, lday2, lyear2) :
+# Builds a SQL logic query to check time/date entries.
+# output_date_error(server reference, error message) : outputs
+# an error message specific to bad date format.
+# make_persistent() : makes a set of hidden HTML fields to make
+# SQL search interface information to be persistent
package Apache::lonsearchcat;
@@ -46,12 +63,19 @@ use Apache::File();
use CGI qw(:standard);
use Text::Query;
+# ---------------------------------------- variables used throughout the module
my %language;
my $scrout;
my %metadatafields;
my %cprtag;
my %mimetag;
my $closebutton;
+
+# ------ form selection elements that allow for choosing different output views
+# Detailed Citation View ---> sub detailed_citationview
+# Summary View ---> sub summary_view
+# Fielded Format ---> sub fielded_format_view
+# XML/SGML ---> sub xml_sgml_view
my $basicviewselect=<
Example: grandmother=75 OR grandfather=85
@@ -239,6 +267,17 @@ CUSTOMMETADATA
$scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'});
$scrout.=' initial users of this system do not need to worry about this option';
+ $scrout.=<
+CUSTOMSHOW
+$scrout.=&simpletextfield('customshow',$ENV{'form.customshow'});
+$scrout.=' initial users of this system do not need to worry about this option';
+
# ---------------------------------------------------------------- Print screen
$r->print(<
@@ -487,9 +526,11 @@ sub advancedsearch {
'lastrevisiondatestart_year','lastrevisiondateend_month',
'lastrevisiondateend_day','lastrevisiondateend_year',
'notes','abstract','mime','language','owner',
- 'custommetadata') {
+ 'custommetadata','customshow') {
$ENV{"form.$field"}=~s/[^\w\s\(\)\=\-\"\']//g;
}
+
+ # Check to see if enough information was filled in
for my $field ('title','author','subject','keywords','url','version',
'notes','abstract','mime','language','owner',
'custommetadata') {
@@ -497,32 +538,34 @@ sub advancedsearch {
$fillflag++;
}
}
-
unless ($fillflag) {
&output_blank_field_error($r);
return OK;
}
+
+ # Turn the form input into a SQL-based query
my $query='';
my @queries;
- # Go through logical expression AND/OR/NOT phrase fields.
-
+ # Evaluate logical expression AND/OR/NOT phrase fields.
foreach my $field ('title','author','subject','notes','abstract','url',
'keywords','version','owner') {
if ($ENV{'form.'.$field}) {
push @queries,&build_SQL_query($field,$ENV{'form.'.$field});
}
}
+ # Evaluate option lists
if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {
- push @queries,"(language like \"\%$ENV{'form.language'}\%\")";
+ push @queries,"(language like \"$ENV{'form.language'}\")";
}
if ($ENV{'form.mime'} and $ENV{'form.mime'} ne 'any') {
- push @queries,"(mime like \"\%$ENV{'form.mime'}\%\")";
+ push @queries,"(mime like \"$ENV{'form.mime'}\")";
}
if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') {
- push @queries,"(copyright like \"\%$ENV{'form.copyright'}\%\")";
+ push @queries,"(copyright like \"$ENV{'form.copyright'}\")";
}
+ # Evaluate date windows
my $datequery=&build_date_queries(
$ENV{'form.creationdatestart_month'},
$ENV{'form.creationdatestart_day'},
@@ -537,6 +580,7 @@ sub advancedsearch {
$ENV{'form.lastrevisiondateend_day'},
$ENV{'form.lastrevisiondateend_year'},
);
+ # Test to see if date windows are legitimate
if ($datequery=~/^Incorrect/) {
&output_date_error($r,$datequery);
return OK;
@@ -544,27 +588,50 @@ sub advancedsearch {
elsif ($datequery) {
push @queries,$datequery;
}
- my $customquery;
+
+ # Process form information for custom metadata querying
+ my $customquery='';
if ($ENV{'form.custommetadata'}) {
$customquery=&build_custommetadata_query('custommetadata',
$ENV{'form.custommetadata'});
}
+ my $customshow='';
+ if ($ENV{'form.customshow'}) {
+ $customshow=$ENV{'form.customshow'};
+ $customshow=~s/[^\w\s]//g;
+ my @fields=split(/\s+/,$customshow);
+ $customshow=join(" ",@fields);
+ }
+ # 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=&Apache::lonnet::metadata_query($query);
+ my $reply; # reply hash reference
+ unless ($customquery or $customshow) {
+ $reply=&Apache::lonnet::metadata_query($query);
+ }
+ else {
+ $reply=&Apache::lonnet::metadata_query($query,
+ $customquery,$customshow);
+ }
&output_results('Advanced',$r,$envhash,$customquery,$reply);
}
- else {
- &output_results('Advanced',$r,$envhash,$query);
+ elsif ($customquery) {
+ my $reply; # reply hash reference
+ $reply=&Apache::lonnet::metadata_query('',
+ $customquery,$customshow);
+ &output_results('Advanced',$r,$envhash,$customquery,$reply);
}
- return OK;
+ # should not get to this point
+ return 'Error. Should not have gone to this point.';
}
# ---------------------------------------------------- see if a field is filled
sub filled {
my ($field)=@_;
- if ($field=~/\S/) {
+ if ($field=~/\S/ && $field ne 'any') {
return 1;
}
else {
@@ -582,18 +649,27 @@ sub basicsearch {
$ENV{"form.$field"}=~s/[^\w\s\(\)\-]//g;
}
+ # Check to see if enough is filled in
unless (&filled($ENV{'form.basicexp'})) {
&output_blank_field_error($r);
return OK;
}
+ # Build SQL query string based on form page
my $query='';
my $concatarg=join('," ",',
('title', 'author', 'subject', 'notes', 'abstract'));
+ $concatarg='title' if $ENV{'form.titleonly'};
+
+ $query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'});
- $query="select * from metadata where concat($concatarg) like '\%$ENV{'form.basicexp'}\%'";
- my $reply=&Apache::lonnet::metadata_query($query);
+
+ # Get reply (either a hash reference to filehandles or bad connection)
+ my $reply=&Apache::lonnet::metadata_query('select * from metadata where '.$query);
+
+ # Output search results
&output_results('Basic',$r,$envhash,$query,$reply);
+
return OK;
}
@@ -633,85 +709,18 @@ RESULTS
# ----------------------------- format and output results based on a reply list
sub output_results {
- my ($mode,$r,$envhash,$query,@replylist)=@_;
+ my ($mode,$r,$envhash,$query,$replyref)=@_;
my %ENV=%{$envhash};
+ my %rhash=%{$replyref};
my $compiledresult='';
+ my $timeremain=30;
+ my $resultflag=0;
+ my $tflag=1;
- foreach my $reply (@replylist) {
-
- my @results;
-
- my $replyfile='';
- $reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting
- $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1;
- $reply=~/(.*?)\_/;
- my $hostname=$1;
- sleep 3; # temporary fix, need to check for completion and status
- {
- while (1) {
- last if -e $replyfile;
- sleep 1;
- }
- # QUESTION: how should I handle this error condition..
- # I'm sure there is syntax elsewhere I can use..
- my $fh=Apache::File->new($replyfile) or
- ($r->print('file cannot be opened') and return OK);
- @results=<$fh>;
- }
-
- foreach my $result (@results) {
- my @fields=map
- {&Apache::lonnet::unescape($_)}
- (split(/\,/,$result));
- my ($title,$author,$subject,$url,$keywords,$version,
- $notes,$abstract,$mime,$lang,
- $creationdate,$lastrevisiondate,$owner,$copyright)=@fields;
- my $shortabstract=$abstract;
- $shortabstract=substr($abstract,0,200) if length($abstract)>200;
- $fields[7]=$shortabstract;
- $compiledresult.=<
-END
- my $httphost=$ENV{'HTTP_HOST'};
-
- my $viewselect;
- if ($mode eq 'Basic') {
- $viewselect=$ENV{'form.basicviewselect'};
- }
- elsif ($mode eq 'Advanced') {
- $viewselect=$ENV{'form.advancedviewselect'};
- }
-
- if ($viewselect eq 'Detailed Citation View') {
- $compiledresult.=&detailed_citation_view(@fields,
- $hostname,$httphost);
- }
- elsif ($viewselect eq 'Summary View') {
- $compiledresult.=&summary_view(@fields,$hostname,$httphost);
- }
- elsif ($viewselect eq 'Fielded Format') {
- $compiledresult.=&fielded_format_view(@fields,$hostname,
- $httphost);
- }
- elsif ($viewselect eq 'XML/SGML') {
- $compiledresult.=&xml_sgml_view(@fields,$hostname,$httphost);
- }
-
- }
-
- unless ($compiledresult) {
- $compiledresult="There were no results that matched your query";
- }
-
- # make query information persistent to allow for subsequent revision
- my $persistent=&make_persistent();
+ # make query information persistent to allow for subsequent revision
+ my $persistent=&make_persistent();
+ # output beginning of search page
$r->print(<Search Catalog
+CATALOGBEGIN
+ $r->print(<
$shortabstract
END @@ -855,12 +1049,13 @@ sub summary_view { my ($title,$author,$subject,$url,$keywords,$version, $notes,$shortabstract,$mime,$lang, $creationdate,$lastrevisiondate,$owner,$copyright, - $hostname,$httphost)=@_; + $hostname,$httphost,$extrashow)=@_; my $result=<