--- loncom/interface/lonsearchcat.pm 2001/03/20 11:45:21 1.42 +++ loncom/interface/lonsearchcat.pm 2001/03/21 00:32:33 1.45 @@ -31,8 +31,11 @@ # server reference, # environment reference, # reply list reference) : outputs results from search -# build_SQL_query() : builds a SQL query string from a logical expression -# with AND/OR keywords +# 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; @@ -445,7 +448,7 @@ sub selectbox { return $selout.''; } -# ------------------------------------------------ Performing a advanced search +# ----------------------------------------------- Performing an advanced search sub advancedsearch { my ($r,$envhash)=@_; my %ENV=%{$envhash}; @@ -465,13 +468,23 @@ sub advancedsearch { } my $query=''; -# my $concatarg=join('," ",', -# ('title', 'author', 'subject', 'notes', 'abstract')); - $query="select * from metadata where concat(title) like '\%$ENV{'form.title'}\%'"; - my $reply=&Apache::lonnet::metadata_query($query); - - &output_results($r,$envhash,$reply); + my @queries; + # Go through logical expression AND/OR/NOT phrase fields. + foreach my $field ('title','author','subject','notes','abstract') { + if ($ENV{'form.'.$field}) { + push @queries,&build_SQL_query($field,$ENV{'form.'.$field}); + } + } + if (@queries) { + $query="(" . (join(") and ("),@queries) . ")"; + $query="select * from metadata where $testquery"; + my $reply=&Apache::lonnet::metadata_query($query); + &output_results('Advanced',$r,$envhash,$query,$reply); + } + else { + &output_results('Advanced',$r,$envhash,$query); + } return OK; } @@ -502,10 +515,11 @@ sub basicsearch { $query="select * from metadata where concat($concatarg) like '\%$ENV{'form.basicexp'}\%'"; my $reply=&Apache::lonnet::metadata_query($query); - &output_results($r,$envhash,$reply); + &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 @@ -552,8 +566,10 @@ RESULTS # ----------------------------- format and output results based on a reply list sub output_results { - my ($r,$envhash,@replylist)=@_; + my ($mode,$r,$envhash,$query,@replylist)=@_; my %ENV=%{$envhash}; + my $compiledresult=''; + foreach my $reply (@replylist) { my @results; @@ -576,8 +592,6 @@ sub output_results { @results=<$fh>; } - my $compiledresult=''; - foreach my $result (@results) { my ($title,$author,$subject,$url,$keywords,$version, $notes,$abstract,$mime,$lang, @@ -667,9 +681,23 @@ onClick='self.close();'> $persistent