Diff for /loncom/interface/lonsearchcat.pm between versions 1.275 and 1.276

version 1.275, 2006/07/31 19:45:58 version 1.276, 2006/09/26 15:24:18
Line 139  sub handler { Line 139  sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
              ['catalogmode','launch','acts','mode','form','element','pause',               ['catalogmode','launch','acts','mode','form','element','pause',
               'phase','persistent_db_id','table','start','show',                'phase','persistent_db_id','table','start','show',
               'cleargroupsort','titleelement']);                'cleargroupsort','titleelement','area']);
     ##      ##
     ## The following is a trick - we wait a few seconds if asked to so      ## The following is a trick - we wait a few seconds if asked to so
     ##     the daemon running the search can get ahead of the daemon      ##     the daemon running the search can get ahead of the daemon
Line 249  sub handler { Line 249  sub handler {
     if (exists($env{'form.mode'})) {      if (exists($env{'form.mode'})) {
         $hidden_fields .= &hidden_field('mode');          $hidden_fields .= &hidden_field('mode');
     }      }
       if (exists($env{'form.area'})) {
           $hidden_fields .= &hidden_field('area');
       }
     ##      ##
     ## Configure dynamic components of interface      ## Configure dynamic components of interface
     ##      ##
Line 318  END Line 321  END
     } elsif ($env{'form.phase'} eq 'disp_adv') {      } elsif ($env{'form.phase'} eq 'disp_adv') {
         &print_advanced_search_form($r,$closebutton,$hidden_fields);          &print_advanced_search_form($r,$closebutton,$hidden_fields);
     } elsif ($env{'form.phase'} eq 'results') {      } elsif ($env{'form.phase'} eq 'results') {
         &display_results($r,$importbutton,$closebutton,$diropendb);          &display_results($r,$importbutton,$closebutton,$diropendb,
                            $env{'form.area'});
     } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {      } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {
         my ($query,$customquery,$customshow,$libraries,$pretty_string) =          my ($query,$customquery,$customshow,$libraries,$pretty_string) =
             &get_persistent_data($persistent_db_file,              &get_persistent_data($persistent_db_file,
Line 328  END Line 332  END
             &print_sort_form($r,$pretty_string);              &print_sort_form($r,$pretty_string);
         } elsif ($env{'form.phase'} eq 'run_search') {          } elsif ($env{'form.phase'} eq 'run_search') {
             &run_search($r,$query,$customquery,$customshow,              &run_search($r,$query,$customquery,$customshow,
                         $libraries,$pretty_string);                          $libraries,$pretty_string,$env{'form.area'});
         }          }
     } elsif ($env{'form.phase'} eq 'course_search') {      } elsif ($env{'form.phase'} eq 'course_search') {
         &course_search($r);          &course_search($r);
Line 358  END Line 362  END
                          $persistent_db_file);                           $persistent_db_file);
         #          #
         # Set up table          # Set up table
         if (! defined(&create_results_table())) {          if (! defined(&create_results_table($env{'form.area'}))) {
     my $errorstring=&Apache::lonmysql::get_error();      my $errorstring=&Apache::lonmysql::get_error();
             &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '.              &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '.
                                      'needed table.  lonmysql error:'.                                       'needed table.  lonmysql error:'.
Line 665  sub print_basic_search_form { Line 669  sub print_basic_search_form {
         &Apache::lonhtmlcommon::breadcrumbs('Searching','Search_Basic',          &Apache::lonhtmlcommon::breadcrumbs('Searching','Search_Basic',
     $env{'form.catalogmode'} ne 'import');      $env{'form.catalogmode'} ne 'import');
     my $scrout = &Apache::loncommon::start_page('Search').$bread_crumb;      my $scrout = &Apache::loncommon::start_page('Search').$bread_crumb;
   # Search form for resource space 
     if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {      if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
         # Define interface components          $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);
         my $userelatedwords= '<label>'.          $scrout .= '<hr /><br />';
             &mt('[_1] use related words',  
                 &Apache::lonhtmlcommon::checkbox  
                 ('related',$env{'form.related'},'related')).'</label>';  
         my $onlysearchdomain='<label>'.  
             &mt('[_1] only search domain [_2]',  
                 &Apache::lonhtmlcommon::checkbox('domains',  
                                                  $env{'form.domains'},  
                                                  $r->dir_config('lonDefDomain')  
                                                  ),  
                 $r->dir_config('lonDefDomain')  
                 ).'</label>';  
         my $inclext= '<label>'.  
             &mt('[_1] include external resources',  
                 &Apache::lonhtmlcommon::checkbox  
                 ('inclext',$env{'form.inclext'})).'</label>';  
         my $adv_search_link =   
             '<a href="/adm/searchcat?'.  
             'phase=disp_adv&'.  
             'catalogmode='.$env{'form.catalogmode'}.  
             '&launch='.$env{'form.launch'}.  
             '&mode='.$env{'form.mode'}.  
             '">'.&mt('Advanced Search').'</a>';  
         #  
         $scrout.='<form name="loncapa_search" method="post" '.  
             'action="/adm/searchcat">'.  
             '<input type="hidden" name="phase" value="basic_search" />'.  
             $hidden_fields;  
         #  
         $scrout .= '<center>'.$/;  
         if ($env{'request.course.id'}) {  
             $scrout .= '<h1>'.&mt('LON-CAPA Catalog Search').'</h1>';  
         } else {  
             # No need to tell them they are searching  
             $scrout.= ('<br />'x2);  
         }  
         $scrout.='<table>'.  
             '<tr><td align="center" valign="top">'.  
             &Apache::lonhtmlcommon::textbox('basicexp',  
     $env{'form.basicexp'},50).  
              '<br />'.  
             '<font size="-1">'.&searchhelp().'</font>'.'</td>'.  
             '<td><font size="-1">'.  
             '<nobr>'.('&nbsp;'x3).$adv_search_link.'</nobr>'.'<br />'.  
             '<nobr>'.('&nbsp;'x1).$userelatedwords.'</nobr>'.'<br />'.  
             '<nobr>'.('&nbsp;'x1).$onlysearchdomain.'</nobr>'.'<br />'.  
             '<nobr>'.('&nbsp;'x1).$inclext.'</nobr>'.'<br />'.  
              '</font></td>'.  
             '</tr>'.$/;  
         #  
         $scrout .= '<tr><td align="center" colspan="2">'.  
             '<font size="-1">'.  
             '<input type="submit" name="basicsubmit" '.  
             'value="'.&mt('Search').'" />'.  
             ('&nbsp;'x2).$closebutton.('&nbsp;'x2).  
             &viewoptions().  
             '</font>'.  
             '</td></tr>'.$/;  
         $scrout .= '</table>'.$/.'</center>'.'</form>';  
     }      }
   # Search form for accessible portfolio files
       $scrout.= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
  my %lt=&Apache::lonlocal::texthash('srch' => 'Search',   my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
                                            'header' => 'Course Search',                                             'header' => 'Course Search',
Line 777  ENDENDCOURSE Line 726  ENDENDCOURSE
     $r->print($scrout);      $r->print($scrout);
     return;      return;
 }  }
   
   sub setup_basic_search {
       my ($r,$area,$hidden_fields,$closebutton) = @_;
       # Define interface components
       my %lt = &Apache::lonlocal::texthash (
                                 res => 'LON-CAPA Catalog Search',
                                 portfolio => 'Portfolio Search',
       );
       my ($userelatedwords,$onlysearchdomain,$inclext,$adv_search_link,$scrout);
       $userelatedwords = '<label>'.&mt('[_1] use related words',
         &Apache::lonhtmlcommon::checkbox('related',$env{'form.related'},'related')).
                          '</label>';
       $onlysearchdomain = '<label>'.&mt('[_1] only search domain [_2]',
         &Apache::lonhtmlcommon::checkbox('domains',$env{'form.domains'},
                                          $r->dir_config('lonDefDomain'))).
                           '</label>';
       if ($area eq 'res') {
           $inclext= '<label>'.&mt('[_1] include external resources',
                &Apache::lonhtmlcommon::checkbox('inclext',$env{'form.inclext'})).
                     '</label>';
       }
       $adv_search_link = '<a href="/adm/searchcat?'.
                          'phase=disp_adv&'.
                          'catalogmode='.$env{'form.catalogmode'}.
                          '&launch='.$env{'form.launch'}.
                          '&mode='.$env{'form.mode'}.
                          '&area='.$area.
                          '">'.&mt('Advanced Search').'</a>';
       #
       $scrout.='<form name="loncapa_search" method="post" '.
                'action="/adm/searchcat">'.
                '<input type="hidden" name="phase" value="basic_search" />'.
                $hidden_fields;
                if (!exists($env{'form.area'})) {
                    $scrout .= '<input type="hidden" name="area" value="'.$area.'" />';
                }
       #
       $scrout .= '<center>'.$/;
   #    if ($env{'request.course.id'}) {
           $scrout .= '<h1>'.$lt{$area}.'</h1>';
   #    } else {
           # No need to tell them they are searching
   #        $scrout.= ('<br />'x2);
   #    }
       $scrout.='<table>'.
                '<tr><td align="center" valign="top">'.
                &Apache::lonhtmlcommon::textbox('basicexp',
                                                $env{'form.basicexp'},50).
                '<br />'.
               '<font size="-1">'.&searchhelp().'</font>'.'</td>'.
               '<td><font size="-1">'.
               '<nobr>'.('&nbsp;'x3).$adv_search_link.'</nobr>'.'<br />'.
               '<nobr>'.('&nbsp;'x1).$userelatedwords.'</nobr>'.'<br />'.
               '<nobr>'.('&nbsp;'x1).$onlysearchdomain.'</nobr>'.'<br />'.
               '<nobr>'.('&nbsp;'x1).$inclext.'</nobr>'.'<br />'.
                '</font></td>'.
               '</tr>'.$/;
       #
       $scrout .= '<tr><td align="center" colspan="2">'.
                  '<font size="-1">'.
                  '<input type="submit" name="basicsubmit" '.
                  'value="'.&mt('Search').'" />'.
                  ('&nbsp;'x2).$closebutton.('&nbsp;'x2). &viewoptions().
                  '</font>'.
                  '</td></tr>'.$/;
       $scrout .= '</table>'.$/.'</center>'.'</form>';
       return $scrout;
   } 
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
Line 871  ENDHEADER Line 889  ENDHEADER
  &titlefield(&mt('Domains')).'</td><td colspan="2">'.    &titlefield(&mt('Domains')).'</td><td colspan="2">'. 
     &Apache::loncommon::domain_select('domains',      &Apache::loncommon::domain_select('domains',
    $env{'form.domains'},1).     $env{'form.domains'},1).
    '<br /><label>'.     '<br /><label>';
             &mt('[_1] include external resources',              if ($env{'form.area'} ne 'portfolio') {
                 &Apache::lonhtmlcommon::checkbox                  $scrout .= &mt('[_1] include external resources',
                 ('inclext',$env{'form.inclext'})).'</label></td></tr>'.$/;                             &Apache::lonhtmlcommon::checkbox
                              ('inclext',$env{'form.inclext'})).'</label>'
               }
        $scrout .= '</td></tr>'.$/;
     #      #
     # Misc metadata      # Misc metadata
     $scrout.='<tr><td align="right" valign="top">'.      if ($env{'form.area'} ne 'portfolio') {
  &titlefield(&mt('Copyright/Distribution')).'</td><td colspan="2">'.          $scrout.='<tr><td align="right" valign="top">'.
         &Apache::lonmeta::selectbox('copyright',           &titlefield(&mt('Copyright/Distribution')).
                                     $env{'form.copyright'},                   '</td><td colspan="2">'.
                                     \&Apache::loncommon::copyrightdescription,                   &Apache::lonmeta::selectbox('copyright',
                                     ( undef,                                               $env{'form.copyright'},
                                       &Apache::loncommon::copyrightids)                                  \&Apache::loncommon::copyrightdescription,
                                     ).'</td></tr>'.$/;                                         ( undef,
                                           &Apache::loncommon::copyrightids)
                                   ).'</td></tr>'.$/;
       }
     $scrout.='<tr><td align="right" valign="top">'.      $scrout.='<tr><td align="right" valign="top">'.
  &titlefield(&mt('Language')).'</td><td colspan="2">'.   &titlefield(&mt('Language')).'</td><td colspan="2">'.
         &Apache::lonmeta::selectbox('language',          &Apache::lonmeta::selectbox('language',
Line 892  ENDHEADER Line 916  ENDHEADER
                                     \&Apache::loncommon::languagedescription,                                      \&Apache::loncommon::languagedescription,
                                     ('any',&Apache::loncommon::languageids)                                      ('any',&Apache::loncommon::languageids)
                                     ).'</td></tr>';                                      ).'</td></tr>';
     $scrout .= "</table>\n";      
     #  
     # Dynamic metadata  
     $scrout .= '<h3>'.&mt('Problem Statistics').'</h3>';  
     $scrout .= "<table>\n";  
     $scrout .= '<tr><td>&nbsp;</td><td align="center">'.&mt('Minimum').'</td>'.  
         '<td align="center">'.&mt('Maximum').'</td></tr>'."\n";  
     foreach my $statistic   
         ({ name=>'count',  
            description=>'Network-wide number of accesses (hits)',},  
          { name=>'stdno',  
            description=>  
                'Total number of students who have worked on this problem',},  
          { name => 'avetries',  
            description=>'Average number of tries till solved',},  
          { name => 'difficulty',  
            description=>'Degree of difficulty',},  
          { name => 'disc',  
            description=>'Degree of discrimination'}) {  
         $scrout .= '<tr><td align="right">'.  
             &titlefield(&mt($statistic->{'description'})).  
             '</td><td align="center">'.  
             '<input type="text" name="'.$statistic->{'name'}.'_min" '.  
             'value="" size="6" />'.  
             '</td><td align="center">'.  
             '<input type="text" name="'.$statistic->{'name'}.'_max" '.  
             'value="" size="6" />'.  
             '</td></tr>'.$/;  
     }  
     $scrout .= "</table>\n";      $scrout .= "</table>\n";
     $scrout .= '<h3>'.&mt('Evaluation Data').'</h3>';  
     $scrout .= "<table>\n";      
     $scrout .= '<tr><td>&nbsp;</td><td align="center">'.&mt('Minimum').'</td>'.      if ($env{'form.area'} eq 'portfolio') {
         '<td align="center">'.&mt('Maximum').'</td></tr>'."\n";          # Added fields
     foreach my $evaluation          $scrout .= '<h3>'.&mt('Custom Metadata fields').'</h3>';
         ( { name => 'clear',          $scrout .= "<table>\n";
             description => 'Material presented in clear way'},          $scrout .= '<tr><td>&nbsp;</td><td align="center">'.
           { name =>'depth',                     &mt('Field Name').'</td>'.'<td align="center">'.
             description => 'Material covered with sufficient depth'},                     &mt('Field Value(s)').'</td></tr>'.
           { name => 'helpful',                     '<tr><td>'.&mt('1: ').
             description => 'Material is helpful'},                     '</td><td align="center">'.
           { name => 'correct',                     '<input type="text" name="addedfield_0" size="10" /></td>'.
             description => 'Material appears to be correct'},                     '<td align="center"><input type="text" '.
           { name => 'technical',                     'name="addedvalues_0" size="15" /></td></tr>';
             description => 'Resource is technically correct'}){          for (my $j=1; $j<=$env{'form.numaddedfields'}; $j++) {
         $scrout .= '<tr><td align="right">'.              my $num = $j+1;
             &titlefield(&mt($evaluation->{'description'})).              $scrout .= '<tr><td>'.&mt('Custom metadata [_1]: ',$num).
             '</td><td align="center">'.                         '</td><td align="center">'.
             '<input type="text" name="'.$evaluation->{'name'}.'_min" '.                         '<input type="text" name="addedfield_'.$j.
             'value="" size="6" />'.                         '" size="10" /></td>'.
             '</td><td align="center">'.                         '<td align="center"><input type="text" '.
             '<input type="text" name="'.$evaluation->{'name'}.'_max" '.                         'name="addedvalues_'.$j.'" size="15" /></td></tr>';
             'value="" size="6" />'.          }
             '</td></tr>'.$/;          my $numadded = 1 + $env{'form.numaddedfields'};
           $scrout .= '<tr><td colspan="3">&nbsp;</td></tr>'.
                      '<tr><td align="left" colspan="3">'.
                      '<input type="button" name="newfield" '.
                      'value="Additional custom field/value" '.
                      'onclick="javascript:additional_metadata()" />'.
                      '<input type="hidden" name="numaddedfelds" value="'.
                      $numadded.'" /></td></tr></table>';
       } else {
           #
           # Dynamic metadata
           $scrout .= '<h3>'.&mt('Problem Statistics').'</h3>';
           $scrout .= "<table>\n";
           $scrout .= '<tr><td>&nbsp;</td><td align="center">'.
                      &mt('Minimum').'</td>'.'<td align="center">'.
                      &mt('Maximum').'</td></tr>'."\n";
           foreach my $statistic 
               ({ name=>'count',
                  description=>'Network-wide number of accesses (hits)',},
                { name=>'stdno',
                  description=>
                  'Total number of students who have worked on this problem',},
                { name => 'avetries',
                  description=>'Average number of tries till solved',},
                { name => 'difficulty',
                  description=>'Degree of difficulty',},
                { name => 'disc',
                  description=>'Degree of discrimination'}) {
                 $scrout .= '<tr><td align="right">'.
                            &titlefield(&mt($statistic->{'description'})).
                            '</td><td align="center">'.
                            '<input type="text" name="'.$statistic->{'name'}.
                            '_min" value="" size="6" /></td><td align="center">'.
                            '<input type="text" name="'.$statistic->{'name'}.
                            '_max" value="" size="6" /></td></tr>'.$/;
           }
           $scrout .= "</table>\n";
           $scrout .= '<h3>'.&mt('Evaluation Data').'</h3>';
           $scrout .= "<table>\n";
           $scrout .= '<tr><td>&nbsp;</td><td align="center">'.
                      &mt('Minimum').'</td>'.'<td align="center">'.
                      &mt('Maximum').'</td></tr>'."\n";
           foreach my $evaluation
               ( { name => 'clear',
                   description => 'Material presented in clear way'},
                 { name =>'depth',
                   description => 'Material covered with sufficient depth'},
                 { name => 'helpful',
                   description => 'Material is helpful'},
                 { name => 'correct',
                   description => 'Material appears to be correct'},
                 { name => 'technical',
                   description => 'Resource is technically correct'}){
               $scrout .= '<tr><td align="right">'.
                          &titlefield(&mt($evaluation->{'description'})).
                          '</td><td align="center">'.
                          '<input type="text" name="'.
                          $evaluation->{'name'}.'_min" value="" size="6" />'.
                          '</td><td align="center"><input type="text" name="'.
                          $evaluation->{'name'}.'_max" value="" size="6" />'.
                          '</td></tr>'.$/;
           }
           $scrout .= "</table>\n";
     }      }
     $scrout .= "</table>\n";  
     #      #
     # Creation/Modification date limits      # Creation/Modification date limits
     $scrout .= '<h3>'.&mt('Creation and Modification dates').'</h3>';      $scrout .= '<h3>'.&mt('Creation and Modification dates').'</h3>';
Line 1429  sub parse_advanced_search { Line 1485  sub parse_advanced_search {
             &Apache::loncommon::copyrightdescription($env{'form.copyright'}).              &Apache::loncommon::copyrightdescription($env{'form.copyright'}).
                 "<br />\n";                  "<br />\n";
     }      }
     #      if ($env{'form.area'} eq 'portfolio') {
     # Statistics          #
     foreach my $field (@StatsFields,@EvalFields) {          # Added metadata fields
         my ($min,$max);          for (my $i=0; $i<$env{'form.numaddedfields'} ; $i++) {
         if (exists($env{'form.'.$field.'_min'}) &&               if (($env{'form.addedfield_'.$i} ne '') && 
             $env{'form.'.$field.'_min'} ne '') {                  ($env{'form.addedvalue_'.$i} ne '')) {
             $min = $env{'form.'.$field.'_min'};                  my $stuff = 1; #FIXME 
         }              }
         if (exists($env{'form.'.$field.'_max'}) &&          }
             $env{'form.'.$field.'_max'} ne '') {      } else {
             $max = $env{'form.'.$field.'_max'};          #
         }          # Statistics
         next if (! defined($max) && ! defined($min));          foreach my $field (@StatsFields,@EvalFields) {
         if (defined($min) && defined($max)) {              my ($min,$max);
             ($min,$max) = sort {$a <=>$b} ($min,$max);              if (exists($env{'form.'.$field.'_min'}) && 
         }                  $env{'form.'.$field.'_min'} ne '') {
         if (defined($min) && $min =~ /^(\d+\.\d+|\d+|\.\d+)$/) {                  $min = $env{'form.'.$field.'_min'};
             push(@queries,'('.$field.'>'.$min.')');              }
             $pretty_search_string.=$font.$field.'</font>&gt;'.$min.'<br />';              if (exists($env{'form.'.$field.'_max'}) &&
         }                  $env{'form.'.$field.'_max'} ne '') {
         if (defined($max) && $max =~ /^(\d+\.\d+|\d+|\.\d+)$/) {                  $max = $env{'form.'.$field.'_max'};
             push(@queries,'('.$field.'<'.$max.')');              }
             $pretty_search_string.=$font.$field.'</font>&lt;'.$max.'<br />';              next if (! defined($max) && ! defined($min));
               if (defined($min) && defined($max)) {
                   ($min,$max) = sort {$a <=>$b} ($min,$max);
               }
               if (defined($min) && $min =~ /^(\d+\.\d+|\d+|\.\d+)$/) {
                   push(@queries,'('.$field.'>'.$min.')');
                   $pretty_search_string.=$font.$field.'</font>&gt;'.$min.'<br />';
               }
               if (defined($max) && $max =~ /^(\d+\.\d+|\d+|\.\d+)$/) {
                   push(@queries,'('.$field.'<'.$max.')');
                   $pretty_search_string.=$font.$field.'</font>&lt;'.$max.'<br />';
               }
         }          }
     }      }
     #      #
Line 1596  sub parse_basic_search { Line 1663  sub parse_basic_search {
     }      }
     my $pretty_search_string=$search_string;      my $pretty_search_string=$search_string;
     my @Queries;      my @Queries;
     my $searchfield = 'concat_ws(" ",'.join(',',      my @fields = ('title','author','subject','notes','abstract','keywords');
                                             ('title','author','subject',      my $searchfield;
                                              'notes','abstract','keywords')      if ($env{'form.area'} eq 'portfolio') {
                                             ).')';          $searchfield = 'concat_ws(" ",pm.'.join(',pm.',@fields).')';
       } else {
           $searchfield = 'concat_ws(" ",'.join(',',@fields).')';
       }
     my ($error,$SQLQuery) = &process_phrase_input($search_string,      my ($error,$SQLQuery) = &process_phrase_input($search_string,
                                                     $env{'form.related'},                                                      $env{'form.related'},
                                                     $searchfield);                                                      $searchfield);
Line 1612  sub parse_basic_search { Line 1682  sub parse_basic_search {
     #foreach my $q (@Queries) {      #foreach my $q (@Queries) {
     #    &Apache::lonnet::logthis('    '.$q);      #    &Apache::lonnet::logthis('    '.$q);
     #}      #}
     my $final_query = 'SELECT * FROM metadata WHERE '.join(" AND ",@Queries);      my $final_query;
       if ($env{'form.area'} eq 'portfolio') {
           $final_query = 'SELECT pm.*,pa.keynum,pa.scope FROM portfolio_metadata pm, portfolio_access pa  WHERE (pm.url = pa.url AND (pa.start < NOW() AND (pa.end IS NULL OR pa.end > NOW())) AND '.join(" AND ",@Queries).')';
       } else {
           $final_query = 'SELECT * FROM metadata WHERE '.join(" AND ",@Queries);
       }
     #      #
     if ($env{'form.related'}) {      if ($env{'form.related'}) {
  $pretty_search_string.=' '.&mt('(including related words)');   $pretty_search_string.=' '.&mt('(including related words)');
Line 1622  sub parse_basic_search { Line 1697  sub parse_basic_search {
     }      }
     $pretty_search_string .= "<br />\n";      $pretty_search_string .= "<br />\n";
     $pretty_search_string =~ s:^<br /> and ::;      $pretty_search_string =~ s:^<br /> and ::;
     #&Apache::lonnet::logthis('simple search final query = '.$/.$final_query);      &Apache::lonnet::logthis('simple search final query = '.$/.$final_query);
     return ($final_query,$pretty_search_string,      return ($final_query,$pretty_search_string,
             $libraries_to_query);              $libraries_to_query);
 }  }
Line 2176  my @Fullindicies; Line 2251  my @Fullindicies;
 Creates the table of search results by calling lonmysql.  Stores the  Creates the table of search results by calling lonmysql.  Stores the
 table id in $env{'form.table'}  table id in $env{'form.table'}
   
 Inputs: none.  Inputs: search area - either res or portfolio 
   
 Returns: the identifier of the table on success, undef on error.  Returns: the identifier of the table on success, undef on error.
   
Line 2185  Returns: the identifier of the table on Line 2260  Returns: the identifier of the table on
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub set_up_table_structure {  sub set_up_table_structure {
       my ($tabletype) = @_;
     my ($datatypes,$fullindicies) =       my ($datatypes,$fullindicies) = 
         &LONCAPA::lonmetadata::describe_metadata_storage();          &LONCAPA::lonmetadata::describe_metadata_storage($tabletype);
     # Copy the table description before modifying it...      # Copy the table description before modifying it...
     @Datatypes = @{$datatypes};      @Datatypes = @{$datatypes};
     unshift(@Datatypes,{name => 'id',        unshift(@Datatypes,{name => 'id',  
Line 2199  sub set_up_table_structure { Line 2275  sub set_up_table_structure {
 }  }
   
 sub create_results_table {  sub create_results_table {
     &set_up_table_structure();      my ($area) = @_;
       if ($area eq 'portfolio') {
           &set_up_table_structure('portfolio_search');
       } else {
           &set_up_table_structure('metadata');
       }
     my $table = &Apache::lonmysql::create_table      my $table = &Apache::lonmysql::create_table
         ( { columns => \@Datatypes,          ( { columns => \@Datatypes,
             FULLTEXT => [{'columns' => \@Fullindicies},],              FULLTEXT => [{'columns' => \@Fullindicies},],
Line 2331  results into MySQL. Line 2412  results into MySQL.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub run_search {  sub run_search {
     my ($r,$query,$customquery,$customshow,$serverlist,$pretty_string) = @_;      my ($r,$query,$customquery,$customshow,$serverlist,
           $pretty_string,$area) = @_;
       my $tabletype = 'metadata';
       if ($area eq 'portfolio') {
           $tabletype = 'portfolio_search';
       }
     my $connection = $r->connection;      my $connection = $r->connection;
     #      #
     # Print run_search header      # Print run_search header
Line 2407  END Line 2492  END
     ##      ##
     ## Prepare for the big loop.      ## Prepare for the big loop.
     my $hitcountsum;      my $hitcountsum;
       my %matches;
     my $server;       my $server; 
     my $status;      my $status;
     my $revise = &revise_button();      my $revise = &revise_button();
Line 2461  END Line 2547  END
                 delete ($Server_status{$server});                  delete ($Server_status{$server});
                 next;                  next;
             }              }
             $status=~s|/||g;               $status=~s|/||g;
            my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$status;             my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$status;
             if (-e $datafile && ! -e "$datafile.end") {              if (-e $datafile && ! -e "$datafile.end") {
                 &update_status($r,&mt('Receiving results from [_1]',$server));                  &update_status($r,&mt('Receiving results from [_1]',$server));
Line 2490  END Line 2576  END
                     next if (! $result);                      next if (! $result);
                     #                      #
                     # Parse the result.                      # Parse the result.
                     my %Fields = &parse_raw_result($result,$server);                      my %Fields = &parse_raw_result($result,$server,$tabletype);
                     $Fields{'hostname'} = $server;                      $Fields{'hostname'} = $server;
                     #                      #
                     # Skip if external and we did not want that                      # Skip if external and we did not want that
Line 2498  END Line 2584  END
                     # Skip based on copyright                      # Skip based on copyright
                     next if (! &copyright_check(\%Fields));                      next if (! &copyright_check(\%Fields));
   
                       if ($area eq 'portfolio') {
                           next if (defined($matches{$Fields{'url'}}));
                           # Skip if inaccessible
                           next if (!&Apache::lonnet::portfolio_access($Fields{'url'}));
                           $matches{$Fields{'url'}} = 1; 
                       }
                     #                      #
                     # Store the result in the mysql database                      # Store the result in the mysql database
                     my $result = &Apache::lonmysql::store_row($table,\%Fields);                      my $result = &Apache::lonmysql::store_row($table,\%Fields);
Line 2584  Prints the results out for selection and Line 2676  Prints the results out for selection and
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub display_results {  sub display_results {
     my ($r,$importbutton,$closebutton,$diropendb) = @_;      my ($r,$importbutton,$closebutton,$diropendb,$area) = @_;
     my $connection = $r->connection;      my $connection = $r->connection;
     $r->print(&search_results_header($importbutton,$closebutton));      $r->print(&search_results_header($importbutton,$closebutton));
     ##      ##
Line 2654  sub display_results { Line 2746  sub display_results {
     $r->print(&hidden_field('table').      $r->print(&hidden_field('table').
               &hidden_field('phase').                &hidden_field('phase').
               &hidden_field('persistent_db_id').                &hidden_field('persistent_db_id').
               &hidden_field('start')                &hidden_field('start').
                 &hidden_field('area')
               );                );
     #      #
     # Build sorting selector      # Build sorting selector
Line 2675  sub display_results { Line 2768  sub display_results {
          {key =>'lowestgradelevel'},           {key =>'lowestgradelevel'},
          {key =>'highestgradelevel'},           {key =>'highestgradelevel'},
          {key =>'standards',desc=>'Standards'},           {key =>'standards',desc=>'Standards'},
           );
       if ($area eq 'portfolio') {
           push(@fields,
          (
            {key => 'scope'},
            {key => 'keynum'},
          ));
       } else {
           push(@fields,
          (
          {key =>'count',desc=>'Number of accesses'},           {key =>'count',desc=>'Number of accesses'},
          {key =>'stdno',desc=>'Students Attempting'},           {key =>'stdno',desc=>'Students Attempting'},
          {key =>'avetries',desc=>'Average Number of Tries'},           {key =>'avetries',desc=>'Average Number of Tries'},
Line 2685  sub display_results { Line 2788  sub display_results {
          {key =>'correct',desc=>'Evaluation: Material is Correct'},           {key =>'correct',desc=>'Evaluation: Material is Correct'},
          {key =>'helpful',desc=>'Evaluation: Material is Helpful'},           {key =>'helpful',desc=>'Evaluation: Material is Helpful'},
          {key =>'depth',desc=>'Evaluation: Material has Depth'},           {key =>'depth',desc=>'Evaluation: Material has Depth'},
          );         ));
       }
     my %fieldnames = &Apache::lonmeta::fieldnames();      my %fieldnames = &Apache::lonmeta::fieldnames();
     my @field_order;      my @field_order;
     foreach my $field_data (@fields) {      foreach my $field_data (@fields) {
Line 2702  sub display_results { Line 2806  sub display_results {
     my %sort_fields = map {$_->{'key'},$_->{'desc'}} @fields;      my %sort_fields = map {$_->{'key'},$_->{'desc'}} @fields;
     $sort_fields{'select_form_order'} = \@field_order;      $sort_fields{'select_form_order'} = \@field_order;
     $env{'form.sortorder'} = 'desc' if (! exists($env{'form.sortorder'}));      $env{'form.sortorder'} = 'desc' if (! exists($env{'form.sortorder'}));
     $env{'form.sortfield'} = 'count' if (! exists($env{'form.sortfield'}));      if (! exists($env{'form.sortfield'})) {
           if ($area eq 'portfolio') {
               $env{'form.sortfield'} = 'owner';
           } else {
               $env{'form.sortfield'} = 'count';
           }
       }
     if (! exists($env{'form.sortorder'})) {      if (! exists($env{'form.sortorder'})) {
  if ($env{'form.sortfield'}=~/^(count|stdno|disc|clear|technical|correct|helpful)$/) {   if ($env{'form.sortfield'}=~/^(count|stdno|disc|clear|technical|correct|helpful)$/) {
     $env{'form.sortorder'}='desc';      $env{'form.sortorder'}='desc';
Line 2766  sub display_results { Line 2876  sub display_results {
     my @Results = &Apache::lonmysql::get_rows($table,$sort_command);      my @Results = &Apache::lonmysql::get_rows($table,$sort_command);
     ##      ##
     ## Loop through the results and output them.      ## Loop through the results and output them.
       my $tabletype = 'metadata';
       if ($area eq 'portfolio') {
           $tabletype = 'portfolio_search';
       }
     foreach my $row (@Results) {      foreach my $row (@Results) {
         if ($connection->aborted()) {          if ($connection->aborted()) {
             &cleanup();              &cleanup();
             return;              return;
         }          }
         my %Fields = %{&parse_row(@$row)};          my %Fields = %{&parse_row($tabletype,@$row)};
         my $output="<p>\n";          my $output="<p>\n";
         if (! defined($Fields{'title'}) || $Fields{'title'} eq '') {          if (! defined($Fields{'title'}) || $Fields{'title'} eq '') {
             $Fields{'title'} = 'Untitled';              $Fields{'title'} = 'Untitled';
Line 2855  Parse a row returned from the database. Line 2969  Parse a row returned from the database.
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub parse_row {  sub parse_row {
     my @Row = @_;      my ($tabletype,@Row) = @_;
     my %Fields;      my %Fields;
     if (! scalar(@Datatypes)) {      if (! scalar(@Datatypes)) {
         &set_up_table_structure();          &set_up_table_structure($tabletype);
     }      }
     for (my $i=0;$i<=$#Row;$i++) {      for (my $i=0;$i<=$#Row;$i++) {
         $Fields{$Datatypes[$i]->{'name'}}=&unescape($Row[$i]);          $Fields{$Datatypes[$i]->{'name'}}=&unescape($Row[$i]);
Line 2894  The 'title' field is set to "Untitled" i Line 3008  The 'title' field is set to "Untitled" i
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 sub parse_raw_result {  sub parse_raw_result {
     my ($result,$hostname) = @_;      my ($result,$hostname,$tabletype) = @_;
     # conclude from self to others regarding fields      # conclude from self to others regarding fields
     my %Fields=&LONCAPA::lonmetadata::metadata_col_to_hash      my %Fields=&LONCAPA::lonmetadata::metadata_col_to_hash
         (map {          ($tabletype,
            map {
             &unescape($_);              &unescape($_);
         } (split(/\,/,$result)) );           } (split(/\,/,$result)) );
     return %Fields;      return %Fields;
 }  }
   

Removed from v.1.275  
changed lines
  Added in v.1.276


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