--- loncom/interface/lonsearchcat.pm 2001/03/20 12:21:56 1.43 +++ loncom/interface/lonsearchcat.pm 2001/03/21 01:19:37 1.49 @@ -51,6 +51,13 @@ my $scrout; my %metadatafields; my %cprtag; my %mimetag; +my $closebutton; +my $viewselect=< + + + +END sub handler { my $r = shift; @@ -76,6 +83,10 @@ sub handler { END + $closebutton=< +END + # ------------------------------------------------ First, check out environment $metadatafields{'owner'}=$ENV{'user.name'}.'@'.$ENV{'user.domain'}; @@ -248,7 +259,8 @@ ENDDOCUMENT
- +$closebutton +$viewselect


Advanced Search

@@ -256,7 +268,8 @@ $scrout

- +$closebutton +$viewselect

@@ -448,7 +461,7 @@ sub selectbox { return $selout.''; } -# ------------------------------------------------ Performing a advanced search +# ----------------------------------------------- Performing an advanced search sub advancedsearch { my ($r,$envhash)=@_; my %ENV=%{$envhash}; @@ -468,13 +481,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('Advanced',$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 $query"; + my $reply=&Apache::lonnet::metadata_query($query); + &output_results('Advanced',$r,$envhash,$query,$reply); + } + else { + &output_results('Advanced',$r,$envhash,$query); + } return OK; } @@ -505,10 +528,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 @@ -538,8 +562,7 @@ BEGINNING $persistent - +$closebutton

Helpful Message

@@ -555,8 +578,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 +604,6 @@ sub output_results { @results=<$fh>; } - my $compiledresult=''; - foreach my $result (@results) { my ($title,$author,$subject,$url,$keywords,$version, $notes,$abstract,$mime,$lang, @@ -665,8 +688,7 @@ SCRIPT

- +$closebutton $persistent

Search Query

@@ -677,13 +699,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 +723,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 +736,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\%\")";