version 1.122, 2004/03/07 21:42:19
|
version 1.126, 2004/03/22 17:25:26
|
Line 1867 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, $starttime, $endtime |
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 1930 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 a.student_id,a.solved,a.award,a.awarded,a.tries '. |
'SELECT a.student_id,a.solved,a.award,a.awarded,a.tries '. |
'FROM '.$performance_table.' AS a '; |
'FROM '.$performance_table.' AS a '; |
|
# |
|
# See if we need to include some requirements on the students |
if ((defined($Sections) && lc($Sections->[0]) ne 'all') || |
if ((defined($Sections) && lc($Sections->[0]) ne 'all') || |
(defined($status) && lc($status) ne 'any')) { |
(defined($status) && lc($status) ne 'any')) { |
$request .= 'NATURAL LEFT JOIN '.$student_table.' AS b '; |
$request .= 'NATURAL LEFT JOIN '.$student_table.' AS b '; |
} |
} |
$request .= ' WHERE a.symb_id='.$symb_id.' AND a.part_id='.$part_id; |
$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') { |
if (defined($Sections) && lc($Sections->[0]) ne 'all') { |
$request .= ' AND ('. |
$request .= ' AND ('. |
join(' OR ', map { "b.section='".$_."'" } @$Sections |
join(' OR ', map { "b.section='".$_."'" } @$Sections |
Line 1949 sub get_problem_statistics {
|
Line 1956 sub get_problem_statistics {
|
$request .= " AND b.status='".$status."'"; |
$request .= " AND b.status='".$status."'"; |
} |
} |
# |
# |
&Apache::lonnet::logthis('starttime = '.$starttime); |
# Limit by starttime and endtime |
my $time_requirements = undef; |
my $time_requirements = undef; |
if (defined($starttime)) { |
if (defined($starttime)) { |
$time_requirements .= 'a.timestamp>='.$starttime; |
$time_requirements .= 'a.timestamp>='.$starttime; |
Line 1962 sub get_problem_statistics {
|
Line 1969 sub get_problem_statistics {
|
if (defined($time_requirements)) { |
if (defined($time_requirements)) { |
$request .= ' AND '.$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 1986 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 1998 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 2042 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 2081 sub RD_tries { return 5; }
|
Line 2087 sub RD_tries { return 5; }
|
sub RD_sname { return 6; } |
sub RD_sname { return 6; } |
|
|
sub get_response_data { |
sub get_response_data { |
my ($students,$symb,$response,$courseid) = @_; |
my ($Sections,$enrollment,$symb,$response,$courseid) = @_; |
return undef if (! defined($symb) || |
return undef if (! defined($symb) || |
! defined($response)); |
! defined($response)); |
$courseid = $ENV{'request.course.id'} if (! defined($courseid)); |
$courseid = $ENV{'request.course.id'} if (! defined($courseid)); |
Line 2092 sub get_response_data {
|
Line 2098 sub get_response_data {
|
# |
# |
my $dbh = &Apache::lonmysql::get_dbh(); |
my $dbh = &Apache::lonmysql::get_dbh(); |
return undef if (! defined($dbh)); |
return undef if (! defined($dbh)); |
|
# |
|
my $student_requirements; |
|
if ( (defined($Sections) && $Sections->[0] ne 'all')) { |
|
$student_requirements = '('. |
|
join(' OR ', map { "d.section='".$_."'" } @$Sections |
|
).')'; |
|
} |
|
# |
|
my $enrollment_requirements=undef; |
|
if (defined($enrollment) && $enrollment ne 'Any') { |
|
$enrollment_requirements = "d.status='".$enrollment."'"; |
|
} |
my $request = 'SELECT '. |
my $request = 'SELECT '. |
'a.student_id, a.awarddetail, a.response_specific_value, '. |
'a.student_id, a.awarddetail, a.response_specific_value, '. |
'a.submission, b.timestamp, c.tries, d.student '. |
'a.submission, b.timestamp, c.tries, d.student '. |
Line 2106 sub get_response_data {
|
Line 2124 sub get_response_data {
|
'ON a.student_id=d.student_id '. |
'ON a.student_id=d.student_id '. |
'WHERE '. |
'WHERE '. |
'a.symb_id='.$symb_id.' AND a.response_id='.$response_id; |
'a.symb_id='.$symb_id.' AND a.response_id='.$response_id; |
if (defined($students)) { |
if (defined($student_requirements) || defined($enrollment_requirements)) { |
$request .= ' AND ('. |
$request .= ' AND '; |
join(' OR ', map {'a.student_id='. |
if (defined($student_requirements)) { |
&get_student_id($_->{'username'}, |
$request .= $student_requirements.' AND '; |
$_->{'domain'}) |
} |
} @$students |
if (defined($enrollment_requirements)) { |
).')'; |
$request .= $enrollment_requirements.' AND '; |
|
} |
|
$request =~ s/( AND )$//; |
} |
} |
$request .= ' ORDER BY b.timestamp'; |
$request .= ' ORDER BY b.timestamp'; |
# &Apache::lonnet::logthis("request =\n".$request); |
# &Apache::lonnet::logthis("request =\n".$request); |
Line 2171 sub get_response_data_by_student {
|
Line 2191 sub get_response_data_by_student {
|
'WHERE '. |
'WHERE '. |
'a.symb_id='.$symb_id.' AND a.response_id='.$response_id. |
'a.symb_id='.$symb_id.' AND a.response_id='.$response_id. |
' AND a.student_id='.$student_id.' ORDER BY b.timestamp'; |
' AND a.student_id='.$student_id.' ORDER BY b.timestamp'; |
# &Apache::lonnet::logthis("request =\n".$request); |
# &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) { |