[LON-CAPA-cvs] cvs: loncom /interface loncoursedata.pm /interface/statistics lonproblemstatistics.pm

bowersj2 lon-capa-cvs@mail.lon-capa.org
Sun, 05 Feb 2006 19:10:31 -0000


bowersj2		Sun Feb  5 14:10:31 2006 EDT

  Modified files:              
    /loncom/interface	loncoursedata.pm 
    /loncom/interface/statistics	lonproblemstatistics.pm 
  Log:
  Fix bug 4537; degree of discrimation should be much more useful and
  accurate now.
  
  
Index: loncom/interface/loncoursedata.pm
diff -u loncom/interface/loncoursedata.pm:1.153 loncom/interface/loncoursedata.pm:1.154
--- loncom/interface/loncoursedata.pm:1.153	Sun Feb  5 13:49:47 2006
+++ loncom/interface/loncoursedata.pm	Sun Feb  5 14:10:19 2006
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: loncoursedata.pm,v 1.153 2006/02/05 18:49:47 albertel Exp $
+# $Id: loncoursedata.pm,v 1.154 2006/02/05 19:10:19 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2033,9 +2033,17 @@
     $Sections: array ref of sections to include,
     $enrollment: string,
     $courseid (may be omitted)
+    $starttime (may be omitted)
+    $endtime (may be omitted)
+    $has_award_for (may be omitted)
 
 Returns; An array of arrays.  The sub arrays contain a student name and
-their score on the resources.
+their score on the resources. $starttime and $endtime constrain the
+list to awards obtained during the given time limits. $has_score_on
+constrains the list to those students who at least attempted the
+resource identified by the given symb, which is used to filter out
+such students for statistics that would be adversely affected by such
+students. 
 
 =cut
 
@@ -2045,7 +2053,7 @@
 sub RNK_score   { return 1; };
 
 sub rank_students_by_scores_on_resources {
-    my ($resources,$Sections,$enrollment,$courseid,$starttime,$endtime) = @_;
+    my ($resources,$Sections,$enrollment,$courseid,$starttime,$endtime,$has_award_for) = @_;
     return if (! defined($resources) || ! ref($resources) eq 'ARRAY');
     if (! defined($courseid)) {
         $courseid = $env{'request.course.id'};
@@ -2058,12 +2066,21 @@
     my $symb_limits = '('.join(' OR ',map {'a.symb_id='.&get_symb_id($_);
                                        } @$resources
                                ).')';
+    my ($award_col, $award_join, $award_clause) = ('', '', '');
+    if ($has_award_for)
+    {
+        my $resource_id = &get_symb_id($has_award_for);
+        $award_col = ", perf.awarded";
+        $award_join = "LEFT JOIN $performance_table AS perf ON perf.symb_id"
+            ." = $resource_id AND perf.student_id = b.student_id ";
+        $award_clause = "AND perf.awarded IS NOT NULL";
+    }
     my $time_limits = &limit_by_start_end_time($starttime,$endtime,'a');
-    my $request = 'SELECT b.student,SUM(a.awarded*w.weight) AS score FROM '.
-        $performance_table.' AS a '.
-        'NATURAL LEFT JOIN '.$weight_table.' AS w '.
-        'LEFT JOIN '.$student_table.' AS b ON a.student_id=b.student_id '.
-        'WHERE ';
+    my $request = "SELECT b.student,SUM(a.awarded*w.weight) AS score "
+        ."$award_col FROM $performance_table AS a ".
+        "NATURAL LEFT JOIN $weight_table AS w ".
+        "LEFT JOIN $student_table AS b ON a.student_id=b.student_id ".
+        "$award_join WHERE ";
     if (defined($section_limits)) {
         $request .= $section_limits.' AND ';
     }
@@ -2078,9 +2095,9 @@
     }
     $request =~ s/( AND )$//;   # Remove extra conjunction
     $request =~ s/( WHERE )$//; # In case there were no limits placed on it
-    $request .= ' GROUP BY a.student_id ORDER BY score';
+    $request .= " $award_clause GROUP BY a.student_id ORDER BY score";
     #&Apache::lonnet::logthis('request = '.$/.$request);
-    my $sth = $dbh->prepare($request);
+    my $sth = $dbh->prepare($request) or die "Can't prepare $request";
     $sth->execute();
     my $rows = $sth->fetchall_arrayref();
     return ($rows);
Index: loncom/interface/statistics/lonproblemstatistics.pm
diff -u loncom/interface/statistics/lonproblemstatistics.pm:1.105 loncom/interface/statistics/lonproblemstatistics.pm:1.106
--- loncom/interface/statistics/lonproblemstatistics.pm:1.105	Fri Aug 26 17:53:23 2005
+++ loncom/interface/statistics/lonproblemstatistics.pm	Sun Feb  5 14:10:28 2006
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonproblemstatistics.pm,v 1.105 2005/08/26 21:53:23 albertel Exp $
+# $Id: lonproblemstatistics.pm,v 1.106 2006/02/05 19:10:28 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1630,7 +1630,7 @@
         (\@Resources,
          [&Apache::lonstatistics::get_selected_sections()],
          $Apache::lonstatistics::enrollment_status,undef,
-         $starttime,$endtime);
+         $starttime,$endtime, $symb);
     #
     # compute their percent scores on the problems in the sequence,
     my $number_to_grab = int(scalar(@{$ranking})/4);
@@ -1640,7 +1640,7 @@
     my @TopSet    = 
         map { 
             $_->[&Apache::loncoursedata::RNK_student()]; 
-          } @{$ranking}[($num_students-$number_to_grab)..($num_students-1)];
+          } @{$ranking}[-$number_to_grab..0];
     if (! @BottomSet || (@BottomSet == 1 && $BottomSet[0] eq '') ||
         ! @TopSet    || (@TopSet    == 1 && $TopSet[0]    eq '')) {
         return 'nan';