Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java =================================================================== diff -u -r64bfad846c475db43b1b303e0df03735f39d34ce -rc307a78aca6f80434a5ee07496e70cb3f418d6cd --- lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java (.../ICommonAssessmentService.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java (.../ICommonAssessmentService.java) (revision c307a78aca6f80434a5ee07496e70cb3f418d6cd) @@ -1,6 +1,7 @@ package org.lamsfoundation.lams.tool.service; import java.util.Collection; +import java.util.Map; import org.lamsfoundation.lams.confidencelevel.VsaAnswerDTO; @@ -21,4 +22,13 @@ * Currently it only works for MCQ and mark hedging questions. */ Integer countCorrectAnswers(long toolContentId, int userId); + + /** + * Counts how many questions were answered correctly by all users in the given activity, regardless of the mark + * given. + * Currently it only works for MCQ and mark hedging questions. + * + * @return map user ID -> correct answer count + */ + Map countCorrectAnswers(long toolContentId); } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java =================================================================== diff -u -rad5ac90760b3e2726630bf914e9add8cde7724f5 -rc307a78aca6f80434a5ee07496e70cb3f418d6cd --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision ad5ac90760b3e2726630bf914e9add8cde7724f5) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision c307a78aca6f80434a5ee07496e70cb3f418d6cd) @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -127,6 +128,9 @@ Grouping grouping = groupingActivity == null ? null : groupingActivity.getCreateGrouping(); Set groups = grouping == null ? null : grouping.getGroups(); + Map iraCorrectAnswerCountByUser = commonAssessmentService + .countCorrectAnswers(iraToolContentId); + Set groupDtos = new TreeSet<>(); for (Group group : groups) { TblGroupDTO groupDto = new TblGroupDTO(group); @@ -146,8 +150,7 @@ groupDto.setGroupLeader(userDto); } - Integer correctAnswerCount = commonAssessmentService.countCorrectAnswers(iraToolContentId, - user.getUserId()); + Integer correctAnswerCount = iraCorrectAnswerCountByUser.get(userDto.getUserID()); if (correctAnswerCount != null) { userDto.setIraCorrectAnswerCount(correctAnswerCount); } @@ -165,7 +168,6 @@ } } } - request.setAttribute("groupDtos", groupDtos); double highestIraCorrectAnswerCountAverage = 0; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java =================================================================== diff -u -r14f0555e4fe91e89ebaa9c9e7d29f0666e681437 -rc307a78aca6f80434a5ee07496e70cb3f418d6cd --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 14f0555e4fe91e89ebaa9c9e7d29f0666e681437) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision c307a78aca6f80434a5ee07496e70cb3f418d6cd) @@ -34,13 +34,15 @@ List getAssessmentResults(Long assessmentUid, Long userId); List getAssessmentResultsByQbQuestion(Long qbQuestionUid); - + List getAssessmentResultsByQbQuestionAndAnswer(Long qbQuestionUid, String answer); List getAssessmentResultsBySession(Long sessionId, Long userId); List getFinishedAssessmentResultsByUser(Long sessionId, Long userId); + List getLastAssessmentResults(Long assessmentUid); + AssessmentResult getLastAssessmentResult(Long assessmentUid, Long userId); /** Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -rf299a43b38f1c06f1c9a0810b3ae6205b10e0269 -rc307a78aca6f80434a5ee07496e70cb3f418d6cd --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision f299a43b38f1c06f1c9a0810b3ae6205b10e0269) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision c307a78aca6f80434a5ee07496e70cb3f418d6cd) @@ -44,6 +44,9 @@ @Repository public class AssessmentResultDAOHibernate extends LAMSBaseDAO implements AssessmentResultDAO { + private static final String FIND_LAST_BY_ASSESSMENT = "FROM " + AssessmentResult.class.getName() + + " AS r WHERE r.assessment.uid=:assessmentUid AND r.latest=1"; + private static final String FIND_LAST_BY_ASSESSMENT_AND_USER = "FROM " + AssessmentResult.class.getName() + " AS r WHERE r.user.userId =:userId AND r.assessment.uid=:assessmentUid AND r.latest=1"; @@ -179,6 +182,13 @@ } @Override + public List getLastAssessmentResults(Long assessmentUid) { + Query q = getSession().createQuery(FIND_LAST_BY_ASSESSMENT, AssessmentResult.class); + q.setParameter("assessmentUid", assessmentUid); + return q.getResultList(); + } + + @Override public AssessmentResult getLastAssessmentResult(Long assessmentUid, Long userId) { Query q = getSession().createQuery(FIND_LAST_BY_ASSESSMENT_AND_USER, AssessmentResult.class); q.setParameter("userId", userId); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r10e6a1f74ecf6ba2d60569e9b9677b88ed39650a -rc307a78aca6f80434a5ee07496e70cb3f418d6cd --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 10e6a1f74ecf6ba2d60569e9b9677b88ed39650a) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision c307a78aca6f80434a5ee07496e70cb3f418d6cd) @@ -893,26 +893,27 @@ mark = -maxMark; } - // calculate penalty - if (mark > 0) { + // calculate penalty if needed + float penalty = 0; + if (mark > 0 && questionDto.getPenaltyFactor() != 0) { // calculate number of wrong answers int numberWrongAnswers = assessmentQuestionResultDao.getNumberWrongAnswersDoneBefore(assessmentUid, userId, questionDto.getUid()); // calculate penalty itself - float penalty = questionDto.getPenaltyFactor() * numberWrongAnswers; + penalty = questionDto.getPenaltyFactor() * numberWrongAnswers; mark -= penalty; if (penalty > maxMark) { penalty = maxMark; } - questionResult.setPenalty(penalty); // don't let penalty make mark less than 0 if (mark < 0) { mark = 0; } } + questionResult.setPenalty(penalty); questionResult.setMark(mark); questionResult.setMaxMark(maxMark); } @@ -3346,21 +3347,41 @@ } AssessmentResult assessmentResult = getLastAssessmentResult(assessment.getUid(), Integer.valueOf(userId).longValue()); + return countCorrectAnswers(assessment.getUid(), user.getUid(), assessmentResult); + } + + @Override + public Map countCorrectAnswers(long toolContentId) { + Map counts = new HashMap<>(); + Assessment assessment = getAssessmentByContentId(toolContentId); + long assessmentUid = assessment.getUid(); + long start = System.currentTimeMillis(); + Collection assessmentResults = assessmentResultDao.getLastAssessmentResults(assessmentUid); + for (AssessmentResult assessmentResult : assessmentResults) { + AssessmentUser user = assessmentResult.getUser(); + int count = countCorrectAnswers(assessmentUid, user.getUid(), assessmentResult); + counts.put(user.getUserId().intValue(), count); + } + return counts; + } + + private int countCorrectAnswers(long assessmentUid, long userUid, AssessmentResult assessmentResult) { if (assessmentResult == null) { return 0; } - int count = 0; + for (AssessmentQuestionResult questionResult : assessmentResult.getQuestionResults()) { QbToolQuestion qbToolQuestion = questionResult.getQbToolQuestion(); QbQuestion qbQuestion = qbToolQuestion.getQbQuestion(); if (qbQuestion.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE || qbQuestion.getType() == QbQuestion.TYPE_MARK_HEDGING) { QuestionDTO questionDTO = new QuestionDTO(qbToolQuestion); + loadupQuestionResultIntoQuestionDto(questionDTO, questionResult); - calculateAnswerMark(assessment.getUid(), user.getUid(), questionResult, questionDTO); + calculateAnswerMark(assessmentUid, userUid, questionResult, questionDTO); if (questionResult.getMark() > 0) { count++; }