From 1b98f2b365c126ef8953c6120fe01126290b681a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=20K=C3=A4sler?= <tom.kaesler@mni.thm.de>
Date: Wed, 1 Apr 2015 13:37:59 +0200
Subject: [PATCH] change getQuestionsBySortOrder to fetch Questions in one
 single db request instead of requesting every document alone

---
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 39 ++++++++++++++++++-
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  2 +
 .../thm/arsnova/services/QuestionService.java | 27 +++++--------
 .../de/thm/arsnova/dao/StubDatabaseDao.java   |  6 +++
 4 files changed, 56 insertions(+), 18 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 4af6d92af..66d2df76d 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 4a7e200d1..f7dee4433 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 9efb4f63a..a96772cd4 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 78673c575..b0b232cc7 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
-- 
GitLab