Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -r89ed3ac4374cba2ee6ef0ffad853ccc673cb328a -r58769dd8bdda0dd07bbb90508b319c58b513c9aa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 89ed3ac4374cba2ee6ef0ffad853ccc673cb328a) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 58769dd8bdda0dd07bbb90508b319c58b513c9aa) @@ -30,37 +30,37 @@ public class AssessmentResultDAOHibernate extends BaseDAOHibernate 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 LIMIT 1"; + 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() + " 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 LIMIT 1"; + + " 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 LIMIT 1"; + + " 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 LIMIT 1"; + + " 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 = ?"; @@ -84,7 +84,7 @@ @Override public AssessmentResult getLastAssessmentResult(Long assessmentUid, Long userId) { - List list = getHibernateTemplate().find(AssessmentResultDAOHibernate.FIND_BY_ASSESSMENT_AND_USER, + List list = getHibernateTemplate().find(AssessmentResultDAOHibernate.FIND_LAST_BY_ASSESSMENT_AND_USER, new Object[] { userId, assessmentUid }); if ((list == null) || (list.size() == 0)) { return null; @@ -96,7 +96,7 @@ @Override public AssessmentResult getLastFinishedAssessmentResult(Long assessmentUid, Long userId) { List list = getHibernateTemplate().find( - AssessmentResultDAOHibernate.FIND_BY_ASSESSMENT_AND_USER_AND_FINISHED_LIMIT1, + AssessmentResultDAOHibernate.FIND_LAST_FINISHED_BY_ASSESSMENT_AND_USER, new Object[] { userId, assessmentUid }); if ((list == null) || (list.size() == 0)) { return null; @@ -119,11 +119,7 @@ @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 = getHibernateTemplate().find(FIND_ASSESSMENT_RESULT_TIME_TAKEN, + List list = getHibernateTemplate().find(FIND_LAST_ASSESSMENT_RESULT_TIME_TAKEN, new Object[] { userId, assessmentUid }); if ((list == null) || (list.size() == 0)) { return null; @@ -135,7 +131,7 @@ @Override public AssessmentResult getLastFinishedAssessmentResultBySessionId(Long sessionId, Long userId) { List list = getHibernateTemplate().find( - AssessmentResultDAOHibernate.FIND_BY_SESSION_AND_USER_AND_FINISHED_LIMIT1, + AssessmentResultDAOHibernate.FIND_LAST_FINISHED_BY_SESSION_AND_USER, new Object[] { userId, sessionId }); if ((list == null) || (list.size() == 0)) { return null; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java =================================================================== diff -u -r78bf7a4e21b1530f5e8805ad75157ce623309eeb -r58769dd8bdda0dd07bbb90508b319c58b513c9aa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java (.../AssessmentUserDAOHibernate.java) (revision 78bf7a4e21b1530f5e8805ad75157ce623309eeb) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java (.../AssessmentUserDAOHibernate.java) (revision 58769dd8bdda0dd07bbb90508b319c58b513c9aa) @@ -67,14 +67,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 " + @@ -145,21 +141,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 58769dd8bdda0dd07bbb90508b319c58b513c9aa) @@ -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 -r58769dd8bdda0dd07bbb90508b319c58b513c9aa --- 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 58769dd8bdda0dd07bbb90508b319c58b513c9aa) @@ -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 -r836277abe6bc4406417d192a528e3961e0c729e5 -r58769dd8bdda0dd07bbb90508b319c58b513c9aa --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 836277abe6bc4406417d192a528e3961e0c729e5) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 58769dd8bdda0dd07bbb90508b319c58b513c9aa) @@ -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 -r6e0a850be7aeb517668981658f2957bb12f168a4 -r58769dd8bdda0dd07bbb90508b319c58b513c9aa --- lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp (.../questionsummary.jsp) (revision 6e0a850be7aeb517668981658f2957bb12f168a4) +++ lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp (.../questionsummary.jsp) (revision 58769dd8bdda0dd07bbb90508b319c58b513c9aa) @@ -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});