--- loncom/interface/lonsearchcat.pm 2001/03/15 18:23:54 1.17 +++ loncom/interface/lonsearchcat.pm 2001/03/20 17:49:03 1.44 @@ -2,7 +2,41 @@ # Search Catalog # # 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 # +# Functions +# +# handler(server reference) : interacts with the Apache server layer +# (for /adm/searchcat URLs) +# simpletextfield(name,value) : returns HTML formatted string for simple text +# field +# simplecheckbox(name,value) : returns HTML formatted string for simple +# checkbox +# searchphrasefield(title,name,value) : returns HTML formatted string for +# a search expression phrase field +# dateboxes(name, defaultmonth, defaultday, defaultyear) : returns HTML +# formatted string +# for a calendar date +# selectbox(title,name,value,%HASH=options) : returns HTML formatted string for +# a selection box field +# advancedsearch(server reference, environment reference) : perform a complex +# multi-field logical query +# filled(field) : determines whether a given field has been filled +# basicsearch(server reference, environment reference) : perform a simple +# single-field logical query +# output_blank_field_error(server reference) : outputs a message saying that +# more fields need to be filled in +# output_results(output mode, +# server reference, +# environment reference, +# reply list reference) : outputs results from search +# build_SQL_query(field name, logic) : builds a SQL query string from a +# logical expression with AND/OR keywords +# 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 + package Apache::lonsearchcat; use strict; @@ -10,6 +44,7 @@ use Apache::Constants qw(:common); use Apache::lonnet(); use Apache::File(); use CGI qw(:standard); +use Text::Query; my %language; my $scrout; @@ -77,7 +112,10 @@ END } if ($ENV{'form.basicsubmit'} eq 'SEARCH') { - return &basicsearch($r,$ENV{'form.basicexp'}); + return &basicsearch($r,\%ENV); + } + elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { + return &advancedsearch($r,\%ENV); } $scrout=''; # building a part of screen output @@ -229,12 +267,6 @@ ENDDOCUMENT # --------------------------------------------------------- Various form fields -sub textfield { - my ($title,$name,$value)=@_; - return "\n
$title:
".
- '';
-}
-
sub simpletextfield {
my ($name,$value)=@_;
return '';
@@ -416,55 +448,168 @@ sub selectbox {
return $selout.'';
}
-# --------------------------------------------------- Performing a basic search
-sub basicsearch {
- my ($r,$expression)=@_;
+# ------------------------------------------------ Performing a advanced search
+sub advancedsearch {
+ my ($r,$envhash)=@_;
+ my %ENV=%{$envhash};
+
+ my $fillflag=0;
+ for my $field ('title','author','subject','keywords','url','version',
+ 'notes','abstract','mime','language','owner',
+ 'custommetadata') {
+ if (&filled($ENV{"form.$field"})) {
+ $fillflag++;
+ }
+ }
+
+ unless ($fillflag) {
+ &output_blank_field_error($r);
+ return OK;
+ }
+
+ my $query='';
+
+ my $testquery='';
+ # Go through logical expression AND/OR/NOT phrase fields.
+ foreach my $field ('title','author','subject','notes','abstract') {
+ if ($ENV{'form.'.$field}) {
+ $testquery=build_SQL_query($field,$ENV{'form.'.$field});
+ }
+ }
+
+# my $concatarg=join('," ",',
+# ('title', 'author', 'subject', 'notes', 'abstract'));
+
+ $query="select * from metadata where $testquery";
- my $query=$expression;
- $query="select * from metadata where concat(title,\" \",author) like '\%$expression\%'";
-# my $reply=&Apache::lonnet::reply("querysend:$query",'msul3');
my $reply=&Apache::lonnet::metadata_query($query);
- my @results;
+ &output_results('Advanced',$r,$envhash,$query,$reply);
+ return OK;
+}
- my $replyfile='';
- $reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting
- $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1;
- $reply=~/(.*?)\_/;
- my $hostname=$1;
+# ---------------------------------------------------- see if a field is filled
+sub filled {
+ my ($field)=@_;
+ if ($field=~/\S/) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
- {
- 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>;
+# --------------------------------------------------- Performing a basic search
+sub basicsearch {
+ my ($r,$envhash)=@_;
+ my %ENV=%{$envhash};
+
+ unless (&filled($ENV{'form.basicexp'})) {
+ &output_blank_field_error($r);
+ return OK;
}
+ my $query='';
+ my $concatarg=join('," ",',
+ ('title', 'author', 'subject', 'notes', 'abstract'));
+
+ $query="select * from metadata where concat($concatarg) like '\%$ENV{'form.basicexp'}\%'";
+ my $reply=&Apache::lonnet::metadata_query($query);
+ &output_results('Basic',$r,$envhash,$query,$reply);
+ return OK;
+}
+
+# ---------------- Message to output when there are not enough fields filled in
+sub output_blank_field_error {
+ my ($r)=@_;
+ # make query information persistent to allow for subsequent revision
+ my $persistent='';
+ map {
+ if (/^form\./ && !/submit/) {
+ my $name=$_;
+ my $key=$name;
+ $name=~s/^form\.//;
+ $persistent.=<Search Catalog
+