diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 4af6d92afea2e91fccbf06f34148015c3f159e2d..66d2df76d5eefa67bbe7fda5a7030e12167450ac 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -2076,7 +2076,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware } @Override - public void deleteSortOrder (SortOrder sortOrder) { + public void deleteSortOrder(SortOrder sortOrder) { try { this.deleteDocument(sortOrder.get_id()); return; @@ -2084,4 +2084,41 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware LOGGER.error("Could not delete SortOrder {}", sortOrder.get_id()); } } + + @Override + public List<Question> getQuestionsByIds(List<String> ids) { + String viewName = "skill_question/questions_by_ids"; + NovaView view = new NovaView(viewName); + view.setKeys(ids); + view.setIncludeDocs(true); + final List<Document> questiondocs = getDatabase().view(view).getResults(); + if (questiondocs == null || questiondocs.isEmpty()) { + return null; + } + final List<Question> result = new ArrayList<Question>(); + + final MorpherRegistry morpherRegistry = JSONUtils.getMorpherRegistry(); + final Morpher dynaMorpher = new BeanMorpher(PossibleAnswer.class, morpherRegistry); + morpherRegistry.registerMorpher(dynaMorpher); + for (final Document document : questiondocs) { + final Question question = (Question) JSONObject.toBean( + document.getJSONObject().getJSONObject("value"), + Question.class + ); + @SuppressWarnings("unchecked") + final Collection<PossibleAnswer> answers = JSONArray.toCollection( + document.getJSONObject().getJSONObject("value").getJSONArray("possibleAnswers"), + PossibleAnswer.class + ); + Session session = getSessionFromId(question.getSessionId()); + question.setPossibleAnswers(new ArrayList<PossibleAnswer>(answers)); + question.setSessionKeyword(session.getKeyword()); + if (!"freetext".equals(question.getQuestionType()) && 0 == question.getPiRound()) { + /* needed for legacy questions whose piRound property has not been set */ + question.setPiRound(1); + } + result.add(question); + } + return result; + } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 4a7e200d164da2c0584f5540b399aae1194007d7..f7dee4433f9cd94ed8ce86d0df074b8b530ee8c6 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -207,4 +207,6 @@ public interface IDatabaseDao { SortOrder getSortOrder(String sessionkey, String questionVariant, String subject); void deleteSortOrder(SortOrder sortOrder); + + List<Question> getQuestionsByIds(List<String> ids); } diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java index 9efb4f63a0a9eeebc2300044de1bb36ce9775f35..a96772cd45d1eb553d42427f6e3c233b1b406d0c 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -941,35 +941,28 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis } public List<Question> getQuestionsBySortOrder(SortOrder subjectSortOrder, boolean onlyActive) { - if (subjectSortOrder.getSortOrder() == null) { - return null; - } if (subjectSortOrder.getSortOrder().isEmpty()) { return null; } - List<Question> questions = new ArrayList<Question>(); + List<String> questionIds = new ArrayList<String>(); List<String> subjects = subjectSortOrder.getSortOrder(); for (String sub : subjects) { SortOrder questionSortOrder = databaseDao.getSortOrder(subjectSortOrder.getSessionId(), subjectSortOrder.getQuestionVariant(), sub); if (questionSortOrder == null) { continue; } - List<String> questionIds = questionSortOrder.getSortOrder(); - for (String t : questionIds) { - Question tempQuestion = getQuestion(t); - if (tempQuestion == null) { - continue; - } - if (onlyActive) { - if (tempQuestion.isActive()) { - questions.add(tempQuestion); - } - } - else { - questions.add(tempQuestion); + questionIds.addAll(questionSortOrder.getSortOrder()); + } + List<Question> questions = databaseDao.getQuestionsByIds(questionIds); + + if (onlyActive) { + for (Question q : questions) { + if (!(q.isActive())) { + questions.remove(q); } } } + return questions; } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 78673c575f41937f956b8531d0489903deabd7d9..b0b232cc7846ccfb1319fef5ba860398333dc68c 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -603,4 +603,10 @@ public class StubDatabaseDao implements IDatabaseDao { public void deleteSortOrder(SortOrder sortOrder) { // TODO Auto-generated method stub } + + @Override + public List<Question> getQuestionsByIds(List<String> ids) { + // TODO Auto-generated method stub + return null; + } } \ No newline at end of file