--- loncom/interface/lonsearchcat.pm 2001/03/27 19:32:28 1.85
+++ 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=<
@@ -501,6 +529,8 @@ sub advancedsearch {
'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') {
@@ -508,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'},
@@ -548,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;
@@ -555,6 +588,8 @@ sub advancedsearch {
elsif ($datequery) {
push @queries,$datequery;
}
+
+ # Process form information for custom metadata querying
my $customquery='';
if ($ENV{'form.custommetadata'}) {
$customquery=&build_custommetadata_query('custommetadata',
@@ -567,10 +602,13 @@ sub advancedsearch {
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='';
+ my $reply; # reply hash reference
unless ($customquery or $customshow) {
$reply=&Apache::lonnet::metadata_query($query);
}
@@ -580,17 +618,20 @@ sub advancedsearch {
}
&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);
}
- $r->print(' '); # just in case.. hrrmm..
- 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 {
@@ -608,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;
}
@@ -659,47 +709,163 @@ 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) {
+ # make query information persistent to allow for subsequent revision
+ my $persistent=&make_persistent();
- my @results;
+ # output beginning of search page
+ $r->print(<Search Catalog
+CATALOGBEGIN
+ $r->print(<
+Search Query
+RESULTS
+ if ($mode eq 'Basic') {
+ $r->print(<