--- loncom/interface/loncoursedata.pm 2006/02/05 18:49:47 1.153 +++ loncom/interface/loncoursedata.pm 2006/02/05 19:10:19 1.154 @@ -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 @@ Inputs: $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_student { return 0; }; 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 @@ sub rank_students_by_scores_on_resources 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 @@ sub rank_students_by_scores_on_resources } $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);