--- loncom/interface/lonsearchcat.pm 2001/03/20 12:21:56 1.43 +++ loncom/interface/lonsearchcat.pm 2001/03/20 17:49:03 1.44 @@ -468,13 +468,23 @@ sub advancedsearch { } 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 concat(title) like '\%$ENV{'form.title'}\%'"; + $query="select * from metadata where $testquery"; + my $reply=&Apache::lonnet::metadata_query($query); - &output_results('Advanced',$r,$envhash,$reply); + &output_results('Advanced',$r,$envhash,$query,$reply); return OK; } @@ -505,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('Basic',$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 @@ -555,8 +566,10 @@ RESULTS # ----------------------------- format and output results based on a reply list sub output_results { - my ($mode,$r,$envhash,@replylist)=@_; + my ($mode,$r,$envhash,$query,@replylist)=@_; my %ENV=%{$envhash}; + my $compiledresult=''; + foreach my $reply (@replylist) { my @results; @@ -579,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, @@ -677,13 +688,16 @@ RESULTS Basic search: $ENV{'form.basicexp'}

RESULTS + } elsif ($mode eq 'Advanced') { $r->print(< Advanced search +$query

RESULTS } + $r->print(<Search Results $compiledresult @@ -698,9 +712,10 @@ sub build_SQL_query { my $q=new Text::Query('abc', -parse => 'Text::Query::ParseAdvanced', -build => 'Text::Query::Build'); - $q->prepare($statement); + $q->prepare($logic_statement); my $matchexp=${$q}{'matchexp'}; chomp $matchexp; my $sql_query=&recursive_SQL_query_build($field_name,$matchexp); + return $sql_query; } # - Recursively parse a reverse notation expression into a SQL query expression @@ -710,7 +725,7 @@ sub recursive_SQL_query_build { return $pattern unless @matches; foreach my $match (@matches) { $match=~/\[ (\w+)\s(.*) \]/; - ($key,$value)=($1,$2); + my ($key,$value)=($1,$2); my $replacement=''; if ($key eq 'literal') { $replacement="($dkey like \"\%$value\%\")";