Diff for /loncom/interface/lonsearchcat.pm between versions 1.163 and 1.190

version 1.163, 2003/01/14 18:47:50 version 1.190, 2003/10/07 20:30:13
Line 74  package Apache::lonsearchcat; Line 74  package Apache::lonsearchcat;
   
 # ------------------------------------------------- modules used by this module  # ------------------------------------------------- modules used by this module
 use strict;  use strict;
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common :http);
 use Apache::lonnet();  use Apache::lonnet();
 use Apache::File();  use Apache::File();
 use CGI qw(:standard);  use CGI qw(:standard);
 use Text::Query;  use Text::Query;
 use DBI;  
 use GDBM_File;  use GDBM_File;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonmysql();  use Apache::lonmysql();
   use Apache::lonlocal;
   
 # ---------------------------------------- variables used throughout the module  # ---------------------------------------- variables used throughout the module
   
Line 143  my %persistent_db; Line 143  my %persistent_db;
 my $hidden_fields;  my $hidden_fields;
 my $bodytag;  my $bodytag;
   
   #
   # For course search
   #
   my %alreadyseen;
   my $hashtied;
   my %hash;
   my $totalfound;
    
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 179  sub handler { Line 187  sub handler {
                       # This button is different for the RAT compared to                        # This button is different for the RAT compared to
                       # normal invocation.                        # normal invocation.
     #      #
     $r->content_type('text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
     ##      ##
Line 200  sub handler { Line 208  sub handler {
     ##     this once, so the pause indicator is deleted      ##     this once, so the pause indicator is deleted
     ##      ##
     if (exists($ENV{'form.pause'})) {      if (exists($ENV{'form.pause'})) {
         sleep(3);          sleep(1);
         delete($ENV{'form.pause'});          delete($ENV{'form.pause'});
     }      }
     ##      ##
     ## Initialize global variables      ## 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/$ENV{'user.domain'}_$ENV{'user.name'}_searchcat.db";
             "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db";  
     #      #
     # set the name of the persistent database      # set the name of the persistent database
     #          $ENV{'form.persistent_db_id'} can only have digits in it.      #          $ENV{'form.persistent_db_id'} can only have digits in it.
Line 339  END Line 346  END
             &run_search($r,$query,$customquery,$customshow,              &run_search($r,$query,$customquery,$customshow,
                         $libraries,$pretty_string);                          $libraries,$pretty_string);
         }          }
       } elsif ($ENV{'form.phase'} eq 'course_search') {
           &course_search($r);
     } elsif(($ENV{'form.phase'} eq 'basic_search') ||      } elsif(($ENV{'form.phase'} eq 'basic_search') ||
             ($ENV{'form.phase'} eq 'adv_search')) {              ($ENV{'form.phase'} eq 'adv_search')) {
         $ENV{'form.searchmode'} = 'basic';          $ENV{'form.searchmode'} = 'basic';
Line 374  END Line 383  END
             (undef,undef,undef,undef);              (undef,undef,undef,undef);
         my $pretty_string;          my $pretty_string;
         if ($ENV{'form.phase'} eq 'basic_search') {          if ($ENV{'form.phase'} eq 'basic_search') {
             ($query,$pretty_string) = &parse_basic_search($r,$closebutton);              ($query,$pretty_string,$libraries) = 
                   &parse_basic_search($r,$closebutton);
         } else {                      # Advanced search          } else {                      # Advanced search
             ($query,$customquery,$customshow,$libraries,$pretty_string)               ($query,$customquery,$customshow,$libraries,$pretty_string) 
                 = &parse_advanced_search($r,$closebutton);                  = &parse_advanced_search($r,$closebutton);
Line 397  END Line 407  END
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
   sub course_search {
       my $r=shift;
       my $bodytag=&Apache::loncommon::bodytag('Course Search');
       my $pretty_search_string = '<b>'.$ENV{'form.courseexp'}.'</b>';
       my $search_string = $ENV{'form.courseexp'};
       my @New_Words;
       if ($ENV{'form.crsrelated'}) {
           ($search_string,@New_Words) = &related_version($ENV{'form.courseexp'});
           if (@New_Words) {
               $pretty_search_string .= " with related words: <b>@New_Words</b>.";
           } else {
               $pretty_search_string .= " with no related words.";
           }
       }
       my $fulltext=$ENV{'form.crsfulltext'};
       my @allwords=($search_string,@New_Words);
       $totalfound=0;
       $r->print('<html><head><title>LON-CAPA Course Search</title></head>'.
         $bodytag.$pretty_search_string);
       $r->rflush();
   # ======================================================= Go through the course
      $hashtied=0;
      undef %alreadyseen;
      %alreadyseen=();
       my $c=$r->connection;
      &tiehash();
      foreach (keys %hash) {
          if ($c->aborted()) { last; }
          if (($_=~/^src\_(.+)$/) && (!$alreadyseen{$hash{$_}})) {
              &checkonthis($r,$hash{$_},0,$hash{'title_'.$1},$fulltext,@allwords);
          }
      }
      &untiehash();
       unless ($totalfound) {
    $r->print('<p>'.&mt('No resources found').'.</p>');
       }
   # =================================================== Done going through course
       $r->print('</body></html>');
   }
   
   # ---------------------------------------------------------------- tie the hash
   
   sub tiehash {
       $hashtied=0;
       if ($ENV{'request.course.fn'}) {
           if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.".db",
               &GDBM_READER(),0640)) {
                   $hashtied=1;
           }
       }    
   }
   
   sub untiehash {
       if ($hashtied) { untie %hash; }
       $hashtied=0;
   }
   
   # =============================== This pulls up a resource and its dependencies
   
   sub checkonthis {
       my ($r,$url,$level,$title,$fulltext,@allwords)=@_;
       $alreadyseen{$url}=1;
       $r->rflush();
       my $result=&Apache::lonnet::metadata($url,'title').' '.
                  &Apache::lonnet::metadata($url,'subject').' '.
                  &Apache::lonnet::metadata($url,'abstract').' '.
                  &Apache::lonnet::metadata($url,'keywords');
       if (($url) && ($fulltext)) {
    $result.=&Apache::lonnet::ssi_body($url);
       }
       $result=~s/\s+/ /gs;
       my $applies=0;
       foreach (@allwords) {
           if ($_=~/\w/) {
      if ($result=~/$_/si) {
         $applies++;
              }
          }
       }
   # Does this resource apply?
       if ($applies) {
          $r->print('<br />');
          for (my $i=0;$i<=$level*5;$i++) {
              $r->print('&nbsp;');
          }
          $r->print('<a href="'.$url.'" target="cat">'.
    ($title?$title:$url).'</a><br />');
          $totalfound++;
       } elsif ($fulltext) {
          $r->print(' .');
       }
       $r->rflush();
   # Check also the dependencies of this one
       my $dependencies=
                   &Apache::lonnet::metadata($url,'dependencies');
       foreach (split(/\,/,$dependencies)) {
          if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
             &checkonthis($r,$_,$level+1,'',$fulltext,@allwords);
          }
       }
   }
   
   ######################################################################
   ######################################################################
   
 =pod   =pod 
   
 =item &print_basic_search_form()   =item &print_basic_search_form() 
Line 410  Returns a scalar which holds html for th Line 525  Returns a scalar which holds html for th
   
 sub print_basic_search_form{  sub print_basic_search_form{
     my ($r,$closebutton) = @_;      my ($r,$closebutton) = @_;
     my $bodytag=&Apache::loncommon::bodytag('Catalog Search');      my $bodytag=&Apache::loncommon::bodytag('Search');
     my $scrout=<<"ENDDOCUMENT";      my $scrout=<<"ENDDOCUMENT";
 <html>  <html>
 <head>  <head>
Line 424  sub print_basic_search_form{ Line 539  sub print_basic_search_form{
 </script>  </script>
 </head>  </head>
 $bodytag  $bodytag
   ENDDOCUMENT
   if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) {
       $scrout.=(<<ENDDOCUMENT);
   <h1>Catalog Search</h1>
 <form method="post" action="/adm/searchcat">  <form method="post" action="/adm/searchcat">
 <input type="hidden" name="phase" value="basic_search" />  <input type="hidden" name="phase" value="basic_search" />
 $hidden_fields  $hidden_fields
Line 437  then press SEARCH below. Line 556  then press SEARCH below.
 ENDDOCUMENT  ENDDOCUMENT
     $scrout.='&nbsp;'.&simpletextfield('basicexp',$ENV{'form.basicexp'},40).      $scrout.='&nbsp;'.&simpletextfield('basicexp',$ENV{'form.basicexp'},40).
         '&nbsp;';          '&nbsp;';
     my $checkbox = &simplecheckbox('related',$ENV{'form.related'});      my $relatedcheckbox = &simplecheckbox('related',$ENV{'form.related'});
       my $domain = $r->dir_config('lonDefDomain');
       my $domaincheckbox = &simplecheckbox('domains',$domain);
       my $srch=&mt('Search');
       my $header=&mt('Advanced Search');
     $scrout.=<<END;      $scrout.=<<END;
 </td><td><a  </td><td><a
 href="/adm/searchcat?phase=disp_adv&catalogmode=$ENV{'form.catalogmode'}&launch=$ENV{'form.launch'}"  href="/adm/searchcat?phase=disp_adv&catalogmode=$ENV{'form.catalogmode'}&launch=$ENV{'form.launch'}&mode=$ENV{'form.mode'}"
 >Advanced Search</a></td></tr>  >$header</a></td></tr>
 <tr><td>$checkbox use related words</td><td></td></tr>  <tr><td>$relatedcheckbox use related words</td>
       <td>$domaincheckbox only search domain <b>$domain</b></td></tr>
 </table>  </table>
 </p>  </p>
 <p>  <p>
 &nbsp;<input type="submit" name="basicsubmit" value='SEARCH' />&nbsp;  &nbsp;<input type="submit" name="basicsubmit" value='$srch' />&nbsp;
 $closebutton  $closebutton
 END  END
     $scrout.=&selectbox(undef,'viewselect',      $scrout.=&selectbox('View','viewselect',
  $ENV{'form.viewselect'},   $ENV{'form.viewselect'},
  undef,undef,undef,   undef,undef,undef,
  sort(keys(%Views)));   sort(keys(%Views)));
     $scrout.=&selectbox(undef,'show',      $scrout.=&selectbox('Per Page','show',
  $ENV{'form.show'},   $ENV{'form.show'},
  undef,undef,undef,   undef,undef,undef,
  (10,20,50,100));   (10,20,50,100));
     $scrout.=<<ENDDOCUMENT;      $scrout.=<<ENDDOCUMENT;
 per page.  
 </p>  </p>
 </form>  </form>
   ENDDOCUMENT
       }
       if ($ENV{'request.course.id'}) {
    my %lt=&Apache::lonlocal::texthash(
      'srch' => 'Search',
                                              'header' => 'Course Search',
    'note' => 'Enter terms or phrases, then press "Search" below',
      );
           $scrout.=(<<ENDCOURSESEARCH);
   <hr />
   <h1>$lt{'header'}</h1>    
   <form method="post" action="/adm/searchcat">
   <input type="hidden" name="phase" value="course_search" />
   $hidden_fields
   <p>
   $lt{'note'}.
   </p>
   <p>
   <table>
   <tr><td>
   ENDCOURSESEARCH
           $scrout.='&nbsp;'.
               &simpletextfield('courseexp',$ENV{'form.courseexp'},40);
           my $crscheckbox = 
               &simplecheckbox('crsfulltext',$ENV{'form.crsfulltext'});
           my $relcheckbox = 
               &simplecheckbox('crsrelated',$ENV{'form.crsrelated'});
           $scrout.=(<<ENDENDCOURSE);
   </td></tr>
   <tr><td>$relcheckbox use related words</td><td></td></tr>
   <tr><td>$crscheckbox fulltext search (time consuming)</td><td></td></tr>
   </table><p>
   &nbsp;<input type="submit" name="coursesubmit" value='$lt{'srch'}' />
   </p>
   ENDENDCOURSE
       }
       $scrout.=(<<ENDDOCUMENT);
 </body>  </body>
 </html>  </html>
 ENDDOCUMENT  ENDDOCUMENT
Line 528  ENDHEADER Line 688  ENDHEADER
  undef,undef,undef,   undef,undef,undef,
  (10,20,50,100));   (10,20,50,100));
     $scrout.='&nbsp;'.      $scrout.='&nbsp;'.
         '<font color="#800000" face="helvetica">Per Page</font>';          '<font color="#800000" face="helvetica">'.&mt('Per Page').'</font>';
     $scrout.="</td><td>Related<br />Words</td></tr>\n";      $scrout.="</td><td>".&mt('Related').'<br />'.&mt('Words')."</td></tr>\n";
     $scrout.=&searchphrasefield_with_related('title',   'title'   ,      $scrout.=&searchphrasefield_with_related('title',   'title'   ,
                                              $ENV{'form.title'});                                               $ENV{'form.title'});
     $scrout.=&searchphrasefield('author',  'author'  ,$ENV{'form.author'});      $scrout.=&searchphrasefield('author',  'author'  ,$ENV{'form.author'});
Line 571  ENDHEADER Line 731  ENDHEADER
     my @domains =&Apache::loncommon::get_domains();      my @domains =&Apache::loncommon::get_domains();
     # adjust the size of the select box      # adjust the size of the select box
     my $size = 4;      my $size = 4;
     my $size = (scalar @domains < ($size - 1) ? scalar @domains + 1 : $size);      $size = (scalar @domains < ($size - 1) ? scalar @domains + 1 : $size);
     $scrout.="\n".'<font color="#800000" face="helvetica"><b>'.      $scrout.="\n".'<font color="#800000" face="helvetica"><b>'.
         'DOMAINS</b></font><br />'.          'DOMAINS TO BE SEARCHED</b></font><br />'.
             '<select name="domains" size="'.$size.'" multiple>'."\n".              '<select name="domains" size="'.$size.'" multiple>'."\n".
                 '<option name="any" value="any" '.                  '<option name="any" value="any" '.
                     ($domain_hash{'any'}? 'selected ' :'').                      ($domain_hash{'any'}? 'selected ' :'').
Line 586  ENDHEADER Line 746  ENDHEADER
     #----------------------------------------------------------------      #----------------------------------------------------------------
     $scrout.=&selectbox('Limit by language','language',      $scrout.=&selectbox('Limit by language','language',
  $ENV{'form.language'},'any','Any Language',   $ENV{'form.language'},'any','Any Language',
  \&{Apache::loncommon::languagedescription},   \&Apache::loncommon::languagedescription,
  (&Apache::loncommon::languageids),   (&Apache::loncommon::languageids),
  );   );
 # ------------------------------------------------ Compute date selection boxes  # ------------------------------------------------ Compute date selection boxes
Line 633  LASTREVISIONDATEEND Line 793  LASTREVISIONDATEEND
     $scrout.=&selectbox('Limit by copyright/distribution','copyright',      $scrout.=&selectbox('Limit by copyright/distribution','copyright',
  $ENV{'form.copyright'},   $ENV{'form.copyright'},
  'any','Any copyright/distribution',   'any','Any copyright/distribution',
  \&{Apache::loncommon::copyrightdescription},   \&Apache::loncommon::copyrightdescription,
  (&Apache::loncommon::copyrightids),   (&Apache::loncommon::copyrightids),
  );   );
 # ------------------------------------------- Compute customized metadata field  # ------------------------------------------- Compute customized metadata field
Line 699  sub get_persistent_form_data { Line 859  sub get_persistent_form_data {
     # Loop through the keys, looking for 'form.'      # Loop through the keys, looking for 'form.'
     foreach my $name (keys(%persistent_db)) {      foreach my $name (keys(%persistent_db)) {
         next if ($name !~ /^form./);          next if ($name !~ /^form./);
           # Kludgification begins!
           if ($name eq 'form.domains' && 
               $ENV{'form.searchmode'} eq 'basic' &&
               $ENV{'form.phase'} ne 'disp_basic') {
               next;
           }
           # End kludge (hopefully)
         next if (exists($ENV{$name}));          next if (exists($ENV{$name}));
         my @values = map {           my @values = map { 
             &Apache::lonnet::unescape($_);              &Apache::lonnet::unescape($_);
Line 713  sub get_persistent_form_data { Line 880  sub get_persistent_form_data {
     untie (%persistent_db);      untie (%persistent_db);
     return 1;      return 1;
 }  }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 871  If $value eq 'on' the box is checked. Line 1039  If $value eq 'on' the box is checked.
 ###############################################  ###############################################
 ###############################################  ###############################################
   
 sub simplecheckbox {  sub simplecheckbox{
     my ($name,$value)=@_;      my ($name,$value,$checked)=@_;
     my $checked='';      $checked="checked" if ($value eq 'on');
     $checked="checked" if $value eq 'on';      return '<input type="checkbox" name="'.$name.'" value="'.$value.'" '.
     return '<input type="checkbox" name="'.$name.'" '. $checked . ' />';          $checked.' />';
 }  }
   
 ###############################################  ###############################################
Line 896  field heading. Line 1064  field heading.
 ###############################################  ###############################################
   
 sub fieldtitle {  sub fieldtitle {
     my $title = uc(shift());      my $title = uc(&mt(shift()));
     return '<font color="#800000" face="helvetica"><b>'.$title.      return '<font color="#800000" face="helvetica"><b>'.$title.
         ':&nbsp;</b></font>';          ':&nbsp;</b></font>';
 }  }
Line 991  END Line 1159  END
     my $i = 1;      my $i = 1;
     foreach (qw/January February March April May June       foreach (qw/January February March April May June 
      July August September October November December /){       July August September October November December /){
  $month .="<option value=\"$i\">$_</option>\n";   $month .="<option value=\"$i\">".&mt($_)."</option>\n";
  $i++;   $i++;
     }      }
     $month.="</select>\n";      $month.="</select>\n";
Line 1068  sub selectbox { Line 1236  sub selectbox {
     my ($title,$name,$default,$anyvalue,$anytag,$functionref,@idlist)=@_;      my ($title,$name,$default,$anyvalue,$anytag,$functionref,@idlist)=@_;
     if (! defined($functionref)) { $functionref = sub { $_[0]}; }      if (! defined($functionref)) { $functionref = sub { $_[0]}; }
     my $selout='';      my $selout='';
       $title=&mt($title);
     if (defined($title)) {      if (defined($title)) {
         my $uctitle=uc($title);          my $uctitle=uc($title);
         $selout="\n".'<p><font color="#800000" face="helvetica">'.          $selout="\n".'<p><font color="#800000" face="helvetica">'.
Line 1078  sub selectbox { Line 1247  sub selectbox {
     foreach (@idlist) {      foreach (@idlist) {
         $selout.='<option value="'.$_.'"';          $selout.='<option value="'.$_.'"';
         if ($_ eq $default and !/^any$/) {          if ($_ eq $default and !/^any$/) {
     $selout.=' selected >'.&{$functionref}($_).'</option>';      $selout.=' selected >'.&mt(&{$functionref}($_)).'</option>';
  }   }
  elsif ($_ eq $default and /^$anyvalue$/) {   elsif ($_ eq $default and /^$anyvalue$/) {
     $selout.=' selected >'.$anytag.'</option>';      $selout.=' selected >'.&mt($anytag).'</option>';
  }   }
         else {$selout.='>'.&{$functionref}($_).'</option>';}          else {$selout.='>'.&mt(&{$functionref}($_)).'</option>';}
     }      }
     return $selout.'</select>'.(defined($title)?'</p>':' ');      return $selout.'</select>'.(defined($title)?'</p>':' ');
 }  }
Line 1269  sub parse_advanced_search { Line 1438  sub parse_advanced_search {
     ## ---------------------------------------------------------------      ## ---------------------------------------------------------------
     ## Deal with restrictions to given domains      ## Deal with restrictions to given domains
     ##       ## 
       my ($libraries_to_query,$pretty_domains_string) = 
           &parse_domain_restrictions();
       $pretty_search_string .= $pretty_domains_string."<br />\n";
       #
       if (@queries) {
    $query=join(" AND ",@queries);
    $query="select * from metadata where $query";
       } elsif ($customquery) {
           $query = '';
       }
       return ($query,$customquery,$customshow,$libraries_to_query,
               $pretty_search_string);
   }
   
   sub parse_domain_restrictions {
     my $libraries_to_query = undef;      my $libraries_to_query = undef;
     # $ENV{'form.domains'} can be either a scalar or an array reference.      # $ENV{'form.domains'} can be either a scalar or an array reference.
     # We need an array.      # We need an array.
     my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}}       if (! exists($ENV{'form.domains'})) {
                            :  ($ENV{'form.domains'}) );          return (undef,'');
       }
       my @allowed_domains;
       if (ref($ENV{'form.domains'})) {
           @allowed_domains =  @{$ENV{'form.domains'}};
       } else {
           @allowed_domains = ($ENV{'form.domains'});
       }
     my %domain_hash = ();      my %domain_hash = ();
     my $pretty_domains_string;      my $pretty_domains_string;
     foreach (@allowed_domains) {      foreach (@allowed_domains) {
Line 1296  sub parse_advanced_search { Line 1487  sub parse_advanced_search {
             }              }
         }          }
     }      }
     $pretty_search_string .= $pretty_domains_string."<br />\n";      return ($libraries_to_query,$pretty_domains_string);
     #  
     if (@queries) {  
  $query=join(" AND ",@queries);  
  $query="select * from metadata where $query";  
     } elsif ($customquery) {  
         $query = '';  
     }  
     return ($query,$customquery,$customshow,$libraries_to_query,  
             $pretty_search_string);  
 }  }
   
 ######################################################################  ######################################################################
Line 1333  sub parse_basic_search { Line 1515  sub parse_basic_search {
  $ENV{"form.$_"}=&Apache::lonnet::unescape($ENV{"form.$_"});   $ENV{"form.$_"}=&Apache::lonnet::unescape($ENV{"form.$_"});
  $ENV{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;   $ENV{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }      }
       my ($libraries_to_query,$pretty_domains_string) = 
           &parse_domain_restrictions();
     # Check to see if enough is filled in      # Check to see if enough is filled in
     unless (&filled($ENV{'form.basicexp'})) {      unless (&filled($ENV{'form.basicexp'})) {
  &output_blank_field_error($r,$closebutton,'phase=disp_basic');   &output_blank_field_error($r,$closebutton,'phase=disp_basic');
Line 1352  sub parse_basic_search { Line 1535  sub parse_basic_search {
     }      }
     # 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(',',
        ('title', 'author', 'subject', 'notes', 'abstract',         ('title', 'author', 'subject', 'notes', 'abstract',
                         '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_ws(" ",'.$concatarg.')',$search_string);
       if (defined($pretty_domains_string) && $pretty_domains_string ne '') {
           $pretty_search_string .= ' '.$pretty_domains_string;
       }
     $pretty_search_string .= "<br />\n";      $pretty_search_string .= "<br />\n";
     return 'select * from metadata where '.$query,$pretty_search_string;      my $final_query = 'SELECT * FROM metadata WHERE '.$query;
   #    &Apache::lonnet::logthis($final_query);
       return ($final_query,$pretty_search_string,
               $libraries_to_query);
 }  }
   
   
Line 1471  sub recursive_SQL_query_build { Line 1660  sub recursive_SQL_query_build {
     my @matches=($pattern=~/(\[[^\]|\[]*\])/g);      my @matches=($pattern=~/(\[[^\]|\[]*\])/g);
     return $pattern unless @matches;      return $pattern unless @matches;
     foreach my $match (@matches) {      foreach my $match (@matches) {
  $match=~/\[ (\w+)\s(.*) \]/;          $match=~/\[ (\w+)\s(.*) \]/;
  my ($key,$value)=($1,$2);          my ($key,$value)=($1,$2);
  my $replacement='';          my $replacement='';
  if ($key eq 'literal') {          if ($key eq 'literal') {
     $replacement="($dkey like \"\%$value\%\")";              $replacement="($dkey LIKE \"\%$value\%\")";
  }          } elsif (lc($key) eq 'not') {
  elsif ($key eq 'not') {              $value=~s/LIKE/NOT LIKE/;
     $value=~s/like/not like/;  #          $replacement="($dkey not like $value)";
 #    $replacement="($dkey not like $value)";              $replacement="$value";
     $replacement="$value";          } elsif ($key eq 'and') {
  }              $value=~/(.*[\"|\)]) ([|\(|\^].*)/;
  elsif ($key eq 'and') {              $replacement="($1 AND $2)";
     $value=~/(.*[\"|\)]) ([|\(|\^].*)/;   } elsif ($key eq 'or') {
     $replacement="($1 AND $2)";              $value=~/(.*[\"|\)]) ([|\(|\^].*)/;
  }              $replacement="($1 OR $2)";
  elsif ($key eq 'or') {  
     $value=~/(.*[\"|\)]) ([|\(|\^].*)/;  
     $replacement="($1 OR $2)";  
  }   }
  substr($pattern,   substr($pattern,
        index($pattern,$match),                 index($pattern,$match),
        length($match),                 length($match),
        $replacement                 $replacement);
        );  
     }      }
     &recursive_SQL_query_build($dkey,$pattern);      &recursive_SQL_query_build($dkey,$pattern);
 }  }
Line 1662  sub ensure_db_and_table { Line 1847  sub ensure_db_and_table {
 sub print_sort_form {  sub print_sort_form {
     my ($r,$pretty_query_string) = @_;      my ($r,$pretty_query_string) = @_;
     ##      ##
     my %SortableFields =       my %SortableFields=&Apache::lonlocal::texthash( 
         (id        => 'Default',           id        => 'Default',
          title     => 'Title',           title     => 'Title',
          author    => 'Author',           author    => 'Author',
          subject   => 'Subject',           subject   => 'Subject',
Line 1675  sub print_sort_form { Line 1860  sub print_sort_form {
          copyright => 'Copyright',           copyright => 'Copyright',
          hostname  => 'Host',           hostname  => 'Host',
          creationdate     => 'Creation Date',           creationdate     => 'Creation Date',
          lastrevisiondate => 'Revision Date',           lastrevisiondate => 'Revision Date'
      );       );
     ##      ##
     my $table = $ENV{'form.table'};      my $table = $ENV{'form.table'};
Line 1751  the following format: Line 1936  the following format:
   
 =cut  =cut
   
 ##  #####################################################################
 ## Restrictions:  #####################################################################
 ##    columns of type 'text' and 'blob' cannot have defaults.  
 ##    columns of type 'enum' cannot be used for FULLTEXT.  my @Datatypes = 
 ##      ( { name => 'id', 
 my @DataOrder = qw/id title author subject url keywords version notes          type => 'MEDIUMINT',
     abstract mime lang owner copyright creationdate lastrevisiondate hostname/;          restrictions => 'UNSIGNED NOT NULL',
           primary_key  => 'yes',
 my %Datatypes =           auto_inc     => 'yes' },
     ( id        =>{ type         => 'MEDIUMINT',        { name => 'title',     type=>'TEXT'},
                     restrictions => 'UNSIGNED NOT NULL',        { name => 'author',    type=>'TEXT'},
                     primary_key  => 'yes',        { name => 'subject',   type=>'TEXT'},
                     auto_inc     => 'yes'        { name => 'url',       type=>'TEXT', restrictions => 'NOT NULL' },
                     },        { name => 'keywords',  type=>'TEXT'},
       title     =>{ type=>'TEXT'},        { name => 'version',   type=>'TEXT'},
       author    =>{ type=>'TEXT'},        { name => 'notes',     type=>'TEXT'},
       subject   =>{ type=>'TEXT'},        { name => 'abstract',  type=>'TEXT'},
       url       =>{ type=>'TEXT',        { name => 'mime',      type=>'TEXT'},
                     restrictions => 'NOT NULL' },        { name => 'lang',      type=>'TEXT'},
       keywords  =>{ type=>'TEXT'},        { name => 'owner',     type=>'TEXT'},
       version   =>{ type=>'TEXT'},        { name => 'copyright', type=>'TEXT'},
       notes     =>{ type=>'TEXT'},        { name => 'hostname',  type=>'TEXT'},
       abstract  =>{ type=>'TEXT'},  
       mime      =>{ type=>'TEXT'},  
       lang      =>{ type=>'TEXT'},  
       owner     =>{ type=>'TEXT'},  
       copyright =>{ type=>'TEXT'},  
       hostname  =>{ type=>'TEXT'},  
       #--------------------------------------------------        #--------------------------------------------------
       creationdate     =>{ type=>'DATETIME'},        { name => 'creationdate',     type=>'DATETIME'},
       lastrevisiondate =>{ type=>'DATETIME'},        { name => 'lastrevisiondate', type=>'DATETIME'},
       #--------------------------------------------------        #--------------------------------------------------
       );        );
   
Line 1809  Returns: the identifier of the table on Line 1988  Returns: the identifier of the table on
 ######################################################################  ######################################################################
 sub create_results_table {  sub create_results_table {
     my $table = &Apache::lonmysql::create_table      my $table = &Apache::lonmysql::create_table
         ( { columns => \%Datatypes,          ( { columns => \@Datatypes,
             column_order => \@DataOrder,              FULLTEXT => [{'columns' => \@Fullindicies},],
             fullindex => \@Fullindicies,  
         } );          } );
     if (defined($table)) {      if (defined($table)) {
         $ENV{'form.table'} = $table;          $ENV{'form.table'} = $table;
Line 1936  END Line 2114  END
     if (@Lines > 2) {      if (@Lines > 2) {
         $pretty_string = join '<br \>',(@Lines[0..2],'....<br />');          $pretty_string = join '<br \>',(@Lines[0..2],'....<br />');
     }      }
     $r->print("Search: ".$pretty_string);      $r->print(&mt("Search").": ".$pretty_string);
     $r->rflush();      $r->rflush();
     #      #
     # Determine the servers we need to contact.      # Determine the servers we need to contact.
Line 1995  END Line 2173  END
     my $time_remaining = $max_time - (time - $starttime) ;      my $time_remaining = $max_time - (time - $starttime) ;
     my $last_time = $time_remaining;      my $last_time = $time_remaining;
     &update_seconds($r,$time_remaining);      &update_seconds($r,$time_remaining);
       &update_status($r,'contacting '.$Servers_to_contact[0]);
     while (($time_remaining > 0) &&      while (($time_remaining > 0) &&
            ((@Servers_to_contact) || keys(%Server_status))) {             ((@Servers_to_contact) || keys(%Server_status))) {
         # Send out a search request if it needs to be done.          # Send out a search request if it needs to be done.
         if (@Servers_to_contact) {          if (@Servers_to_contact) {
             # Contact one server              # Contact one server
             my $server = shift(@Servers_to_contact);              my $server = shift(@Servers_to_contact);
               &update_status($r,&mt('contacting').' '.$server);
             my $reply=&Apache::lonnet::metadata_query($query,$customquery,              my $reply=&Apache::lonnet::metadata_query($query,$customquery,
                                                       $customshow,[$server]);                                                        $customshow,[$server]);
             ($server) = keys(%$reply);              ($server) = keys(%$reply);
             $Server_status{$server} = $reply->{$server};              $Server_status{$server} = $reply->{$server};
             &update_status($r,'contacting '.$server);  
         } else {          } else {
             # wait a sec. to give time for files to be written              # wait a sec. to give time for files to be written
             # This sleep statement is here instead of outside the else               # This sleep statement is here instead of outside the else 
             # block because we do not want to pause if we have servers              # block because we do not want to pause if we have servers
             # left to contact.                # left to contact.  
               if (scalar (keys(%Server_status))) {
                   &update_status($r,
                          &mt('waiting on').' '.(join(' ',keys(%Server_status))));
               }
             sleep(1)              sleep(1)
         }          }
         #          #
         if (scalar (keys(%Server_status))) {  
             &update_status($r,'waiting on '.(join(' ',keys(%Server_status))));  
         }  
         #          #
         # Loop through the servers we have contacted but do not          # Loop through the servers we have contacted but do not
         # have results from yet, looking for results.          # have results from yet, looking for results.
Line 2029  END Line 2209  END
             $status=~/^([\.\w]+)$/;               $status=~/^([\.\w]+)$/; 
            my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$1;             my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$1;
             if (-e $datafile && ! -e "$datafile.end") {              if (-e $datafile && ! -e "$datafile.end") {
                 &update_status($r,'Receiving results from '.$server);                  &update_status($r,&mt('Receiving results from').' '.$server);
                 next;                  next;
             }              }
             last if ($connection->aborted());              last if ($connection->aborted());
             if (-e "$datafile.end") {              if (-e "$datafile.end") {
                 &update_status($r,'Reading results from '.$server);                  &update_status($r,&mt('Reading results from').' '.$server);
                 if (-z "$datafile") {                  if (-z "$datafile") {
                     delete($Server_status{$server});                      delete($Server_status{$server});
                     next;                      next;
Line 2089  END Line 2269  END
             &update_seconds($r,$time_remaining);              &update_seconds($r,$time_remaining);
         }          }
     }      }
     &update_status($r,'Search Complete'.$server);      &update_status($r,&mt('Search Complete').$server);
     &update_seconds($r,0);      &update_seconds($r,0);
     &Apache::lonmysql::disconnect_from_db();      &Apache::lonmysql::disconnect_from_db();
     # We have run out of time or run out of servers to talk to and      # We have run out of time or run out of servers to talk to and
Line 2233  sub display_results { Line 2413  sub display_results {
          ."</center>\n"           ."</center>\n"
          );           );
     if ($total_results == 0) {      if ($total_results == 0) {
         $r->print("There are currently no results.\n".          $r->print('<meta HTTP-EQUIV="Refresh" CONTENT="1">'.
                     '<h3>'.&mt('There are currently no results').'.</h3>'.
                   "</form></body></html>");                    "</form></body></html>");
         return;          return;
     } else {      } else {
Line 2264  sub display_results { Line 2445  sub display_results {
         $r->rflush();          $r->rflush();
     }      }
     if (@Results < 1) {      if (@Results < 1) {
         $r->print("There were no results matching your query");          $r->print(&mt("There were no results matching your query"));
     } else {      } else {
         $r->print          $r->print
             ('<center>'.              ('<center>'.
Line 2337  sub parse_row { Line 2518  sub parse_row {
     my @Row = @_;      my @Row = @_;
     my %Fields;      my %Fields;
     for (my $i=0;$i<=$#Row;$i++) {      for (my $i=0;$i<=$#Row;$i++) {
         $Fields{$DataOrder[$i]}=&Apache::lonnet::unescape($Row[$i]);          $Fields{$Datatypes[$i]->{'name'}}=&Apache::lonnet::unescape($Row[$i]);
     }      }
     $Fields{'language'} =       $Fields{'language'} = 
         &Apache::loncommon::languagedescription($Fields{'lang'});          &Apache::loncommon::languagedescription($Fields{'lang'});
Line 2568  SCRIPT Line 2749  SCRIPT
     $result.=<<SCRIPT if $ENV{'form.catalogmode'} eq 'groupsearch';      $result.=<<SCRIPT if $ENV{'form.catalogmode'} eq 'groupsearch';
 <script type="text/javascript">  <script type="text/javascript">
     function queue(checkbox_num,val) {      function queue(checkbox_num,val) {
         if (document.forms.results.returnvalues[checkbox_num].checked) {          if (document.forms.results.returnvalues.length != "undefined" &&
             parent.statusframe.document.forms.statusform.elements.Queue.value +='1a'+val+'b';              typeof(document.forms.results.returnvalues.length) == "number") {
               if (document.forms.results.returnvalues[checkbox_num].checked) {
                   parent.statusframe.document.forms.statusform.elements.Queue.value +='1a'+val+'b';
               } else {
                   parent.statusframe.document.forms.statusform.elements.Queue.value +='0a'+val+'b';
               }
         } else {          } else {
             parent.statusframe.document.forms.statusform.elements.Queue.value +='0a'+val+'b';              if (document.forms.results.returnvalues.checked) {
                   parent.statusframe.document.forms.statusform.elements.Queue.value +='1a'+val+'b';
               } else {
                   parent.statusframe.document.forms.statusform.elements.Queue.value +='0a'+val+'b';
               }
         }          }
     }      }
     function select_group() {      function select_group() {
Line 2969  sub cleanup { Line 3159  sub cleanup {
   &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');    &Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');
         }          }
     }      }
       &untiehash();
     &Apache::lonmysql::disconnect_from_db();      &Apache::lonmysql::disconnect_from_db();
 }  }
   

Removed from v.1.163  
changed lines
  Added in v.1.190


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