--- loncom/interface/lonsearchcat.pm 2001/03/27 21:41:06 1.89 +++ loncom/interface/lonsearchcat.pm 2001/04/02 13:13:17 1.90 @@ -36,6 +36,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 +61,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=< @@ -69,6 +91,7 @@ my $advancedviewselect=< END +# ----------------------------- Handling routine called via Apache and mod_perl sub handler { my $r = shift; @@ -89,13 +112,14 @@ sub handler { %metadatafields=(); my $hidden=''; - $hidden=< END - - $closebutton=< END + } # ------------------------------------------------ First, check out environment $metadatafields{'owner'}=$ENV{'user.name'}.'@'.$ENV{'user.domain'}; @@ -132,6 +156,7 @@ END } <$fh>; } +# ----------------------------------- See if a search invocation should be done if ($ENV{'form.basicsubmit'} eq 'SEARCH') { return &basicsearch($r,\%ENV); } @@ -139,6 +164,7 @@ END return &advancedsearch($r,\%ENV); } +# ----------------------------- Else, begin building search interface to output $scrout=''; # building a part of screen output $scrout.=&searchphrasefield('Limit by title','title', $ENV{'form.title'}); @@ -501,6 +527,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 +536,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 +578,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 +586,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 +600,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); } @@ -581,7 +617,7 @@ sub advancedsearch { &output_results('Advanced',$r,$envhash,$customquery,$reply); } elsif ($customquery) { - my $reply=''; + my $reply; # reply hash reference $reply=&Apache::lonnet::metadata_query('', $customquery,$customshow); &output_results('Advanced',$r,$envhash,$customquery,$reply); @@ -611,18 +647,25 @@ 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')); + $query='select * from metadata where concat(' . $concatarg . ') like %' . + $ENV{'form.basicexp'} . '%'; - $query="select * from metadata where concat($concatarg) like '\%$ENV{'form.basicexp'}\%'"; + # Get reply (either a hash reference to filehandles or bad connection) my $reply=&Apache::lonnet::metadata_query($query); + + # Output search results &output_results('Basic',$r,$envhash,$query,$reply); + return OK; } @@ -742,7 +785,7 @@ END $compiledresult.=< END - $compiledresult.=<