Diff for /loncom/interface/lonsearchcat.pm between versions 1.142 and 1.143

version 1.142, 2002/07/12 21:02:27 version 1.143, 2002/07/16 15:02:06
Line 125  that produces it.  Adding a new view typ Line 125  that produces it.  Adding a new view typ
 adding a line to the definition of this hash and making sure the function  adding a line to the definition of this hash and making sure the function
 takes the proper parameters.  takes the proper parameters.
   
   =item $results_db
   
   The name of the database results from searches are put in.
   
 =back   =back 
   
 =cut  =cut
Line 140  my $importbutton; # button to take the s Line 144  my $importbutton; # button to take the s
 my %groupsearch_db;     # database hash  my %groupsearch_db;     # database hash
 my $diropendb = "";    # db file  my $diropendb = "";    # db file
   
   my $results_db = "";
 #             View Description           Function Pointer  #             View Description           Function Pointer
 my %Views = ("Detailed Citation View" => \&detailed_citation_view,  my %Views = ("Detailed Citation View" => \&detailed_citation_view,
              "Summary View"           => \&summary_view,               "Summary View"           => \&summary_view,
Line 178  sub handler { Line 183  sub handler {
     $r->content_type('text/html');      $r->content_type('text/html');
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
       ##
       ## Initialize global variables
       ##
     my $domain  = $r->dir_config('lonDefDomain');      my $domain  = $r->dir_config('lonDefDomain');
     $diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain).      $diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain).
             "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db";              "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db";
       $results_db = "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain).
           '_'.&Apache::lonnet::escape($ENV{'user.name'})."_searchresults.db";
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
              ['catalogmode','launch','acts','mode','form','element',               ['catalogmode','launch','acts','mode','form','element',
               'reqinterface']);                'reqinterface']);
     ##      ##
     ## Clear out old values from database      ## Clear out old values from groupsearch database
     ##      ##
     if ($ENV{'form.launch'} eq '1') {      if ($ENV{'form.launch'} eq '1') {
  if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {   if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
Line 239  END Line 247  END
         # We are running a search          # We are running a search
         my ($query,$customquery,$customshow,$libraries) =           my ($query,$customquery,$customshow,$libraries) = 
             (undef,undef,undef,undef);              (undef,undef,undef,undef);
           my $pretty_string;
         if ($searchtype eq 'Basic') {          if ($searchtype eq 'Basic') {
             $query = &parse_basic_search($r);              ($query,$pretty_string) = &parse_basic_search($r);
         } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {          } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {
             ($query,$customquery,$customshow,$libraries)               ($query,$customquery,$customshow,$libraries,$pretty_string) 
                 = &parse_advanced_search($r);                  = &parse_advanced_search($r);
             return OK if (! defined($query));              return OK if (! defined($query));
         }          }
         # Output some information to the user.          # Output some information to the user.
         $r->print(&search_results_header($searchtype));          $r->print(&search_results_header($searchtype,$pretty_string));
         $r->print("Sending search request to LON-CAPA servers.<br />\n");          $r->print("Sending search request to LON-CAPA servers.<br />\n");
         $r->rflush();          $r->rflush();
         # Send query statements over the network to be processed by           # Send query statements over the network to be processed by 
Line 561  to be somewhat persistent. Line 570  to be somewhat persistent.
 sub make_persistent {  sub make_persistent {
     my %save = %{shift()};      my %save = %{shift()};
     my $persistent='';      my $persistent='';
     foreach (keys %save) {      foreach my $name (keys %save) {
  if (/^form\./ && !/submit/) {   if ($name =~ /^form\./ && $name !~ /submit/) {
     my $name=$_;  
             my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));              my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
     $name=~s/^form\.//;      $name=~s/^form\.//;
             foreach (@values) {              foreach (@values) {
                 s/\"/\'/g; # do not mess with html field syntax                  s/\"/\'/g; # do not mess with html field syntax
                   next if (! $_ );
                 $persistent.=<<END;                  $persistent.=<<END;
 <input type="hidden" name="$name" value="$_" />  <input type="hidden" name="$name" value="$_" />
 END  END
Line 886  Parse advanced search form and return th Line 895  Parse advanced search form and return th
 sub parse_advanced_search {  sub parse_advanced_search {
     my ($r)=@_;      my ($r)=@_;
     my $fillflag=0;      my $fillflag=0;
       my $pretty_search_string = "<br />\n";
     # Clean up fields for safety      # Clean up fields for safety
     for my $field ('title','author','subject','keywords','url','version',      for my $field ('title','author','subject','keywords','url','version',
    'creationdatestart_month','creationdatestart_day',     'creationdatestart_month','creationdatestart_day',
Line 925  sub parse_advanced_search { Line 935  sub parse_advanced_search {
     # Turn the form input into a SQL-based query      # Turn the form input into a SQL-based query
     my $query='';      my $query='';
     my @queries;      my @queries;
       my $font = '<font color="#800000" face="helvetica">';
     # Evaluate logical expression AND/OR/NOT phrase fields.      # Evaluate logical expression AND/OR/NOT phrase fields.
     foreach my $field ('title','author','subject','notes','abstract','url',      foreach my $field ('title','author','subject','notes','abstract','url',
        'keywords','version','owner','mime') {         'keywords','version','owner','mime') {
  if ($ENV{'form.'.$field}) {   if ($ENV{'form.'.$field}) {
             my $searchphrase = $ENV{'form.'.$field};              my $searchphrase = $ENV{'form.'.$field};
               $pretty_search_string .= $font."$field</font> contains <b>".
                   $searchphrase."</b>";
             if ($ENV{'form.'.$field.'_related'}) {              if ($ENV{'form.'.$field.'_related'}) {
                 $searchphrase = &related_version($searchphrase);                  my @New_Words;
                 $ENV{'form.'.$field} = $searchphrase;                  ($searchphrase,@New_Words) = &related_version($searchphrase);
                 $ENV{'form.'.$field.'_related'} = undef;                  if (@New_Words) {
                       $pretty_search_string .= " with related words: ".
                           "<b>@New_Words</b>.";
                   } else {
                       $pretty_search_string .= " with no related words.";
                   }
             }              }
               $pretty_search_string .= "<br />\n";
     push @queries,&build_SQL_query($field,$searchphrase);      push @queries,&build_SQL_query($field,$searchphrase);
         }          }
     }      }
Line 945  sub parse_advanced_search { Line 964  sub parse_advanced_search {
     # Evaluate option lists      # Evaluate option lists
     if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {      if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {
  push @queries,"(language like \"$ENV{'form.language'}\")";   push @queries,"(language like \"$ENV{'form.language'}\")";
           $pretty_search_string.=$font."language</font>= ".
               &Apache::loncommon::languagedescription($ENV{'form.language'}).
                   "<br />\n";
     }      }
     if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') {      if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') {
  push @queries,"(copyright like \"$ENV{'form.copyright'}\")";   push @queries,"(copyright like \"$ENV{'form.copyright'}\")";
           $pretty_search_string.=$font."copyright</font> = ".
               &Apache::loncommon::copyrightdescription($ENV{'form.copyright'}).
                   "<br \>\n";
     }      }
       #
     # Evaluate date windows      # Evaluate date windows
     my $datequery=&build_date_queries(      my $datequery=&build_date_queries(
  $ENV{'form.creationdatestart_month'},   $ENV{'form.creationdatestart_month'},
Line 968  sub parse_advanced_search { Line 994  sub parse_advanced_search {
     if ($datequery=~/^Incorrect/) {      if ($datequery=~/^Incorrect/) {
  &output_date_error($r,$datequery);   &output_date_error($r,$datequery);
  return ;   return ;
     }      } elsif ($datequery) {
     elsif ($datequery) {          # Here is where you would set up pretty_search_string to output
           # date query information.
  push @queries,$datequery;   push @queries,$datequery;
     }      }
     # Process form information for custom metadata querying      # Process form information for custom metadata querying
     my $customquery=undef;      my $customquery=undef;
     if ($ENV{'form.custommetadata'}) {      if ($ENV{'form.custommetadata'}) {
           $pretty_search_string .=$font."Custom Metadata Search</font>: <b>".
               $ENV{'form.custommetadata'}."</b><br />\n";
  $customquery=&build_custommetadata_query('custommetadata',   $customquery=&build_custommetadata_query('custommetadata',
       $ENV{'form.custommetadata'});        $ENV{'form.custommetadata'});
     }      }
     my $customshow=undef;      my $customshow=undef;
     if ($ENV{'form.customshow'}) {      if ($ENV{'form.customshow'}) {
           $pretty_search_string .=$font."Custom Metadata Display</font>: <b>".
               $ENV{'form.customshow'}."</b><br />\n";
  $customshow=$ENV{'form.customshow'};   $customshow=$ENV{'form.customshow'};
  $customshow=~s/[^\w\s]//g;   $customshow=~s/[^\w\s]//g;
  my @fields=split(/\s+/,$customshow);   my @fields=split(/\s+/,$customshow);
Line 994  sub parse_advanced_search { Line 1025  sub parse_advanced_search {
     my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}}       my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}} 
                            :  ($ENV{'form.domains'}) );                             :  ($ENV{'form.domains'}) );
     my %domain_hash = ();      my %domain_hash = ();
       my $pretty_domains_string;
     foreach (@allowed_domains) {      foreach (@allowed_domains) {
         $domain_hash{$_}++;          $domain_hash{$_}++;
     }      }
     foreach (keys(%Apache::lonnet::libserv)) {      if ($domain_hash{'any'}) {
         if ($_ eq 'any') {          $pretty_domains_string = "Searching all domains.";
             $libraries_to_query = undef;      } else {
             last;          if (@allowed_domains > 1) {
               $pretty_domains_string = "Searching domains:";
           } else {
               $pretty_domains_string = "Searching domain ";
         }          }
         if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {          foreach (sort @allowed_domains) {
             push @$libraries_to_query,$_;              $pretty_domains_string .= "<b>$_</b> ";
           }
           foreach (keys(%Apache::lonnet::libserv)) {
               if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {
                   push @$libraries_to_query,$_;
               }
         }          }
     }      }
       $pretty_search_string .= $pretty_domains_string."<br />\n";
     #      #
     if (@queries) {      if (@queries) {
  $query=join(" AND ",@queries);   $query=join(" AND ",@queries);
Line 1013  sub parse_advanced_search { Line 1054  sub parse_advanced_search {
     } elsif ($customquery) {      } elsif ($customquery) {
         $query = '';          $query = '';
     }      }
     return ($query,$customquery,$customshow,$libraries_to_query);      return ($query,$customquery,$customshow,$libraries_to_query,
               $pretty_search_string);
 }  }
   
 ######################################################################  ######################################################################
Line 1047  sub parse_basic_search { Line 1089  sub parse_basic_search {
  &output_blank_field_error($r);   &output_blank_field_error($r);
  return OK;   return OK;
     }      }
       my $pretty_search_string = '<b>'.$ENV{'form.basicexp'}.'</b>';
     my $search_string = $ENV{'form.basicexp'};      my $search_string = $ENV{'form.basicexp'};
     if ($ENV{'form.related'}) {      if ($ENV{'form.related'}) {
         $search_string = &related_version($ENV{'form.basicexp'});          my @New_Words;
           ($search_string,@New_Words) = &related_version($ENV{'form.basicexp'});
           if (@New_Words) {
               $pretty_search_string .= " with related words: <b>@New_Words</b>.";
           } else {
               $pretty_search_string .= " with no related words.";
           }
     }      }
       &Apache::lonnet::logthis("Search String: $search_string");
     # Build SQL query string based on form page      # Build SQL query string based on form page
     my $query='';      my $query='';
     my $concatarg=join(',"    ",',      my $concatarg=join(',"    ",',
Line 1058  sub parse_basic_search { Line 1108  sub parse_basic_search {
                         'keywords'));                          'keywords'));
     $concatarg='title' if $ENV{'form.titleonly'};      $concatarg='title' if $ENV{'form.titleonly'};
     $query=&build_SQL_query('concat('.$concatarg.')',$search_string);      $query=&build_SQL_query('concat('.$concatarg.')',$search_string);
     return 'select * from metadata where '.$query;      $pretty_search_string .= "<br />\n";
       return 'select * from metadata where '.$query,$pretty_search_string;
 }  }
   
   
Line 1082  Note: Using this twice on a string is pr Line 1133  Note: Using this twice on a string is pr
 sub related_version {  sub related_version {
     my $search_string = shift;      my $search_string = shift;
     my $result = $search_string;      my $result = $search_string;
       my %New_Words = ();
     while ($search_string =~ /(\w+)/cg) {      while ($search_string =~ /(\w+)/cg) {
         my $word = $1;          my $word = $1;
         next if (lc($word) =~ /\b(or|and|not)\b/);          next if (lc($word) =~ /\b(or|and|not)\b/);
         my @Words = &Apache::loncommon::get_related_words($word);          my @Words = &Apache::loncommon::get_related_words($word);
         my $replacement = join " OR ", ($word,          @Words = ($#Words>4? @Words[0..4] : @Words);
                                         ($#Words>4? @Words[0..4] : @Words)          foreach (@Words) { $New_Words{$_}++;}
                                         );          my $replacement = join " OR ", ($word,@Words);
         $result =~ s/(\b)$word(\b)/$1($replacement)$2/g;          $result =~ s/(\b)$word(\b)/$1($replacement)$2/g;
     }      }
     return $result;      return $result,sort(keys(%New_Words));
 }  }
   
 ######################################################################  ######################################################################
Line 1657  Checked for existance & 'edit' mode. Line 1709  Checked for existance & 'edit' mode.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub search_results_header {  sub search_results_header {
     my ($mode) = @_;      my ($mode,$pretty_query) = @_;
     $mode = lc($mode);      $mode = lc($mode);
     my $title;      my $title;
     if ($mode eq 'advanced') {      if ($mode eq 'advanced') {
Line 1759  SCRIPT Line 1811  SCRIPT
 <img align=right src=/adm/lonIcons/lonlogos.gif>  <img align=right src=/adm/lonIcons/lonlogos.gif>
 <h1>$title</h1>  <h1>$title</h1>
 END  END
       if ($pretty_query) {
           $result .= "<p>Search query: $pretty_query</p>";
       }
     return $result;      return $result;
 }  }
   

Removed from v.1.142  
changed lines
  Added in v.1.143


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>