Diff for /loncom/interface/loncoursedata.pm between versions 1.113 and 1.125

version 1.113, 2004/02/02 19:50:33 version 1.125, 2004/03/16 15:54:09
Line 182  sub get_sequence_assessment_data { Line 182  sub get_sequence_assessment_data {
             next;              next;
         }          }
         next if (! ref($curRes));          next if (! ref($curRes));
         next if (! $curRes->is_problem());# && !$curRes->randomout);          next if (! $curRes->is_problem() && $curRes->src() !~ /\.survey$/);
         # Okay, from here on out we only deal with assessments          # Okay, from here on out we only deal with assessments
         $title = $curRes->title();          $title = $curRes->title();
         $title =~ s/\:/\&\#058;/g;          $title =~ s/\:/\&\#058;/g;
Line 1235  sub update_full_student_data { Line 1235  sub update_full_student_data {
                     # However, there is one wrinkle: submissions which end in                      # However, there is one wrinkle: submissions which end in
                     # and odd number of '\' cause insert errors to occur.                        # and odd number of '\' cause insert errors to occur.  
                     # Best trap this somehow...                      # Best trap this somehow...
                     $value =~ s/\'/\\\'/g;                      $value = $dbh->quote($value);
                     my ($offensive_string) = ($value =~ /(\\+)$/);  
                     if (length($offensive_string) % 2) {  
                         $value =~ s/\\$/\\\\/;  
                     }  
                 }                  }
                 if ($field eq 'submissiongrading' ||                   if ($field eq 'submissiongrading' || 
                     $field eq 'molecule') {                      $field eq 'molecule') {
Line 1871  populated and all local caching variable Line 1867  populated and all local caching variable
 properly.  This means you need to call &ensure_current_data for  properly.  This means you need to call &ensure_current_data for
 the students you are concerned with prior to calling this routine.  the students you are concerned with prior to calling this routine.
   
 Inputs: $students, $symb, $part, $courseid  Inputs: $Sections, $status, $symb, $part, $courseid, $starttime, $endtime
   
 =over 4  =over 4
   
 =item $students is an array of hash references.    =item $Sections Array ref containing section names for students.  
 Each hash must contain at least the 'username' and 'domain' of a student.  'all' is allowed to be the first (and only) item in the array.
   
   =item $status String describing the status of students
   
 =item $symb is the symb for the problem.  =item $symb is the symb for the problem.
   
Line 1884  Each hash must contain at least the 'use Line 1882  Each hash must contain at least the 'use
   
 =item $courseid is the course id, of course!  =item $courseid is the course id, of course!
   
   =item $starttime and $endtime are unix times which to use to limit
   the statistical data.
   
 =back  =back
   
 Outputs: See the code for up to date information.  A hash reference is  Outputs: See the code for up to date information.  A hash reference is
Line 1919  able to answer it correctly. Line 1920  able to answer it correctly.
 ################################################  ################################################
 ################################################  ################################################
 sub get_problem_statistics {  sub get_problem_statistics {
     my ($students,$symb,$part,$courseid) = @_;      my ($Sections,$status,$symb,$part,$courseid,$starttime,$endtime) = @_;
     return if (! defined($symb) || ! defined($part));      return if (! defined($symb) || ! defined($part));
     $courseid = $ENV{'request.course.id'} if (! defined($courseid));      $courseid = $ENV{'request.course.id'} if (! defined($courseid));
     #      #
Line 1931  sub get_problem_statistics { Line 1932  sub get_problem_statistics {
     my $dbh = &Apache::lonmysql::get_dbh();      my $dbh = &Apache::lonmysql::get_dbh();
     return undef if (! defined($dbh));      return undef if (! defined($dbh));
     #      #
       # Clean out the table
     $dbh->do('DROP TABLE '.$stats_table);  # May return an error      $dbh->do('DROP TABLE '.$stats_table);  # May return an error
     my $request =       my $request = 
         'CREATE TEMPORARY TABLE '.$stats_table.          'CREATE TEMPORARY TABLE '.$stats_table.' '.
             ' SELECT student_id,solved,award,awarded,tries FROM '.$performance_table.          'SELECT a.student_id,a.solved,a.award,a.awarded,a.tries '.
                 ' WHERE symb_id='.$symb_id.' AND part_id='.$part_id;          'FROM '.$performance_table.' AS a ';
     if (defined($students)) {      #
       # See if we need to include some requirements on the students
       if ((defined($Sections) && lc($Sections->[0]) ne 'all') || 
           (defined($status)   && lc($status)        ne 'any')) {
           $request .= 'NATURAL LEFT JOIN '.$student_table.' AS b ';
       }
       $request .= ' WHERE a.symb_id='.$symb_id.' AND a.part_id='.$part_id;
       #
       # Limit the students included to those specified
       if (defined($Sections) && lc($Sections->[0]) ne 'all') {
         $request .= ' AND ('.          $request .= ' AND ('.
             join(' OR ', map {'student_id='.              join(' OR ', map { "b.section='".$_."'" } @$Sections
                                   &get_student_id($_->{'username'},  
                                                   $_->{'domain'})  
                                   } @$students  
                  ).')';                   ).')';
     }      }
 #    &Apache::lonnet::logthis($request);      if (defined($status) && lc($status) ne 'any') {
           $request .= " AND b.status='".$status."'";
       }
       #
       # Limit by starttime and endtime
       my $time_requirements = undef;
       if (defined($starttime)) {
           $time_requirements .= 'a.timestamp>='.$starttime;
           if (defined($endtime)) {
               $time_requirements .= ' AND a.timestamp<='.$endtime;
           }
       } elsif (defined($endtime)) {
           $time_requirements .= 'a.timestamp<='.$endtime;
       }
       if (defined($time_requirements)) {
           $request .= ' AND '.$time_requirements;
       }
       #
       # Finally, execute the request to create the temporary table
     $dbh->do($request);      $dbh->do($request);
 #    &Apache::lonnet::logthis('request = '.$/.$request);      #
       # Collect the first suite of statistics
     $request = 'SELECT COUNT(*),SUM(tries),MAX(tries),AVG(tries),STD(tries) '.      $request = 'SELECT COUNT(*),SUM(tries),MAX(tries),AVG(tries),STD(tries) '.
         'FROM '.$stats_table;          'FROM '.$stats_table;
     my ($num,$tries,$mod,$mean,$STD) = &execute_SQL_request      my ($num,$tries,$mod,$mean,$STD) = &execute_SQL_request
         ($dbh,$request);          ($dbh,$request);
 #    &Apache::lonnet::logthis('request = '.$/.$request);  
     $request = 'SELECT SUM(awarded) FROM '.$stats_table;      $request = 'SELECT SUM(awarded) FROM '.$stats_table;
     my ($Solved) = &execute_SQL_request($dbh,$request);      my ($Solved) = &execute_SQL_request($dbh,$request);
 #    &Apache::lonnet::logthis('request = '.$/.$request);  
     $request = 'SELECT SUM(awarded) FROM '.$stats_table.      $request = 'SELECT SUM(awarded) FROM '.$stats_table.
         " WHERE solved='correct_by_override'";          " WHERE solved='correct_by_override'";
 #    &Apache::lonnet::logthis('request = '.$/.$request);  
     my ($solved) = &execute_SQL_request($dbh,$request);      my ($solved) = &execute_SQL_request($dbh,$request);
 #    $Solved = int($Solved);  
 #    $solved = int($solved);  
     #      #
     $num    = 0 if (! defined($num));      $num    = 0 if (! defined($num));
     $tries  = 0 if (! defined($tries));      $tries  = 0 if (! defined($tries));
Line 1969  sub get_problem_statistics { Line 1991  sub get_problem_statistics {
     $Solved = 0 if (! defined($Solved));      $Solved = 0 if (! defined($Solved));
     $solved = 0 if (! defined($solved));      $solved = 0 if (! defined($solved));
     #      #
       # Compute the more complicated statistics
     my $DegOfDiff = 'nan';      my $DegOfDiff = 'nan';
     $DegOfDiff = 1-($Solved)/$tries if ($tries>0);      $DegOfDiff = 1-($Solved)/$tries if ($tries>0);
       #
     my $SKEW = 'nan';      my $SKEW = 'nan';
     my $wrongpercent = 0;      my $wrongpercent = 0;
     if ($num > 0) {      if ($num > 0) {
Line 1981  sub get_problem_statistics { Line 2004  sub get_problem_statistics {
         $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;          $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
     }      }
     #      #
 #    $dbh->do('DROP TABLE '.$stats_table);  # May return an error      # Drop the temporary table
       $dbh->do('DROP TABLE '.$stats_table);  # May return an error
     #      #
     # Store in metadata      # Store in metadata
     #  
     if ($num) {      if ($num) {
  my %storestats=();   my %storestats=();
           #
         my $urlres=(&Apache::lonnet::decode_symb($symb))[2];          my $urlres=(&Apache::lonnet::decode_symb($symb))[2];
           #
  $storestats{$courseid.'___'.$urlres.'___timestamp'}=time;          $storestats{$courseid.'___'.$urlres.'___timestamp'}=time;       
  $storestats{$courseid.'___'.$urlres.'___stdno'}=$num;   $storestats{$courseid.'___'.$urlres.'___stdno'}=$num;
  $storestats{$courseid.'___'.$urlres.'___avetries'}=$mean;      $storestats{$courseid.'___'.$urlres.'___avetries'}=$mean;   
  $storestats{$courseid.'___'.$urlres.'___difficulty'}=$DegOfDiff;   $storestats{$courseid.'___'.$urlres.'___difficulty'}=$DegOfDiff;
           #
  $urlres=~/^(\w+)\/(\w+)/;    $urlres=~/^(\w+)\/(\w+)/; 
  &Apache::lonnet::put('nohist_resevaldata',\%storestats,$1,$2);    &Apache::lonnet::put('nohist_resevaldata',\%storestats,$1,$2); 
     }      }
     #      #
     # Return result      # Return result
     #  
     return { num_students => $num,      return { num_students => $num,
              tries        => $tries,               tries        => $tries,
              max_tries    => $mod,               max_tries    => $mod,
Line 2025  sub execute_SQL_request { Line 2047  sub execute_SQL_request {
     return ();      return ();
 }  }
   
   
 sub get_student_data {  sub get_student_data {
     my ($students,$courseid) = @_;      my ($students,$courseid) = @_;
     $courseid = $ENV{'request.course.id'} if (! defined($courseid));      $courseid = $ENV{'request.course.id'} if (! defined($courseid));
Line 2107  sub get_response_data { Line 2130  sub get_response_data {
     }      }
     my $dataset = $sth->fetchall_arrayref();      my $dataset = $sth->fetchall_arrayref();
     if (ref($dataset) eq 'ARRAY' && scalar(@$dataset)>0) {      if (ref($dataset) eq 'ARRAY' && scalar(@$dataset)>0) {
           # Clear the \'s from around the submission
           for (my $i =0;$i<scalar(@$dataset);$i++) {
               $dataset->[$i]->[3] =~ s/(\'$|^\')//g;
           }
         return $dataset;          return $dataset;
     }      }
 }  }
   
   
   sub RDs_awarddetail   { return 3; }
   sub RDs_submission    { return 2; }
   sub RDs_timestamp     { return 1; }
   sub RDs_tries         { return 0; }
   sub RDs_awarded       { return 4; }
   
   sub get_response_data_by_student {
       my ($student,$symb,$response,$courseid) = @_;
       return undef if (! defined($symb) || 
                        ! defined($response));
       $courseid = $ENV{'request.course.id'} if (! defined($courseid));
       #
       &setup_table_names($courseid);
       my $symb_id = &get_symb_id($symb);
       my $response_id = &get_part_id($response);
       #
       my $student_id = &get_student_id($student->{'username'},
                                        $student->{'domain'});
       #
       my $dbh = &Apache::lonmysql::get_dbh();
       return undef if (! defined($dbh));
       my $request = 'SELECT '.
           'c.tries, b.timestamp, a.submission, a.awarddetail, e.awarded '.
           'FROM '.$fulldump_response_table.' AS a '.
           'LEFT JOIN '.$fulldump_timestamp_table.' AS b '.
           'ON a.symb_id=b.symb_id AND a.student_id=b.student_id AND '.
           'a.transaction = b.transaction '.
           'LEFT JOIN '.$fulldump_part_table.' AS c '.
           'ON a.symb_id=c.symb_id AND a.student_id=c.student_id AND '.        
           'a.part_id=c.part_id AND a.transaction = c.transaction '.
           'LEFT JOIN '.$student_table.' AS d '.
           'ON a.student_id=d.student_id '.
           'LEFT JOIN '.$performance_table.' AS e '.
           'ON a.symb_id=e.symb_id AND a.part_id=e.part_id AND '.
           'a.student_id=e.student_id AND c.tries=e.tries '.
           'WHERE '.
           'a.symb_id='.$symb_id.' AND a.response_id='.$response_id.
           ' AND a.student_id='.$student_id.' ORDER BY b.timestamp';
   #    &Apache::lonnet::logthis("request =\n".$request);
       my $sth = $dbh->prepare($request);
       $sth->execute();
       if ($dbh->err) {
           &Apache::lonnet::logthis('error = '.$dbh->errstr());
           return undef;
       }
       my $dataset = $sth->fetchall_arrayref();
       if (ref($dataset) eq 'ARRAY' && scalar(@$dataset)>0) {
           # Clear the \'s from around the submission
           for (my $i =0;$i<scalar(@$dataset);$i++) {
               $dataset->[$i]->[2] =~ s/(\'$|^\')//g;
           }
           return $dataset;
       }
       return undef; # error occurred
   }
   
 sub RT_student_id { return 0; }  sub RT_student_id { return 0; }
 sub RT_awarded    { return 1; }  sub RT_awarded    { return 1; }
 sub RT_tries      { return 2; }  sub RT_tries      { return 2; }
Line 2164  sub get_response_time_data { Line 2248  sub get_response_time_data {
   
 =pod  =pod
   
 =item &get_student_scores($Students,$Symbs,$courseid)  =item &get_student_scores($Sections,$Symbs,$enrollment,$courseid)
   
 =cut  =cut
   
 ################################################  ################################################
 ################################################  ################################################
 sub get_student_scores {  sub get_student_scores {
     my ($Students,$Symbs,$courseid) = @_;      my ($Sections,$Symbs,$enrollment,$courseid,$starttime,$endtime) = @_;
     $courseid = $ENV{'request.course.id'} if (! defined($courseid));      $courseid = $ENV{'request.course.id'} if (! defined($courseid));
     &setup_table_names($courseid);      &setup_table_names($courseid);
     my $dbh = &Apache::lonmysql::get_dbh();      my $dbh = &Apache::lonmysql::get_dbh();
     return (undef) if (! defined($dbh));      return (undef) if (! defined($dbh));
     my $tmptable = $courseid.'_temp_'.time;      my $tmptable = $courseid.'_temp_'.time;
     my ($symb_requirements,$student_requirements);      #
       my $symb_requirements;
     if (defined($Symbs)  && @$Symbs) {      if (defined($Symbs)  && @$Symbs) {
         $symb_requirements = '('.          $symb_requirements = '('.
             join(' OR ', map{ "(symb_id='".&get_symb_id($_->{'symb'}).              join(' OR ', map{ "(a.symb_id='".&get_symb_id($_->{'symb'}).
                                   "' AND part_id='".&get_part_id($_->{'part'}).                                "' AND a.part_id='".&get_part_id($_->{'part'}).
                                   "')"                                "')"
                               } @$Symbs).')';                                } @$Symbs).')';
     }      }
     if (defined($Students)) {      #
       my $student_requirements;
       if ( (defined($Sections) && $Sections->[0] ne 'all')) {
         $student_requirements = '('.          $student_requirements = '('.
             join(' OR ', map {'student_id='.              join(' OR ', map { "b.section='".$_."'" } @$Sections
                                   &get_student_id($_->{'username'},  
                                                   $_->{'domain'})  
                               } @$Students  
                  ).')';                   ).')';
     }      }
       #
       my $enrollment_requirements=undef;
       if (defined($enrollment) && $enrollment ne 'Any') {
           $enrollment_requirements = "b.status='".$enrollment."'";
       }
       #
       my $time_requirements = undef;
       if (defined($starttime)) {
           $time_requirements .= "a.timestamp>='".$starttime."'";
           if (defined($endtime)) {
               $time_requirements .= " AND a.timestamp<='".$endtime."'";
           }
       } elsif (defined($endtime)) {
           $time_requirements .= "a.timestamp<='".$endtime."'";
       }
       ##
       ##
     my $request = 'CREATE TEMPORARY TABLE IF NOT EXISTS '.$tmptable.      my $request = 'CREATE TEMPORARY TABLE IF NOT EXISTS '.$tmptable.
         ' SELECT student_id,SUM(awarded) AS score FROM '.$performance_table;          ' SELECT a.student_id,SUM(a.awarded) AS score FROM '.
     if (defined($symb_requirements) || defined($student_requirements)) {          $performance_table.' AS a ';
       if (defined($student_requirements) || defined($enrollment_requirements)) {
           $request .= ' NATURAL LEFT JOIN '.$student_table.' AS b ';
       }
       if (defined($symb_requirements)      || 
           defined($student_requirements)   ||
           defined($enrollment_requirements) ) {
         $request .= ' WHERE ';          $request .= ' WHERE ';
         if (defined($symb_requirements)) {  
             $request .= $symb_requirements;  
             if (defined($student_requirements)) {  
                 $request .= ' AND '.$student_requirements;  
             }  
         } elsif (defined($student_requirements)) {  
             $request .= $student_requirements;  
         }  
     }      }
     $request .= ' GROUP BY student_id';      if (defined($symb_requirements)) {
     &Apache::lonnet::logthis("request = \n".$request);          $request .= $symb_requirements.' AND ';
       }
       if (defined($student_requirements)) {
           $request .= $student_requirements.' AND ';
       }
       if (defined($enrollment_requirements)) {
           $request .= $enrollment_requirements.' AND ';
       }
       if (defined($time_requirements)) {
           $request .= $time_requirements.' AND ';
       }
       $request =~ s/ AND $//; # Strip of the trailing ' AND '.
       $request .= ' GROUP BY a.student_id';
   #    &Apache::lonnet::logthis("request = \n".$request);
     my $sth = $dbh->prepare($request);      my $sth = $dbh->prepare($request);
     $sth->execute();      $sth->execute();
     if ($dbh->err) {      if ($dbh->err) {

Removed from v.1.113  
changed lines
  Added in v.1.125


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