--- loncom/interface/lonsearchcat.pm 2001/03/20 11:45:21 1.42 +++ loncom/interface/lonsearchcat.pm 2001/03/20 12:21:56 1.43 @@ -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; @@ -471,7 +474,7 @@ sub advancedsearch { $query="select * from metadata where concat(title) like '\%$ENV{'form.title'}\%'"; my $reply=&Apache::lonnet::metadata_query($query); - &output_results($r,$envhash,$reply); + &output_results('Advanced',$r,$envhash,$reply); return OK; } @@ -502,7 +505,7 @@ 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,$reply); return OK; } @@ -552,7 +555,7 @@ RESULTS # ----------------------------- format and output results based on a reply list sub output_results { - my ($r,$envhash,@replylist)=@_; + my ($mode,$r,$envhash,@replylist)=@_; my %ENV=%{$envhash}; foreach my $reply (@replylist) { @@ -667,9 +670,20 @@ onClick='self.close();'> $persistent

Search Query

+RESULTS + if ($mode eq 'Basic') { + $r->print(< Basic search: $ENV{'form.basicexp'}

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

+RESULTS + }

Search Results

$compiledresult @@ -680,7 +694,42 @@ RESULTS # ------------------------------------------------------------- build_SQL_query sub build_SQL_query { - + my ($field_name,$logic_statement)=@_; + my $q=new Text::Query('abc', + -parse => 'Text::Query::ParseAdvanced', + -build => 'Text::Query::Build'); + $q->prepare($statement); + my $matchexp=${$q}{'matchexp'}; chomp $matchexp; + my $sql_query=&recursive_SQL_query_build($field_name,$matchexp); +} + +# - Recursively parse a reverse notation expression into a SQL query expression +sub recursive_SQL_query_build { + my ($dkey,$pattern)=@_; + my @matches=($pattern=~/(\[[^\]|\[]*\])/g); + return $pattern unless @matches; + foreach my $match (@matches) { + $match=~/\[ (\w+)\s(.*) \]/; + ($key,$value)=($1,$2); + my $replacement=''; + if ($key eq 'literal') { + $replacement="($dkey like \"\%$value\%\")"; + } + elsif ($key eq 'and') { + $value=~/(.*[\"|\)]) ([|\(|\^].*)/; + $replacement="($1 AND $2)"; + } + elsif ($key eq 'or') { + $value=~/(.*[\"|\)]) ([|\(|\^].*)/; + $replacement="($1 OR $2)"; + } + substr($pattern, + index($pattern,$match), + length($match), + $replacement + ); + } + &recursive_SQL_query_build($dkey,$pattern); } 1;