From 824e96cef8baa4ebb456c67cb3168f0913829311 Mon Sep 17 00:00:00 2001 From: Christoph Thelen <christoph.thelen@mni.thm.de> Date: Wed, 22 Oct 2014 11:13:02 +0200 Subject: [PATCH] Only load data for visited sessions that is actually displayed --- .../java/de/thm/arsnova/dao/CouchDBDao.java | 104 +++++++++--------- 1 file changed, 49 insertions(+), 55 deletions(-) diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 98a4a8a8e..24a225137 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -156,77 +156,54 @@ public class CouchDBDao implements IDatabaseDao { throw new RuntimeException(e); } interposedCountView.setGroup(true); - return getSessionInfoData(sessions, questionCountView, answerCountView, interposedCountView, null, null); + return getSessionInfoData(sessions, questionCountView, answerCountView, interposedCountView); } private List<SessionInfo> getInfosForVisitedSessions(final List<Session> sessions, final User user) { - final ExtendedView questionCountView = new ExtendedView("skill_question/count_by_session"); - final ExtendedView answerCountView = new ExtendedView("skill_question/count_answers_by_session"); - final ExtendedView interposedCountUserView = new ExtendedView("interposed_question/count_by_session_reading_for_creator"); final ExtendedView answeredQuestionsView = new ExtendedView("answer/by_user"); final ExtendedView questionIdsView = new ExtendedView("skill_question/by_session_only_id_for_all"); - questionCountView.setSessionIdKeys(sessions); - questionCountView.setGroup(true); - answerCountView.setSessionIdKeys(sessions); - answerCountView.setGroup(true); questionIdsView.setSessionIdKeys(sessions); - List<String> interposedQueryKeys = new ArrayList<String>(); - for (Session s : sessions) { - interposedQueryKeys.add("[\"" + s.get_id() + "\",\"" + user.getUsername() + "\",\"unread\"]"); - } List<String> answeredQuestionQueryKeys = new ArrayList<String>(); for (Session s : sessions) { answeredQuestionQueryKeys.add("[\"" + user.getUsername() + "\",\"" + s.get_id() + "\"]"); } try { - interposedCountUserView.setKeys(URLEncoder.encode("["+StringUtils.join(interposedQueryKeys, ",")+"]", "UTF-8")); answeredQuestionsView.setKeys(URLEncoder.encode("["+StringUtils.join(answeredQuestionQueryKeys, ",")+"]", "UTF-8")); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } - interposedCountUserView.setGroup(true); - return getSessionInfoData(sessions, questionCountView, answerCountView, interposedCountUserView, answeredQuestionsView, questionIdsView); + return getVisitedSessionInfoData(sessions, answeredQuestionsView, questionIdsView); } - private List<SessionInfo> getSessionInfoData(final List<Session> sessions, - final ExtendedView questionCountView, - final ExtendedView answerCountView, - final ExtendedView interposedCountView, - final ExtendedView answeredQuestionsView, - final ExtendedView questionIdsView) { - final ViewResults questionCountViewResults = getDatabase().view(questionCountView); - final ViewResults answerCountViewResults = getDatabase().view(answerCountView); - final ViewResults interposedCountViewResults = getDatabase().view(interposedCountView); + private List<SessionInfo> getVisitedSessionInfoData(List<Session> sessions, + ExtendedView answeredQuestionsView, ExtendedView questionIdsView) { + final Map<String, Set<String>> answeredQuestionsMap = new HashMap<String, Set<String>>(); + final Map<String, Set<String>> questionIdMap = new HashMap<String, Set<String>>(); + final ViewResults answeredQuestionsViewResults = getDatabase().view(answeredQuestionsView); + final ViewResults questionIdsViewResults = getDatabase().view(questionIdsView); - Map<String, Set<String>> answeredQuestionsMap = new HashMap<String, Set<String>>(); - Map<String, Set<String>> questionIdMap = new HashMap<String, Set<String>>(); - if (answeredQuestionsView != null && questionIdsView != null) { - final ViewResults answeredQuestionsViewResults = getDatabase().view(answeredQuestionsView); - final ViewResults questionIdsViewResults = getDatabase().view(questionIdsView); - - // Maps a session ID to a set of question IDs of answered questions of that session - for (final Document d : answeredQuestionsViewResults.getResults()) { - final String sessionId = d.getJSONArray("key").getString(1); - final String questionId = d.getString("value"); - Set<String> questionIdsInSession = answeredQuestionsMap.get(sessionId); - if (questionIdsInSession == null) { - questionIdsInSession = new HashSet<String>(); - } - questionIdsInSession.add(questionId); - answeredQuestionsMap.put(sessionId, questionIdsInSession); + // Maps a session ID to a set of question IDs of answered questions of that session + for (final Document d : answeredQuestionsViewResults.getResults()) { + final String sessionId = d.getJSONArray("key").getString(1); + final String questionId = d.getString("value"); + Set<String> questionIdsInSession = answeredQuestionsMap.get(sessionId); + if (questionIdsInSession == null) { + questionIdsInSession = new HashSet<String>(); } + questionIdsInSession.add(questionId); + answeredQuestionsMap.put(sessionId, questionIdsInSession); + } - // Maps a session ID to a set of question IDs of that session - for (final Document d : questionIdsViewResults.getResults()) { - final String sessionId = d.getString("key"); - final String questionId = d.getId(); - Set<String> questionIdsInSession = questionIdMap.get(sessionId); - if (questionIdsInSession == null) { - questionIdsInSession = new HashSet<String>(); - } - questionIdsInSession.add(questionId); - questionIdMap.put(sessionId, questionIdsInSession); + // Maps a session ID to a set of question IDs of that session + for (final Document d : questionIdsViewResults.getResults()) { + final String sessionId = d.getString("key"); + final String questionId = d.getId(); + Set<String> questionIdsInSession = questionIdMap.get(sessionId); + if (questionIdsInSession == null) { + questionIdsInSession = new HashSet<String>(); } + questionIdsInSession.add(questionId); + questionIdMap.put(sessionId, questionIdsInSession); } // For each session, count the question IDs that are not yet answered @@ -245,6 +222,28 @@ public class CouchDBDao implements IDatabaseDao { unansweredQuestionsCountMap.put(s.get_id(), questionIdsInSession.size()); } + List<SessionInfo> sessionInfos = new ArrayList<SessionInfo>(); + for (Session session : sessions) { + int numUnanswered = 0; + + if (unansweredQuestionsCountMap.containsKey(session.get_id())) { + numUnanswered = unansweredQuestionsCountMap.get(session.get_id()); + } + SessionInfo info = new SessionInfo(session); + info.setNumUnanswered(numUnanswered); + sessionInfos.add(info); + } + return sessionInfos; + } + + private List<SessionInfo> getSessionInfoData(final List<Session> sessions, + final ExtendedView questionCountView, + final ExtendedView answerCountView, + final ExtendedView interposedCountView) { + final ViewResults questionCountViewResults = getDatabase().view(questionCountView); + final ViewResults answerCountViewResults = getDatabase().view(answerCountView); + final ViewResults interposedCountViewResults = getDatabase().view(interposedCountView); + Map<String, Integer> questionCountMap = new HashMap<String, Integer>(); for (final Document d : questionCountViewResults.getResults()) { questionCountMap.put(d.getString("key"), d.getInt("value")); @@ -262,7 +261,6 @@ public class CouchDBDao implements IDatabaseDao { int numQuestions = 0; int numAnswers = 0; int numInterposed = 0; - int numUnanswered = 0; if (questionCountMap.containsKey(session.get_id())) { numQuestions = questionCountMap.get(session.get_id()); } @@ -272,14 +270,10 @@ public class CouchDBDao implements IDatabaseDao { if (interposedCountMap.containsKey(session.get_id())) { numInterposed = interposedCountMap.get(session.get_id()); } - if (unansweredQuestionsCountMap.containsKey(session.get_id())) { - numUnanswered = unansweredQuestionsCountMap.get(session.get_id()); - } SessionInfo info = new SessionInfo(session); info.setNumQuestions(numQuestions); info.setNumAnswers(numAnswers); info.setNumInterposed(numInterposed); - info.setNumUnanswered(numUnanswered); sessionInfos.add(info); } return sessionInfos; -- GitLab