Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java =================================================================== diff -u -r36716004da333fcc5eb3f776801e3e5278719fd7 -r14f0555e4fe91e89ebaa9c9e7d29f0666e681437 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 36716004da333fcc5eb3f776801e3e5278719fd7) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 14f0555e4fe91e89ebaa9c9e7d29f0666e681437) @@ -34,6 +34,8 @@ List getAssessmentResults(Long assessmentUid, Long userId); List getAssessmentResultsByQbQuestion(Long qbQuestionUid); + + List getAssessmentResultsByQbQuestionAndAnswer(Long qbQuestionUid, String answer); List getAssessmentResultsBySession(Long sessionId, Long userId); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -ra8614f8bb8ccde5d2068b34659649c3c93c4e0d1 -r14f0555e4fe91e89ebaa9c9e7d29f0666e681437 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision a8614f8bb8ccde5d2068b34659649c3c93c4e0d1) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 14f0555e4fe91e89ebaa9c9e7d29f0666e681437) @@ -27,6 +27,7 @@ import java.util.Map; import java.util.TreeMap; +import org.apache.commons.lang.StringUtils; import org.hibernate.query.NativeQuery; import org.hibernate.query.Query; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; @@ -142,13 +143,24 @@ @Override public List getAssessmentResultsByQbQuestion(Long qbQuestionUid) { - final String FIND_BY_QBQUESTION_AND_FINISHED = "SELECT r FROM " + AssessmentQuestionResult.class.getName() + return getAssessmentResultsByQbQuestionAndAnswer(qbQuestionUid, null); + } + + @Override + public List getAssessmentResultsByQbQuestionAndAnswer(Long qbQuestionUid, String answer) { + 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"; + + " WHERE q.assessmentResult.uid = r.uid AND q.qbToolQuestion.qbQuestion.uid =:qbQuestionUid AND (r.finishDate != null) "; + if (StringUtils.isNotBlank(answer)) { + FIND_BY_QBQUESTION_AND_FINISHED += "AND TRIM(q.answer) = TRIM(:answer) "; + } + FIND_BY_QBQUESTION_AND_FINISHED += "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); + if (StringUtils.isNotBlank(answer)) { + q.setParameter("answer", answer); + } return q.list(); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r952a9a9bb86760e4e827fb763008efb0aaaa54bc -r14f0555e4fe91e89ebaa9c9e7d29f0666e681437 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 952a9a9bb86760e4e827fb763008efb0aaaa54bc) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 14f0555e4fe91e89ebaa9c9e7d29f0666e681437) @@ -1439,22 +1439,26 @@ //adding if (previousOptionUid.equals(-1L)) { //search for duplicates and, if found, return false + QbOption targetOption = null; for (QbOption option : qbQuestion.getQbOptions()) { String name = option.getName(); String[] alternatives = name.split("\r\n"); if (Arrays.asList(alternatives).contains(answer)) { return Optional.of(option.getUid()); } + if (option.getUid().equals(targetOptionUid)) { + targetOption = option; + } } - for (QbOption targetOption : qbQuestion.getQbOptions()) { - if (targetOption.getUid().equals(targetOptionUid)) { - String name = targetOption.getName(); - name += "\r\n" + answer; - targetOption.setName(name); - assessmentDao.saveObject(targetOption); - break; - } + String name = targetOption.getName(); + name += "\r\n" + answer; + targetOption.setName(name); + assessmentDao.saveObject(targetOption); + + if (log.isDebugEnabled()) { + log.debug("Adding answer \"" + answer + "\" to option " + targetOptionUid + " in question " + + questionUid); } } @@ -1465,10 +1469,10 @@ String name = previousOption.getName(); String[] alternatives = name.split("\r\n"); - String nameWithoutUserAnswer = ""; + StringBuilder nameWithoutUserAnswer = new StringBuilder(); for (String alternative : alternatives) { if (!alternative.equals(answer)) { - nameWithoutUserAnswer += alternative + "\r\n"; + nameWithoutUserAnswer.append(alternative).append("\r\n"); } } if (nameWithoutUserAnswer.length() > 2) { @@ -1501,30 +1505,28 @@ String name = previousOption.getName(); String[] alternatives = name.split("\r\n"); - String nameWithoutUserAnswer = ""; + StringBuilder nameWithoutUserAnswer = new StringBuilder(); for (String alternative : alternatives) { if (!alternative.equals(answer)) { - nameWithoutUserAnswer += alternative + "\r\n"; + nameWithoutUserAnswer.append(alternative).append("\r\n"); } } - if (nameWithoutUserAnswer.length() > 2) { - nameWithoutUserAnswer = nameWithoutUserAnswer.substring(0, nameWithoutUserAnswer.length() - 2); - } - previousOption.setName(nameWithoutUserAnswer); + previousOption.setName(nameWithoutUserAnswer.length() > 2 + ? nameWithoutUserAnswer.substring(0, nameWithoutUserAnswer.length() - 2) + : ""); assessmentDao.saveObject(previousOption); break; } } } - assessmentResultDao.flush(); + assessmentDao.flush(); //recalculate marks for all lessons in all cases except for reshuffling inside the same container if (!targetOptionUid.equals(previousOptionUid)) { // get all finished user results List assessmentResults = assessmentResultDao - .getAssessmentResultsByQbQuestion(qbQuestion.getUid()); - + .getAssessmentResultsByQbQuestionAndAnswer(qbQuestion.getUid(), answer); //stores userId->lastFinishedAssessmentResult Map lastFinishedAssessmentResults = new LinkedHashMap<>(); for (AssessmentResult assessmentResult : assessmentResults) {