Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -rf0101ce51ebf5accdfacb6f4dbdcfbe3beb84204 -rc266dd394246bd6178c2e0bb971f3d0eb74095c5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision f0101ce51ebf5accdfacb6f4dbdcfbe3beb84204) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision c266dd394246bd6178c2e0bb971f3d0eb74095c5) @@ -34,38 +34,37 @@ @Repository public class AssessmentResultDAOHibernate extends LAMSBaseDAO implements AssessmentResultDAO { - private static final String FIND_BY_ASSESSMENT_AND_USER = "FROM " + AssessmentResult.class.getName() - + " AS r WHERE r.user.userId = ? AND r.assessment.uid=? ORDER BY r.startDate DESC"; + private static final String FIND_LAST_BY_ASSESSMENT_AND_USER = "FROM " + AssessmentResult.class.getName() + + " AS r WHERE r.user.userId = ? AND r.assessment.uid=? AND r.latest=1"; - private static final String FIND_BY_ASSESSMENT_AND_USER_AND_FINISHED = "FROM " - + AssessmentResult.class.getName() + private static final String FIND_BY_ASSESSMENT_AND_USER_AND_FINISHED = "FROM " + AssessmentResult.class.getName() + " AS r WHERE r.user.userId = ? AND r.assessment.uid=? AND (r.finishDate != null) ORDER BY r.startDate ASC"; - private static final String FIND_BY_ASSESSMENT_AND_USER_AND_FINISHED_LIMIT1 = "FROM " + private static final String FIND_LAST_FINISHED_BY_ASSESSMENT_AND_USER = "FROM " + AssessmentResult.class.getName() - + " AS r WHERE r.user.userId = ? AND r.assessment.uid=? AND (r.finishDate != null) ORDER BY r.startDate DESC"; + + " AS r WHERE r.user.userId = ? AND r.assessment.uid=? AND (r.finishDate != null) AND r.latest=1"; private static final String FIND_BY_SESSION_AND_USER = "FROM " + AssessmentResult.class.getName() + " AS r WHERE r.user.userId = ? AND r.sessionId=?"; private static final String FIND_BY_SESSION_AND_USER_AND_FINISHED = "FROM " + AssessmentResult.class.getName() + " AS r WHERE r.user.userId = ? AND r.sessionId=? AND (r.finishDate != null) ORDER BY r.startDate ASC"; - private static final String FIND_BY_SESSION_AND_USER_AND_FINISHED_LIMIT1 = "FROM " + private static final String FIND_LAST_FINISHED_BY_SESSION_AND_USER = "FROM " + AssessmentResult.class.getName() - + " AS r WHERE r.user.userId = ? AND r.sessionId=? AND (r.finishDate != null) ORDER BY r.startDate DESC"; + + " AS r WHERE r.user.userId = ? AND r.sessionId=? 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 FIND_LAST_ASSESSMENT_RESULT_GRADE = "select r.grade FROM " + AssessmentResult.class.getName() - + " AS r WHERE r.user.userId=? AND r.assessment.uid=? AND (r.finishDate != null) ORDER BY r.startDate DESC"; + + " AS r WHERE r.user.userId=? AND r.assessment.uid=? AND (r.finishDate != null) AND r.latest=1"; - private static final String FIND_ASSESSMENT_RESULT_TIME_TAKEN = "select r.finishDate - r.startDate FROM " + private static final String FIND_LAST_ASSESSMENT_RESULT_TIME_TAKEN = "select UNIX_TIMESTAMP(r.finishDate) - UNIX_TIMESTAMP(r.startDate) FROM " + AssessmentResult.class.getName() - + " AS r WHERE r.user.userId=? AND r.assessment.uid=? AND (r.finishDate != null)"; + + " AS r WHERE r.user.userId=? AND r.assessment.uid=? AND (r.finishDate != null) AND r.latest=1"; private static final String FIND_BY_UID = "FROM " + AssessmentResult.class.getName() + " AS r WHERE r.uid = ?"; @@ -90,21 +89,19 @@ @Override public AssessmentResult getLastAssessmentResult(Long assessmentUid, Long userId) { - Query q = getSession().createQuery(AssessmentResultDAOHibernate.FIND_BY_ASSESSMENT_AND_USER); + Query q = getSession().createQuery(AssessmentResultDAOHibernate.FIND_LAST_BY_ASSESSMENT_AND_USER); q.setParameter(0, userId); q.setParameter(1, assessmentUid); - q.setMaxResults(1); return (AssessmentResult) q.uniqueResult(); } @Override public AssessmentResult getLastFinishedAssessmentResult(Long assessmentUid, Long userId) { Query q = getSession() - .createQuery(AssessmentResultDAOHibernate.FIND_BY_ASSESSMENT_AND_USER_AND_FINISHED_LIMIT1); + .createQuery(AssessmentResultDAOHibernate.FIND_LAST_FINISHED_BY_ASSESSMENT_AND_USER); q.setParameter(0, userId); q.setParameter(1, assessmentUid); - q.setMaxResults(1); return (AssessmentResult) q.uniqueResult(); } @@ -115,18 +112,13 @@ .createQuery(AssessmentResultDAOHibernate.FIND_LAST_ASSESSMENT_RESULT_GRADE); q.setParameter(0, userId); q.setParameter(1, assessmentUid); - q.setMaxResults(1); return ((Number) q.uniqueResult()).floatValue(); } @Override public Integer getLastFinishedAssessmentResultTimeTaken(Long assessmentUid, Long userId) { - String FIND_ASSESSMENT_RESULT_TIME_TAKEN = "select UNIX_TIMESTAMP(r.finishDate) - UNIX_TIMESTAMP(r.startDate) FROM " - + AssessmentResult.class.getName() - + " AS r WHERE r.user.userId=? AND r.assessment.uid=? AND (r.finishDate != null)"; - - List list = doFind(FIND_ASSESSMENT_RESULT_TIME_TAKEN, new Object[] { userId, assessmentUid }); + List list = doFind(FIND_LAST_ASSESSMENT_RESULT_TIME_TAKEN, new Object[] { userId, assessmentUid }); if ((list == null) || (list.size() == 0)) { return null; } else { @@ -136,10 +128,9 @@ @Override public AssessmentResult getLastFinishedAssessmentResultBySessionId(Long sessionId, Long userId) { - Query q = getSession().createQuery(AssessmentResultDAOHibernate.FIND_BY_SESSION_AND_USER_AND_FINISHED_LIMIT1); + Query q = getSession().createQuery(AssessmentResultDAOHibernate.FIND_LAST_FINISHED_BY_SESSION_AND_USER); q.setParameter(0, userId); q.setParameter(1, sessionId); - q.setMaxResults(1); return (AssessmentResult) q.uniqueResult(); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java =================================================================== diff -u -r45466cdcb65a2b45fa8e24d23a40b986d902cede -rc266dd394246bd6178c2e0bb971f3d0eb74095c5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java (.../AssessmentUserDAOHibernate.java) (revision 45466cdcb65a2b45fa8e24d23a40b986d902cede) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java (.../AssessmentUserDAOHibernate.java) (revision c266dd394246bd6178c2e0bb971f3d0eb74095c5) @@ -71,14 +71,10 @@ " FROM tl_laasse10_user user" + " INNER JOIN tl_laasse10_session session" + " ON user.session_uid=session.uid" + - " LEFT OUTER JOIN (" + - " SELECT * FROM ( " + - " SELECT res.user_uid, res.grade " + - " FROM tl_laasse10_assessment_result res" + - " WHERE (res.finish_date IS NOT NULL) ORDER BY res.start_date DESC" + - " ) latest_res GROUP BY latest_res.user_uid" + - " ) result" + + " LEFT OUTER JOIN tl_laasse10_assessment_result result " + " ON result.user_uid = user.uid" + + " AND result.finish_date IS NOT NULL" + + " AND result.latest = 1" + " WHERE session.session_id = :sessionId " + " AND (CONCAT(user.last_name, ' ', user.first_name) LIKE CONCAT('%', :searchString, '%')) " + " ORDER BY " + @@ -149,21 +145,14 @@ " INNER JOIN tl_laasse10_session session" + " ON user.session_uid=session.uid" + - " LEFT OUTER JOIN (" + - " SELECT * FROM ( " + - " SELECT res.uid, res.user_uid " + - " FROM tl_laasse10_assessment_result res" + - " WHERE (res.finish_date IS NOT NULL) ORDER BY res.start_date DESC" + - " ) latest_res GROUP BY latest_res.user_uid" + - " ) result" + + " LEFT OUTER JOIN tl_laasse10_assessment_result result " + " ON result.user_uid = user.uid" + + " AND result.finish_date IS NOT NULL" + + " AND result.latest = 1" + - " INNER JOIN (" + - " SELECT question_res.uid, question_res.result_uid, question_res.mark " + - " FROM tl_laasse10_question_result question_res" + - " WHERE question_res.assessment_question_uid =:questionUid" + - " ) question_result" + + " INNER JOIN tl_laasse10_question_result question_result " + " ON result.uid=question_result.result_uid" + + " AND question_result.assessment_question_uid = :questionUid" + " WHERE session.session_id = :sessionId " + " AND (CONCAT(user.last_name, ' ', user.first_name) LIKE CONCAT('%', :searchString, '%')) " + Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20151204.sql =================================================================== diff -u --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20151204.sql (revision 0) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20151204.sql (revision c266dd394246bd6178c2e0bb971f3d0eb74095c5) @@ -0,0 +1,25 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +----------------------Put all sql statements below here------------------------- + +-- LDEV-3627 Improve Assessment tool's monitor paging +ALTER TABLE tl_laasse10_assessment_result ADD COLUMN latest TINYINT(1) DEFAULT 0; + +UPDATE tl_laasse10_assessment_result result + JOIN + ( SELECT user_uid, MAX(start_date) AS max_date + FROM tl_laasse10_assessment_result + GROUP BY user_uid + ) AS c + ON result.user_uid = c.user_uid + AND result.start_date = c.max_date +SET + result.latest = 1; + +----------------------Put all sql statements above here------------------------- + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentResult.java =================================================================== diff -u -rf91a13ebf9fee21e228d82128ed50511ef8b4169 -rc266dd394246bd6178c2e0bb971f3d0eb74095c5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentResult.java (.../AssessmentResult.java) (revision f91a13ebf9fee21e228d82128ed50511ef8b4169) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentResult.java (.../AssessmentResult.java) (revision c266dd394246bd6178c2e0bb971f3d0eb74095c5) @@ -42,6 +42,8 @@ private Long uid; private Assessment assessment; private Date startDate; + //indicates the latest retry + private boolean isLatest; private Date finishDate; private AssessmentUser user; private Long sessionId; @@ -106,6 +108,18 @@ } /** + * @hibernate.property column="latest" + * @return + */ + public boolean isLatest() { + return isLatest; + } + + public void setLatest(boolean isLatest) { + this.isLatest = isLatest; + } + + /** * @hibernate.property column="finish_date" * @return */ Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r0538134ecba9216c47c98a74d0e0d89f4f29bb48 -rc266dd394246bd6178c2e0bb971f3d0eb74095c5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 0538134ecba9216c47c98a74d0e0d89f4f29bb48) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision c266dd394246bd6178c2e0bb971f3d0eb74095c5) @@ -249,6 +249,7 @@ // copy results from leader to user in both cases (when there is no userResult yet and when if it's been changed // by the leader) userResult.setStartDate(leaderResult.getStartDate()); + userResult.setLatest(leaderResult.isLatest()); userResult.setFinishDate(leaderResult.getFinishDate()); userResult.setMaximumGrade(leaderResult.getMaximumGrade()); userResult.setGrade(leaderResult.getGrade()); @@ -426,16 +427,25 @@ @Override public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId) { AssessmentResult lastResult = getLastAssessmentResult(assessment.getUid(), assessmentUser.getUserId()); - // don't instantiate new attempt if the previous one wasn't finished and thus continue working with it - if ((lastResult != null) && (lastResult.getFinishDate() == null)) { - return; + if (lastResult != null) { + + // don't instantiate new attempt if the previous one wasn't finished and thus continue working with it + if (lastResult.getFinishDate() == null) { + return; + + // mark previous attempt as not the latest anymore + } else { + lastResult.setLatest(false); + assessmentResultDao.saveObject(lastResult); + } } AssessmentResult result = new AssessmentResult(); result.setAssessment(assessment); result.setUser(assessmentUser); result.setSessionId(toolSessionId); result.setStartDate(new Timestamp(new Date().getTime())); + result.setLatest(true); assessmentResultDao.saveObject(result); } Index: lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp =================================================================== diff -u -r45466cdcb65a2b45fa8e24d23a40b986d902cede -rc266dd394246bd6178c2e0bb971f3d0eb74095c5 --- lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp (.../questionsummary.jsp) (revision 45466cdcb65a2b45fa8e24d23a40b986d902cede) +++ lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp (.../questionsummary.jsp) (revision c266dd394246bd6178c2e0bb971f3d0eb74095c5) @@ -41,7 +41,6 @@ rowList:[10,20,30,40,50,100], rowNum:10, viewrecords:true, - recordpos: 'left', colNames:['questionResultUid', 'maxMark', "", @@ -105,7 +104,7 @@ searchOnEnter: false }) - .navGrid("#pager${sessionDto.sessionId}", {edit:false,add:false,del:false,search:false, refresh:false}); + .navGrid("#pager${sessionDto.sessionId}", {edit:false,add:false,del:false,search:false, refresh:true});