diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index b8ccdd6335fd8b0f158f9c4902c3343941c231db..41cb1fd6e04a7fad74226fdab54763a1aa741fa1 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -266,7 +266,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware } private List<SessionInfo> getInfosForSessions(final List<Session> sessions) { - final ExtendedView questionCountView = new ExtendedView("skill_question/count_by_session"); + /* TODO: migrate to new view */ + final ExtendedView questionCountView = new ExtendedView("content/by_sessionid"); final ExtendedView answerCountView = new ExtendedView("skill_question/count_answers_by_session"); final ExtendedView interposedCountView = new ExtendedView("interposed_question/count_by_session"); final ExtendedView unredInterposedCountView = new ExtendedView("interposed_question/count_by_session_reading"); @@ -288,7 +289,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware private List<SessionInfo> getInfosForVisitedSessions(final List<Session> sessions, final User user) { final ExtendedView answeredQuestionsView = new ExtendedView("answer/by_user"); - final ExtendedView questionIdsView = new ExtendedView("skill_question/by_session_only_id_for_all"); + final ExtendedView questionIdsView = new ExtendedView("content/by_sessionid"); questionIdsView.setSessionIdKeys(sessions); List<String> answeredQuestionQueryKeys = new ArrayList<>(); for (Session s : sessions) { @@ -415,44 +416,44 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return sessionInfos; } - /** - * @deprecated The decision to load data depending on the user should be made by a service class, not this - * database class. Please use getSkillQuestionsForUsers or getSkillQuestionsForTeachers as this will enable - * caching. - */ - @Deprecated - @Override - public List<Question> getSkillQuestions(final User user, final Session session) { - String viewName; - if (session.getCreator().equals(user.getUsername())) { - viewName = "skill_question/by_session_sorted_by_subject_and_text"; - } else { - viewName = "skill_question/by_session_for_all_full"; - } - return getQuestions(new NovaView(viewName), session); - } - @Cacheable("skillquestions") @Override public List<Question> getSkillQuestionsForUsers(final Session session) { - String viewName = "skill_question/by_session_for_all_full"; - NovaView view = new NovaView(viewName); + final List<Question> questions = new ArrayList<>(); + final String viewName = "content/doc_by_sessionid_variant_active"; + final NovaView view1 = new NovaView(viewName); + final NovaView view2 = new NovaView(viewName); + final NovaView view3 = new NovaView(viewName); + view1.setStartKey(session.get_id(), "lecture", true); + view1.setEndKey(session.get_id(), "lecture", true, "{}"); + view2.setStartKey(session.get_id(), "preparation", true); + view2.setEndKey(session.get_id(), "preparation", true, "{}"); + view3.setStartKey(session.get_id(), "flashcard", true); + view3.setEndKey(session.get_id(), "flashcard", true, "{}"); + questions.addAll(getQuestions(view1, session)); + questions.addAll(getQuestions(view2, session)); + questions.addAll(getQuestions(view3, session)); - return getQuestions(view, session); + return questions; } @Cacheable("skillquestions") @Override public List<Question> getSkillQuestionsForTeachers(final Session session) { - String viewName = "skill_question/by_session_sorted_by_subject_and_text"; - NovaView view = new NovaView(viewName); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKey(session.get_id()); + view.setEndKey(session.get_id(), "{}"); return getQuestions(view, session); } @Override public int getSkillQuestionCount(final Session session) { - return getQuestionCount(new NovaView("skill_question/count_by_session"), session); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKey(session.get_id()); + view.setEndKey(session.get_id(), "{}"); + + return getQuestionCount(view); } @Override @@ -844,7 +845,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public List<String> getQuestionIds(final Session session, final User user) { - NovaView view = new NovaView("skill_question/by_session_only_id_for_all"); + NovaView view = new NovaView("content/by_sessionid_variant_active"); view.setKey(session.get_id()); return collectQuestionIds(view); } @@ -877,20 +878,21 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @CacheEvict(value = "flashcardquestions", key = "#session") }) @Override public int[] deleteAllQuestionsWithAnswers(final Session session) { - final NovaView view = new NovaView("skill_question/by_session"); - return deleteAllQuestionDocumentsWithAnswers(session, view); - } - - private int[] deleteAllQuestionDocumentsWithAnswers(final Session session, final NovaView view) { + final NovaView view = new NovaView("content/by_sessionid_variant_active"); view.setStartKeyArray(session.get_id()); view.setEndKey(session.get_id(), "{}"); + + return deleteAllQuestionDocumentsWithAnswers(view); + } + + private int[] deleteAllQuestionDocumentsWithAnswers(final NovaView view) { final ViewResults results = getDatabase().view(view); List<Question> questions = new ArrayList<>(); for (final Document d : results.getResults()) { final Question q = new Question(); q.set_id(d.getId()); - q.set_rev(d.getJSONObject("value").getString("_rev")); + q.set_rev(d.getString("value")); questions.add(q); } @@ -1811,16 +1813,18 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Cacheable("lecturequestions") @Override public List<Question> getLectureQuestionsForUsers(final Session session) { - String viewName = "skill_question/lecture_question_by_session_for_all"; - NovaView view = new NovaView(viewName); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "lecture", true); + view.setEndKeyArray(session.get_id(), "lecture", true, "{}"); return getQuestions(view, session); } @Override public List<Question> getLectureQuestionsForTeachers(final Session session) { - String viewName = "skill_question/lecture_question_by_session"; - NovaView view = new NovaView(viewName); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "lecture"); + view.setEndKeyArray(session.get_id(), "lecture", "{}"); return getQuestions(view, session); } @@ -1828,16 +1832,18 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Cacheable("flashcardquestions") @Override public List<Question> getFlashcardsForUsers(final Session session) { - String viewName = "skill_question/flashcard_by_session_for_all"; - NovaView view = new NovaView(viewName); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "flashcard", true); + view.setEndKeyArray(session.get_id(), "flashcard", true, "{}"); return getQuestions(view, session); } @Override public List<Question> getFlashcardsForTeachers(final Session session) { - String viewName = "skill_question/flashcard_by_session"; - NovaView view = new NovaView(viewName); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "flashcard"); + view.setEndKeyArray(session.get_id(), "{}"); return getQuestions(view, session); } @@ -1845,28 +1851,32 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Cacheable("preparationquestions") @Override public List<Question> getPreparationQuestionsForUsers(final Session session) { - String viewName = "skill_question/preparation_question_by_session_for_all"; - NovaView view = new NovaView(viewName); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "preparation", true); + view.setEndKeyArray(session.get_id(), "preparation", true, "{}"); return getQuestions(view, session); } @Override public List<Question> getPreparationQuestionsForTeachers(final Session session) { - String viewName = "skill_question/preparation_question_by_session"; - NovaView view = new NovaView(viewName); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "preparation"); + view.setEndKeyArray(session.get_id(), "preparation", "{}"); return getQuestions(view, session); } @Override public List<Question> getAllSkillQuestions(final Session session) { - return getQuestions(new NovaView("skill_question/by_session"), session); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id()); + view.setEndKeyArray(session.get_id(), "{}"); + + return getQuestions(view, session); } private List<Question> getQuestions(final NovaView view, final Session session) { - view.setStartKeyArray(session.get_id()); - view.setEndKeyArray(session.get_id(), "{}"); final ViewResults viewResults = getDatabase().view(view); if (viewResults == null || viewResults.isEmpty()) { return null; @@ -1891,21 +1901,33 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public int getLectureQuestionCount(final Session session) { - return getQuestionCount(new NovaView("skill_question/lecture_question_count_by_session"), session); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "lecture"); + view.setEndKeyArray(session.get_id(), "lecture", "{}"); + + return getQuestionCount(view); } @Override public int getFlashcardCount(final Session session) { - return getQuestionCount(new NovaView("skill_question/flashcard_count_by_session"), session); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "flashcard"); + view.setEndKeyArray(session.get_id(), "flashcard", "{}"); + + return getQuestionCount(view); } @Override public int getPreparationQuestionCount(final Session session) { - return getQuestionCount(new NovaView("skill_question/preparation_question_count_by_session"), session); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "preparation"); + view.setEndKeyArray(session.get_id(), "preparation", "{}"); + + return getQuestionCount(view); } - private int getQuestionCount(final NovaView view, final Session session) { - view.setKey(session.get_id()); + private int getQuestionCount(final NovaView view) { + view.setReduce(true); final ViewResults results = getDatabase().view(view); if (results.getJSONArray("rows").optJSONObject(0) == null) { return 0; @@ -1940,8 +1962,11 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @CacheEvict(value = "answers", allEntries = true)}) @Override public int[] deleteAllLectureQuestionsWithAnswers(final Session session) { - final NovaView view = new NovaView("skill_question/lecture_question_by_session"); - return deleteAllQuestionDocumentsWithAnswers(session, view); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "lecture"); + view.setEndKey(session.get_id(), "lecture", "{}"); + + return deleteAllQuestionDocumentsWithAnswers(view); } /* TODO: Only evict cache entry for the answer's question. This requires some refactoring. */ @@ -1951,8 +1976,11 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @CacheEvict(value = "answers", allEntries = true)}) @Override public int[] deleteAllFlashcardsWithAnswers(final Session session) { - final NovaView view = new NovaView("skill_question/flashcard_by_session"); - return deleteAllQuestionDocumentsWithAnswers(session, view); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "flashcard"); + view.setEndKey(session.get_id(), "flashcard", "{}"); + + return deleteAllQuestionDocumentsWithAnswers(view); } /* TODO: Only evict cache entry for the answer's question. This requires some refactoring. */ @@ -1962,8 +1990,11 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @CacheEvict(value = "answers", allEntries = true)}) @Override public int[] deleteAllPreparationQuestionsWithAnswers(final Session session) { - final NovaView view = new NovaView("skill_question/preparation_question_by_session"); - return deleteAllQuestionDocumentsWithAnswers(session, view); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "preparation"); + view.setEndKey(session.get_id(), "preparation", "{}"); + + return deleteAllQuestionDocumentsWithAnswers(view); } @Override @@ -2075,8 +2106,12 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public List<Question> publishAllQuestions(final Session session, final boolean publish) { - final List<Question> questions = getQuestions(new NovaView("skill_question/by_session"), session); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id()); + view.setEndKeyArray(session.get_id(), "{}"); + final List<Question> questions = getQuestions(view, session); getDatabaseDao().publishQuestions(session, publish, questions); + return questions; } @@ -2106,8 +2141,12 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public List<Question> setVotingAdmissionForAllQuestions(final Session session, final boolean disableVoting) { - final List<Question> questions = getQuestions(new NovaView("skill_question/by_session"), session); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id()); + view.setEndKeyArray(session.get_id(), "{}"); + final List<Question> questions = getQuestions(view, session); getDatabaseDao().setVotingAdmissions(session, disableVoting, questions); + return questions; } @@ -2142,7 +2181,10 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @CacheEvict(value = "answers", allEntries = true) @Override public int deleteAllQuestionsAnswers(final Session session) { - final List<Question> questions = getQuestions(new NovaView("skill_question/by_session"), session); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id()); + view.setEndKeyArray(session.get_id(), "{}"); + final List<Question> questions = getQuestions(view, session); getDatabaseDao().resetQuestionsRoundState(session, questions); return deleteAllAnswersForQuestions(questions); @@ -2152,7 +2194,10 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @CacheEvict(value = "answers", allEntries = true) @Override public int deleteAllPreparationAnswers(final Session session) { - final List<Question> questions = getQuestions(new NovaView("skill_question/preparation_question_by_session"), session); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "preparation"); + view.setEndKeyArray(session.get_id(), "preparation", "{}"); + final List<Question> questions = getQuestions(view, session); getDatabaseDao().resetQuestionsRoundState(session, questions); return deleteAllAnswersForQuestions(questions); @@ -2162,7 +2207,10 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @CacheEvict(value = "answers", allEntries = true) @Override public int deleteAllLectureAnswers(final Session session) { - final List<Question> questions = getQuestions(new NovaView("skill_question/lecture_question_by_session"), session); + final NovaView view = new NovaView("content/doc_by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), "lecture"); + view.setEndKeyArray(session.get_id(), "lecture", "{}"); + final List<Question> questions = getQuestions(view, session); getDatabaseDao().resetQuestionsRoundState(session, questions); return deleteAllAnswersForQuestions(questions); @@ -2551,14 +2599,9 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public List<String> getSubjects(Session session, String questionVariant) { - String viewString; - if ("lecture".equals(questionVariant)) { - viewString = "skill_question/lecture_question_subjects_by_session"; - } else { - viewString = "skill_question/preparation_question_subjects_by_session"; - } - NovaView view = new NovaView(viewString); - view.setKey(session.get_id()); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), questionVariant); + view.setEndKeyArray(session.get_id(), questionVariant, "{}"); ViewResults results = this.getDatabase().view(view); if (results.getJSONArray("rows").optJSONObject(0) == null) { @@ -2568,22 +2611,18 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware Set<String> uniqueSubjects = new HashSet<>(); for (final Document d : results.getResults()) { - uniqueSubjects.add(d.getString("value")); + uniqueSubjects.add(d.getJSONArray("key").getString(3)); } return new ArrayList<>(uniqueSubjects); } + /* TODO: remove if this method is no longer used */ @Override public List<String> getQuestionIdsBySubject(Session session, String questionVariant, String subject) { - String viewString; - if ("lecture".equals(questionVariant)) { - viewString = "skill_question/lecture_question_ids_by_session_and_subject"; - } else { - viewString = "skill_question/preparation_question_ids_by_session_and_subject"; - } - NovaView view = new NovaView(viewString); - view.setKey(session.get_id(), subject); + final NovaView view = new NovaView("content/by_sessionid_variant_active"); + view.setStartKeyArray(session.get_id(), questionVariant, 1, subject); + view.setEndKeyArray(session.get_id(), questionVariant, 1, subject, "{}"); ViewResults results = this.getDatabase().view(view); if (results.getJSONArray("rows").optJSONObject(0) == null) { @@ -2593,7 +2632,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware List<String> qids = new ArrayList<>(); for (final Document d : results.getResults()) { - final String s = d.getString("value"); + final String s = d.getId(); qids.add(s); } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index fad83e082e55b89104dfb66108ba541ac54fb161..68b0880eb66e68094c9a531023b71088a5f71a6b 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -89,12 +89,6 @@ public interface IDatabaseDao { Question getQuestion(String id); - /** - * @deprecated Use getSkillQuestionsForUsers or getSkillQuestionsForTeachers - */ - @Deprecated - List<Question> getSkillQuestions(User user, Session session); - List<Question> getSkillQuestionsForUsers(Session session); List<Question> getSkillQuestionsForTeachers(Session session); diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index b43af7f4aeb857d91dcaf886e8f9305837e036f3..eeac36d7539571479b13f0bd311837bd67baaa77 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -147,18 +147,6 @@ public class StubDatabaseDao implements IDatabaseDao { return null; } - @Override - public List<Question> getSkillQuestions(User user, Session session) { - if (session == null) { - throw new NotFoundException(); - } - List<Question> questions = stubQuestions.get(session.getKeyword()); - if (questions == null) { - throw new NoContentException(); - } - return questions; - } - @Override public int getSkillQuestionCount(Session session) { return stubQuestions.get(session.getKeyword()).size();