Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java =================================================================== diff -u -r2188972474f8d186d6811e3dea2e4136be669335 -rc899a00689ce45d2577934347da9d4ac47d29bec --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java (.../AssessmentQuestionResultDAOHibernate.java) (revision 2188972474f8d186d6811e3dea2e4136be669335) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java (.../AssessmentQuestionResultDAOHibernate.java) (revision c899a00689ce45d2577934347da9d4ac47d29bec) @@ -42,9 +42,6 @@ + AssessmentQuestionResult.class.getName() + " AS q, " + AssessmentResult.class.getName() + " AS r " + " WHERE q.assessmentResult.uid = r.uid and r.assessment.uid = :assessmentUid AND r.user.userId = :userId AND q.qbToolQuestion.uid = :qbToolQuestionUid ORDER BY r.startDate ASC"; - private static final String FIND_BY_QUESTION_UID = "FROM " + AssessmentQuestionResult.class.getName() - + " AS queRes " + " WHERE queRes.qbToolQuestion.uid =:questionUid ORDER BY queRes.finishDate ASC"; - private static final String FIND_WRONG_ANSWERS_NUMBER = "SELECT COUNT(q) FROM " + AssessmentQuestionResult.class.getName() + " AS q, " + AssessmentResult.class.getName() + " AS r " + " WHERE q.assessmentResult.uid = r.uid AND r.assessment.uid = ? AND r.user.userId =? AND q.qbToolQuestion.uid =? AND (ROUND(q.mark + q.penalty) < q.maxMark) AND (r.finishDate != null)"; @@ -82,9 +79,11 @@ } @Override - public List getQuestionResultsByQuestionUid(final Long questionUid) { + public List getQuestionResultsByQuestionUid(final Long questionUid, + boolean finishedOnly) { String FIND_BY_QUESTION_UID = "FROM " + AssessmentQuestionResult.class.getName() + " AS queRes " - + " WHERE queRes.qbToolQuestion.uid =:questionUid AND queRes.finishDate != null ORDER BY queRes.finishDate ASC"; + + " WHERE queRes.qbToolQuestion.uid =:questionUid " + + (finishedOnly ? "AND queRes.finishDate != null" : "") + " ORDER BY queRes.finishDate ASC"; Query q = getSession().createQuery(FIND_BY_QUESTION_UID, AssessmentQuestionResult.class); q.setParameter("questionUid", questionUid); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r311966039e3523fc031ef73008a13657f75f5426 -rc899a00689ce45d2577934347da9d4ac47d29bec --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 311966039e3523fc031ef73008a13657f75f5426) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision c899a00689ce45d2577934347da9d4ac47d29bec) @@ -836,6 +836,10 @@ String normalisedQuestionAnswer = AssessmentEscapeUtils.normaliseVSAnswer(questionDto.getAnswer()); for (OptionDTO optionDto : questionDto.getOptionDtos()) { + // refresh latest answers from DB + QbOption qbOption = qbService.getOptionByUid(optionDto.getUid()); + optionDto.setName(qbOption.getName()); + Collection optionAnswers = AssessmentEscapeUtils.normaliseVSOption(optionDto.getName()); boolean isAnswerMatchedCurrentOption = false; for (String optionAnswer : optionAnswers) { @@ -851,7 +855,6 @@ if (isAnswerMatchedCurrentOption) { mark = optionDto.getMaxMark() * maxMark; - QbOption qbOption = qbService.getOptionByUid(optionDto.getUid()); questionResult.setQbOption(qbOption); break; } @@ -1420,23 +1423,26 @@ public QuestionSummary getQuestionSummary(Long contentId, Long questionUid) { AssessmentQuestion question = assessmentQuestionDao.getByUid(questionUid); QbQuestion qbQuestion = question.getQbQuestion(); + boolean isVSA = question.getType() == QbQuestion.TYPE_VERY_SHORT_ANSWERS; List allQuestionResults = assessmentQuestionResultDao - .getQuestionResultsByQuestionUid(questionUid); + .getQuestionResultsByQuestionUid(questionUid, !isVSA); QuestionSummary questionSummary = new QuestionSummary(question); //prepare extra data for VSA type of questions, so teachers can allocate answers into groups - if (question.getType() == QbQuestion.TYPE_VERY_SHORT_ANSWERS) { + if (isVSA) { + boolean isQuestionCaseSensitive = question.getQbQuestion().isCaseSensitive(); //find all questionResults that are not allocated into groups yet List notAllocatedQuestionResults = new ArrayList<>(); + Set notAllocatedAnswers = new HashSet<>(); for (AssessmentQuestionResult questionResult : allQuestionResults) { String answer = questionResult.getAnswer(); if (StringUtils.isBlank(answer)) { continue; } boolean isAnswerAllocated = false; - boolean isQuestionCaseSensitive = question.getQbQuestion().isCaseSensitive(); + String normalisedAnswer = AssessmentEscapeUtils.normaliseVSAnswer(answer); for (QbOption option : qbQuestion.getQbOptions()) { Collection alternatives = AssessmentEscapeUtils.normaliseVSOption(option.getName()); @@ -1453,7 +1459,14 @@ } if (!isAnswerAllocated) { - notAllocatedQuestionResults.add(questionResult); + if (!isQuestionCaseSensitive) { + normalisedAnswer = normalisedAnswer.toLowerCase(); + } + // do not add repetitive students' suggestions for teacher to assign to an option + if (!notAllocatedAnswers.contains(normalisedAnswer)) { + notAllocatedAnswers.add(normalisedAnswer); + notAllocatedQuestionResults.add(questionResult); + } } } questionSummary.setNotAllocatedQuestionResults(notAllocatedQuestionResults);