From 07c1847d144e1e73cf37eb3b8cb51a8274d3fbf8 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Tue, 2 Jun 2015 22:36:22 +0200
Subject: [PATCH] Adjust database view queries based on pagination parameters

---
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 110 ++++++++++++++++--
 .../arsnova/services/IQuestionService.java    |   1 -
 2 files changed, 102 insertions(+), 9 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 7f739dfee..2c2cce39d 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -154,6 +154,12 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	@Override
 	public List<Session> getMySessions(final User user, final int start, final int limit) {
 		final NovaView view = new NovaView("session/by_creator");
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
 		view.setStartKeyArray(user.getUsername());
 		view.setEndKeyArray(user.getUsername(), "{}");
 
@@ -406,14 +412,30 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	@Override
 	public List<Question> getSkillQuestionsForUsers(final Session session, final int start, final int limit) {
 		String viewName = "skill_question/by_session_for_all_full";
-		return getQuestions(new NovaView(viewName), session);
+		NovaView view = new NovaView(viewName);
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+
+		return getQuestions(view, session);
 	}
 
 	@Cacheable("skillquestions")
 	@Override
 	public List<Question> getSkillQuestionsForTeachers(final Session session, final int start, final int limit) {
 		String viewName = "skill_question/by_session_sorted_by_subject_and_text";
-		return getQuestions(new NovaView(viewName), session);
+		NovaView view = new NovaView(viewName);
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+
+		return getQuestions(view, session);
 	}
 
 	@Override
@@ -1013,6 +1035,12 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	public List<Answer> getFreetextAnswers(final String questionId, final int start, final int limit) {
 		final List<Answer> answers = new ArrayList<Answer>();
 		final NovaView view = new NovaView("skill_question/freetext_answers_full");
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
 		view.setKey(questionId);
 		final ViewResults results = getDatabase().view(view);
 		if (results.getResults().isEmpty()) {
@@ -1144,6 +1172,12 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	@Override
 	public List<InterposedQuestion> getInterposedQuestions(final Session session, final int start, final int limit) {
 		final NovaView view = new NovaView("interposed_question/by_session_full");
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
 		view.setKey(session.get_id());
 		final ViewResults questions = getDatabase().view(view);
 		if (questions == null || questions.isEmpty()) {
@@ -1155,6 +1189,12 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	@Override
 	public List<InterposedQuestion> getInterposedQuestions(final Session session, final User user, final int start, final int limit) {
 		final NovaView view = new NovaView("interposed_question/by_session_and_creator");
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
 		view.setKey(session.get_id(), user.getUsername());
 		final ViewResults questions = getDatabase().view(view);
 		if (questions == null || questions.isEmpty()) {
@@ -1278,6 +1318,12 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	@Override
 	public List<Session> getMyVisitedSessions(final User user, final int start, final int limit) {
 		final NovaView view = new NovaView("logged_in/visited_sessions_by_user");
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
 		view.setKey(user.getUsername());
 		final ViewResults sessions = getDatabase().view(view);
 		final List<Session> allSessions = new ArrayList<Session>();
@@ -1521,39 +1567,87 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	@Override
 	public List<Question> getLectureQuestionsForUsers(final Session session, final int start, final int limit) {
 		String viewName = "skill_question/lecture_question_by_session_for_all";
-		return getQuestions(new NovaView(viewName), session);
+		NovaView view = new NovaView(viewName);
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+
+		return getQuestions(view, session);
 	}
 
 	@Override
 	public List<Question> getLectureQuestionsForTeachers(final Session session, final int start, final int limit) {
 		String viewName = "skill_question/lecture_question_by_session";
-		return getQuestions(new NovaView(viewName), session);
+		NovaView view = new NovaView(viewName);
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+
+		return getQuestions(view, session);
 	}
 
 	@Cacheable("flashcardquestions")
 	@Override
 	public List<Question> getFlashcardsForUsers(final Session session, final int start, final int limit) {
 		String viewName = "skill_question/flashcard_by_session_for_all";
-		return getQuestions(new NovaView(viewName), session);
+		NovaView view = new NovaView(viewName);
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+
+		return getQuestions(view, session);
 	}
 
 	@Override
 	public List<Question> getFlashcardsForTeachers(final Session session, final int start, final int limit) {
 		String viewName = "skill_question/flashcard_by_session";
-		return getQuestions(new NovaView(viewName), session);
+		NovaView view = new NovaView(viewName);
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+
+		return getQuestions(view, session);
 	}
 
 	@Cacheable("preparationquestions")
 	@Override
 	public List<Question> getPreparationQuestionsForUsers(final Session session, final int start, final int limit) {
 		String viewName = "skill_question/preparation_question_by_session_for_all";
-		return getQuestions(new NovaView(viewName), session);
+		NovaView view = new NovaView(viewName);
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+
+		return getQuestions(view, session);
 	}
 
 	@Override
 	public List<Question> getPreparationQuestionsForTeachers(final Session session, final int start, final int limit) {
 		String viewName = "skill_question/preparation_question_by_session";
-		return getQuestions(new NovaView(viewName), session);
+		NovaView view = new NovaView(viewName);
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+
+		return getQuestions(view, session);
 	}
 
 	private List<Question> getQuestions(final NovaView view, final Session session) {
diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java
index ce28fdb87..1aebe6438 100644
--- a/src/main/java/de/thm/arsnova/services/IQuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java
@@ -73,7 +73,6 @@ public interface IQuestionService {
 
 	List<Answer> getFreetextAnswers(String questionId, int offset, int limit);
 
-
 	List<Answer> getMyAnswers(String sessionKey);
 
 	int getTotalAnswerCount(String sessionKey);
-- 
GitLab