Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java =================================================================== diff -u -r419201d3ad6fa99804284edd03c21d0065217c6c -r5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 419201d3ad6fa99804284edd03c21d0065217c6c) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a) @@ -20,7 +20,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.tool.assessment.dao; import java.util.List; @@ -32,18 +31,18 @@ public interface AssessmentResultDAO extends DAO { List getAssessmentResults(Long assessmentUid, Long userId); - + List getAssessmentResultsByQbQuestion(Long qbQuestionUid); List getAssessmentResultsBySession(Long sessionId, Long userId); List getFinishedAssessmentResultsByUser(Long sessionId, Long userId); AssessmentResult getLastAssessmentResult(Long assessmentUid, Long userId); - + /** * Checks whether the last attempt started by user is finished. - * + * * @param user * @return true if user has finished it, false otherwise */ @@ -56,15 +55,15 @@ List getLastTotalScoresByContentId(Long assessmentUid); Float getBestTotalScoreByUser(Long sessionId, Long userId); - + List getBestTotalScoresByContentId(Long assessmentUid); Float getFirstTotalScoreByUser(Long sessionId, Long userId); - + List getFirstTotalScoresByContentId(Long assessmentUid); Float getAvergeTotalScoreByUser(Long sessionId, Long userId); - + List getAverageTotalScoresByContentId(Long assessmentUid); Integer getLastFinishedAssessmentResultTimeTaken(Long assessmentUid, Long userId); @@ -78,26 +77,28 @@ * @return */ List getLastFinishedAssessmentResults(Long contentId); - + + int countLastFinishedAssessmentResults(long contentId); + List getLastFinishedAssessmentResultsBySession(Long sessionId); - + /** * Get results for all leaders in current activity. - * + * * @param contentId * @return */ List getLeadersLastFinishedAssessmentResults(Long contentId); int getAssessmentResultCount(Long assessmentUid, Long userId); - + /** * Checks whether anyone has attempted this assessment. */ boolean isAssessmentAttempted(Long assessmentUid); AssessmentResult getAssessmentResultByUid(Long assessmentResultUid); - + /** * Count how many last finished attempts selected specified option. */ Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -rd0b0ba33d9c8c8d96876b9de3263ac77643ba35a -r5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision d0b0ba33d9c8c8d96876b9de3263ac77643ba35a) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a) @@ -42,8 +42,9 @@ 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"; - - private static final String FIND_WHETHER_LAST_RESULT_FINISHED = "SELECT COUNT(*) > 0 FROM " + AssessmentResult.class.getName() + + private static final String FIND_WHETHER_LAST_RESULT_FINISHED = "SELECT COUNT(*) > 0 FROM " + + AssessmentResult.class.getName() + " AS r WHERE r.user.userId =:userId AND r.assessment.uid=:assessmentUid AND r.latest=1 AND r.finishDate != null"; private static final String FIND_BY_ASSESSMENT_AND_USER_AND_FINISHED = "FROM " + AssessmentResult.class.getName() @@ -62,12 +63,12 @@ + " AS r WHERE r.user.userId = :userId AND r.sessionId=:sessionId AND (r.finishDate != null) AND r.latest=1"; private static final String FIND_LAST_FINISHED_RESULTS_BY_CONTENT_ID = "FROM " + AssessmentResult.class.getName() - + " AS r WHERE r.assessment.contentId=? AND (r.finishDate != null) AND r.latest=1"; + + " AS r WHERE r.assessment.contentId = :contentId AND (r.finishDate != null) AND r.latest = 1"; private static final String FIND_ASSESSMENT_RESULT_COUNT_BY_ASSESSMENT_AND_USER = "select COUNT(*) FROM " + AssessmentResult.class.getName() + " AS r WHERE r.user.userId=? AND r.assessment.uid=? AND (r.finishDate != null)"; - + private static final String IS_ASSESSMENT_RESULT_EXIST_BY_ASSESSMENT = "select COUNT(*) > 0 FROM " + AssessmentResult.class.getName() + " AS r WHERE r.assessment.uid=:assessmentUid"; @@ -107,16 +108,15 @@ @Override @SuppressWarnings("unchecked") public List getAssessmentResults(Long assessmentUid, Long userId) { - return (List) doFind(FIND_BY_ASSESSMENT_AND_USER_AND_FINISHED, - new Object[] { userId, assessmentUid }); + return doFind(FIND_BY_ASSESSMENT_AND_USER_AND_FINISHED, new Object[] { userId, assessmentUid }); } - + @Override public List getAssessmentResultsByQbQuestion(Long qbQuestionUid) { final String FIND_BY_QBQUESTION_AND_FINISHED = "SELECT r FROM " + AssessmentQuestionResult.class.getName() + " AS q, " + AssessmentResult.class.getName() + " AS r " + " WHERE q.assessmentResult.uid = r.uid AND q.qbToolQuestion.qbQuestion.uid =:qbQuestionUid AND (r.finishDate != null) ORDER BY r.startDate ASC"; - + Query q = getSession().createQuery(FIND_BY_QBQUESTION_AND_FINISHED, AssessmentResult.class); q.setParameter("qbQuestionUid", qbQuestionUid); // q.addEntity("bq", AssessmentResult.class); @@ -125,13 +125,12 @@ @Override public List getFinishedAssessmentResultsByUser(Long sessionId, Long userId) { - return (List) doFind(FIND_BY_SESSION_AND_USER_AND_FINISHED, - new Object[] { userId, sessionId }); + return doFind(FIND_BY_SESSION_AND_USER_AND_FINISHED, new Object[] { userId, sessionId }); } @Override public List getAssessmentResultsBySession(Long sessionId, Long userId) { - return (List) doFind(FIND_BY_SESSION_AND_USER, new Object[] { userId, sessionId }); + return doFind(FIND_BY_SESSION_AND_USER, new Object[] { userId, sessionId }); } @Override @@ -141,7 +140,7 @@ q.setParameter("assessmentUid", assessmentUid); return q.uniqueResult(); } - + @Override public Boolean isLastAttemptFinishedByUser(AssessmentUser user) { Assessment assessment = user.getAssessment() == null ? user.getSession().getAssessment() : user.getAssessment(); @@ -157,7 +156,7 @@ AssessmentResult.class); q.setParameter("userId", userId); q.setParameter("assessmentUid", assessmentUid); - return (AssessmentResult) q.uniqueResult(); + return q.uniqueResult(); } @Override @@ -166,14 +165,13 @@ q.setParameter("userId", userId); q.setParameter("assessmentUid", assessmentUid); Float lastTotalScore = q.uniqueResult(); - + return lastTotalScore == null ? 0 : lastTotalScore; } @Override public List getLastTotalScoresByContentId(Long toolContentId) { - List list = (List) doFind(LAST_ASSESSMENT_RESULT_GRADES_BY_CONTENT_ID, - new Object[] { toolContentId }); + List list = doFind(LAST_ASSESSMENT_RESULT_GRADES_BY_CONTENT_ID, new Object[] { toolContentId }); return convertResultsToAssessmentUserDTOList(list); } @@ -187,7 +185,7 @@ @Override public List getBestTotalScoresByContentId(Long toolContentId) { - List list = (List) doFind(BEST_SCORES_BY_CONTENT_ID, new Object[] { toolContentId }); + List list = doFind(BEST_SCORES_BY_CONTENT_ID, new Object[] { toolContentId }); return convertResultsToAssessmentUserDTOList(list); } @@ -227,7 +225,7 @@ @Override public List getAverageTotalScoresByContentId(Long toolContentId) { - List list = (List) doFind(AVERAGE_SCORES_BY_CONTENT_ID, new Object[] { toolContentId }); + List list = doFind(AVERAGE_SCORES_BY_CONTENT_ID, new Object[] { toolContentId }); return convertResultsToAssessmentUserDTOList(list); } @@ -253,23 +251,32 @@ @Override public List getLastFinishedAssessmentResults(Long contentId) { - return (List) doFind(FIND_LAST_FINISHED_RESULTS_BY_CONTENT_ID, new Object[] { contentId }); + return getSession().createQuery(FIND_LAST_FINISHED_RESULTS_BY_CONTENT_ID, AssessmentResult.class) + .setParameter("contentId", contentId).getResultList(); } - + @Override + public int countLastFinishedAssessmentResults(long contentId) { + return ((Long) getSession().createQuery("SELECT COUNT(*) " + FIND_LAST_FINISHED_RESULTS_BY_CONTENT_ID) + .setParameter("contentId", contentId).uniqueResult()).intValue(); + } + + @Override public List getLastFinishedAssessmentResultsBySession(Long sessionId) { - final String FIND_LAST_FINISHED_RESULTS_BY_SESSION_ID = "SELECT r, u.portraitUuid FROM " + AssessmentResult.class.getName() - + " AS r, " + User.class.getName() + " as u WHERE r.sessionId=? AND (r.finishDate != null) AND r.latest=1 AND u.userId=r.user.userId"; - - return (List) doFind(FIND_LAST_FINISHED_RESULTS_BY_SESSION_ID, new Object[] { sessionId }); + final String FIND_LAST_FINISHED_RESULTS_BY_SESSION_ID = "SELECT r, u.portraitUuid FROM " + + AssessmentResult.class.getName() + " AS r, " + User.class.getName() + + " as u WHERE r.sessionId=? AND (r.finishDate != null) AND r.latest=1 AND u.userId=r.user.userId"; + + return doFind(FIND_LAST_FINISHED_RESULTS_BY_SESSION_ID, new Object[] { sessionId }); } - + @Override public List getLeadersLastFinishedAssessmentResults(Long contentId) { - final String FIND_LAST_FINISHED_RESULTS_BY_SESSION_ID = "SELECT r, u.portraitUuid FROM " + AssessmentResult.class.getName() - + " AS r, " + User.class.getName() + " as u WHERE r.user=r.user.session.groupLeader AND r.assessment.contentId=? AND (r.finishDate != null) AND r.latest=1 AND u.userId=r.user.userId"; - - return (List) doFind(FIND_LAST_FINISHED_RESULTS_BY_SESSION_ID, new Object[] { contentId }); + final String FIND_LAST_FINISHED_RESULTS_BY_SESSION_ID = "SELECT r, u.portraitUuid FROM " + + AssessmentResult.class.getName() + " AS r, " + User.class.getName() + + " as u WHERE r.user=r.user.session.groupLeader AND r.assessment.contentId=? AND (r.finishDate != null) AND r.latest=1 AND u.userId=r.user.userId"; + + return doFind(FIND_LAST_FINISHED_RESULTS_BY_SESSION_ID, new Object[] { contentId }); } @Override @@ -281,7 +288,7 @@ return ((Number) list.get(0)).intValue(); } } - + @Override public boolean isAssessmentAttempted(Long assessmentUid) { Query q = getSession().createQuery(IS_ASSESSMENT_RESULT_EXIST_BY_ASSESSMENT, Boolean.class); @@ -297,15 +304,14 @@ } return (AssessmentResult) list.get(0); } - + @Override public int countAttemptsPerOption(Long toolContentId, Long optionUid) { - String COUNT_ATTEMPTS_BY_OPTION_UID = "SELECT count(*) " - + "FROM tl_laasse10_assessment_result AS result " + String COUNT_ATTEMPTS_BY_OPTION_UID = "SELECT count(*) " + "FROM tl_laasse10_assessment_result AS result " + "JOIN tl_laasse10_assessment AS assessment ON assessment.uid = result.assessment_uid " + "JOIN tl_laasse10_question_result AS questionResult ON questionResult.result_uid = result.uid " + "JOIN lams_qb_tool_answer AS qbToolAnswer ON qbToolAnswer.answer_uid = questionResult.uid " - + "JOIN tl_laasse10_option_answer AS optionAnswer ON questionResult.uid = optionAnswer.question_result_uid " + + "JOIN tl_laasse10_option_answer AS optionAnswer ON questionResult.uid = optionAnswer.question_result_uid " + "WHERE (result.finish_date IS NOT NULL) AND result.latest=1 && assessment.content_id = :toolContentId" + " AND optionAnswer.question_option_uid = :optionUid AND (optionAnswer.answer_boolean=1 OR qbToolAnswer.qb_option_uid = :optionUid) "; @@ -316,8 +322,8 @@ } private List convertResultsToAssessmentUserDTOList(List list) { - List lastTotalScores = new ArrayList(); - + List lastTotalScores = new ArrayList<>(); + if (list != null && list.size() > 0) { for (Object[] element : list) { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r7526ca9885157455bb66079b6cc8a3571f819de9 -r5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 7526ca9885157455bb66079b6cc8a3571f819de9) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a) @@ -350,7 +350,25 @@ return assessmentUserDao.getCountUsersByContentId(contentId); } + /** + * How many learners can possibly access this activity + */ @Override + public int getCountLessonLearnersByContentId(long contentId) { + long lessonId = lessonService.getLessonByToolContentId(contentId).getLessonId(); + return lessonService.getCountLessonLearners(lessonId, null); + } + + /** + * How many learners have already finished answering questions. + * They are either on results page or left the activity completely. + */ + @Override + public int getCountLearnersWithFinishedCurrentAttempt(long contentId) { + return assessmentResultDao.countLastFinishedAssessmentResults(contentId); + } + + @Override public List getPagedUsersBySessionAndQuestion(Long sessionId, Long questionUid, int page, int size, String sortBy, String sortOrder, String searchString) { return assessmentUserDao.getPagedUsersBySessionAndQuestion(sessionId, questionUid, page, size, sortBy, Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r897ad3c3694440281f178d7834a9233d62c4e874 -r5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 897ad3c3694440281f178d7834a9233d62c4e874) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a) @@ -117,6 +117,10 @@ int getCountUsersByContentId(Long contentId); + int getCountLessonLearnersByContentId(long contentId); + + int getCountLearnersWithFinishedCurrentAttempt(long contentId); + List getPagedUsersBySessionAndQuestion(Long sessionId, Long questionUid, int page, int size, String sortBy, String sortOrder, String searchString); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java =================================================================== diff -u -r955d3cf3aaf3ffc011e780393e684b43748eaf8e -r5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 955d3cf3aaf3ffc011e780393e684b43748eaf8e) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 5b3b4fd2df1de75d853c5fb9dcf9f02eb2a5ca5a) @@ -236,6 +236,10 @@ request.setAttribute("questions", questionDtos); } + request.setAttribute("possibleLearners", service.getCountLessonLearnersByContentId(contentId)); + request.setAttribute("startedLearners", service.getCountUsersByContentId(contentId)); + request.setAttribute("finishedLearners", service.getCountLearnersWithFinishedCurrentAttempt(contentId)); + return "pages/monitoring/monitoring"; } @@ -576,7 +580,7 @@ } String response = AssessmentEscapeUtils.printResponsesForJqgrid(questionResult); - + if (StringUtils.isNotBlank(questionResult.getJustification())) { response += "
" + service.getMessage("label.answer.justification") + "
" + questionResult.getJustificationEscaped();