diff --git a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java index 0be4a5b80578a4ad192ed8f55715f6ecf9b3e511..1a476d2dc58d64757b33fde0a6bb52350bcd6bc9 100644 --- a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java +++ b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java @@ -445,9 +445,9 @@ public class LecturerQuestionController extends AbstractController { @RequestMapping(value = "/getsubjectsort", method = RequestMethod.GET) public String getSubjectSortType( @RequestParam(required = true) final String sessionkey, - @RequestParam(required = true) final String isPreparation + @RequestParam(required = true) final String ispreparation ) { - return questionService.getSubjectSortType(sessionkey, isPreparation); + return questionService.getSubjectSortType(sessionkey, ispreparation); } @RequestMapping(value = "/setquestionsort", method = RequestMethod.POST) @@ -469,8 +469,8 @@ public class LecturerQuestionController extends AbstractController { public String getQuestionSortType( @RequestParam(required = true) final String sessionkey, @RequestParam(required = true) final String subject, - @RequestParam(required = true) final String isPreparation + @RequestParam(required = true) final String ispreparation ) { - return questionService.getQuestionSortType(sessionkey, isPreparation, subject); + return questionService.getQuestionSortType(sessionkey, ispreparation, subject); } } \ No newline at end of file diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 7ad3e3bf98cede52120800df91761f5ddd8ff81f..46d51d4dc12a447c53e841db7431c50665bb0543 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -1393,27 +1393,15 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Cacheable("lecturequestions") @Override - public List<Question> getLectureQuestionsForUsers(final Session session) { - SortOrder subjectSortOrder = getSortOrder(session.get_id(), "lecture", ""); - if (subjectSortOrder != null) { - return getQuestionsBySortOrder(subjectSortOrder, true); - } - else { - String viewName = "skill_question/lecture_question_by_session_for_all"; - return getQuestions(new NovaView(viewName), session); - } + public List<Question> getLectureQuestionsForUsers(final Session session) { + String viewName = "skill_question/lecture_question_by_session_for_all"; + return getQuestions(new NovaView(viewName), session); } @Override public List<Question> getLectureQuestionsForTeachers(final Session session) { - SortOrder subjectSortOrder = getSortOrder(session.get_id(), "lecture", ""); - if (subjectSortOrder != null) { - return getQuestionsBySortOrder(subjectSortOrder, true); - } - else { - String viewName = "skill_question/lecture_question_by_session"; - return getQuestions(new NovaView(viewName), session); - } + String viewName = "skill_question/lecture_question_by_session"; + return getQuestions(new NovaView(viewName), session); } @Cacheable("flashcardquestions") @@ -1432,26 +1420,14 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Cacheable("preparationquestions") @Override public List<Question> getPreparationQuestionsForUsers(final Session session) { - SortOrder subjectSortOrder = getSortOrder(session.get_id(), "preparation", ""); - if (subjectSortOrder != null) { - return getQuestionsBySortOrder(subjectSortOrder, true); - } - else { - String viewName = "skill_question/preparation_question_by_session_for_all"; - return getQuestions(new NovaView(viewName), session); - } + String viewName = "skill_question/preparation_question_by_session_for_all"; + return getQuestions(new NovaView(viewName), session); } @Override public List<Question> getPreparationQuestionsForTeachers(final Session session) { - SortOrder subjectSortOrder = getSortOrder(session.get_id(), "preparation", ""); - if (subjectSortOrder != null) { - return getQuestionsBySortOrder(subjectSortOrder, true); - } - else { - String viewName = "skill_question/preparation_question_by_session"; - return getQuestions(new NovaView(viewName), session); - } + String viewName = "skill_question/preparation_question_by_session"; + return getQuestions(new NovaView(viewName), session); } private List<Question> getQuestions(final NovaView view, final Session session) { @@ -1946,6 +1922,69 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware info.setNumUnredInterposed(unreadInterposed); return info; } + + @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()); + ViewResults results = this.getDatabase().view(view); + + if (results.getJSONArray("rows").optJSONObject(0) == null) { + return null; + } + + Set<String> uniqueSubjects = new HashSet(); + + for (final Document d : results.getResults()) { + uniqueSubjects.add(d.getJSONObject().getJSONArray("value").getString(0)); + } + + List<String> uniqueSubjectsList = new ArrayList(uniqueSubjects); + + return uniqueSubjectsList; + } + + @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()); + ViewResults results = this.getDatabase().view(view); + + if (results.getResults().isEmpty()) { + return null; + } + + List<String> qids = new ArrayList(); + + for (final Document d : results.getResults()) { + final String s = d.getJSONObject().getJSONArray("value").getString(0); + qids.add(s); + /*final Answer a = new Answer(); + a.setAnswerCount(d.getInt("value")); + a.setAbstentionCount(abstentionCount); + a.setQuestionId(d.getJSONObject().getJSONArray("key").getString(0)); + a.setPiRound(piRound); + final String answerText = d.getJSONObject().getJSONArray("key").getString(2); + a.setAnswerText("null".equals(answerText) ? null : answerText); + answers.add(a);*/ + } + + return qids; + } @Override public SortOrder getSortOrder(String sessionId, String questionVariant, String subject) { @@ -1958,16 +1997,18 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware } NovaView view = new NovaView(viewString); - view.setKey(sessionId); - view.setKey(subject); + view.setKey(sessionId, subject); ViewResults results = this.getDatabase().view(view); - if (results.getJSONArray("rows").optJSONObject(0) == null) { + if (results.getResults().isEmpty()) { return null; } - return (SortOrder) JSONObject.toBean(results.getJSONObject(), SortOrder.class); + return (SortOrder) JSONObject.toBean( + results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"), + SortOrder.class + ); } @Override @@ -1994,25 +2035,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return sortOrder; } catch (IOException e) { - LOGGER.error("Could not save user {}", sortOrder); + LOGGER.error("Could not save sort {}", sortOrder); } return null; } - - public List<Question> getQuestionsBySortOrder(SortOrder sortOrder, boolean onlyActive) { - List<Question> questions = new ArrayList<Question>(); - List<String> questionIds = sortOrder.getSortOrder(); - for (String t : questionIds) { - Question tempQuestion = getQuestion(t); - if (onlyActive) { - if (tempQuestion.isActive()) { - questions.add(tempQuestion); - } - } - else { - questions.add(tempQuestion); - } - } - return questions; - } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 693bcaba03bc8abe0e55c45c36528765324cad4f..8862e79574dce5c3c1302e5851f5ac773ed60072 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -197,6 +197,10 @@ public interface IDatabaseDao { SessionInfo importSession(User user, ImportExportSession importSession); Statistics getStatistics(); + + List<String> getSubjects(Session session, String questionVariant); + + List<String> getQuestionIdsBySubject(Session session, String questionVariant, String subject); SortOrder createOrUpdateSortOrder(SortOrder sortOrder); diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java index d286538705a3fc25ac69e75d04fb9bda5623823c..6fdd0d0fe1d3a22f9eeb3665070b48d9d6c5ef19 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.Dictionary; +import java.util.Collections; import de.thm.arsnova.exceptions.ForbiddenException; @@ -583,11 +584,15 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis @PreAuthorize("isAuthenticated()") public List<Question> getLectureQuestions(final String sessionkey) { final Session session = getSession(sessionkey); + SortOrder subjectSortOrder = databaseDao.getSortOrder(session.get_id(), "lecture", ""); + if (subjectSortOrder == null) { + subjectSortOrder = createSortOrder(session, "lecture", ""); + } final User user = userService.getCurrentUser(); if (session.isCreator(user)) { - return databaseDao.getLectureQuestionsForTeachers(session); + return getQuestionsBySortOrder(subjectSortOrder, false); } else { - return databaseDao.getLectureQuestionsForUsers(session); + return getQuestionsBySortOrder(subjectSortOrder, true); } } @@ -607,11 +612,15 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis @PreAuthorize("isAuthenticated()") public List<Question> getPreparationQuestions(final String sessionkey) { final Session session = getSession(sessionkey); + SortOrder subjectSortOrder = databaseDao.getSortOrder(session.get_id(), "preparation", ""); + if (subjectSortOrder == null) { + subjectSortOrder = createSortOrder(session, "preparation", ""); + } final User user = userService.getCurrentUser(); if (session.isCreator(user)) { - return databaseDao.getPreparationQuestionsForTeachers(session); + return getQuestionsBySortOrder(subjectSortOrder, false); } else { - return databaseDao.getPreparationQuestionsForUsers(session); + return getQuestionsBySortOrder(subjectSortOrder, true); } } @@ -829,9 +838,59 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis } return sortOrder; } + + public List<Question> getQuestionsBySortOrder(SortOrder sortOrder, boolean onlyActive) { + List<Question> questions = new ArrayList<Question>(); + List<String> questionIds = sortOrder.getSortOrder(); + for (String t : questionIds) { + Question tempQuestion = getQuestion(t); + if (onlyActive) { + if (tempQuestion.isActive()) { + questions.add(tempQuestion); + } + } + else { + questions.add(tempQuestion); + } + } + return questions; + } + + public SortOrder createSortOrder(Session session, String questionVariant, String subject) { + if ("".equals(subject)) { + SortOrder subjectSortOrder = new SortOrder(); + subjectSortOrder.setSortOrder(databaseDao.getSubjects(session, questionVariant)); + subjectSortOrder.setSubject(""); + subjectSortOrder.setSortType("alphabetical"); + subjectSortOrder.setQuestionVariant(questionVariant); + subjectSortOrder.setSessionId(session.get_id()); + alphabeticalSort(subjectSortOrder); + List<String> subjects = subjectSortOrder.getSortOrder(); + for (String sub : subjects) { + createSortOrder(session, questionVariant, sub); + } + return databaseDao.createOrUpdateSortOrder(subjectSortOrder); + } + else { + SortOrder sortOrder = new SortOrder(); + sortOrder.setSessionId(session.get_id()); + sortOrder.setSubject(subject); + sortOrder.setQuestionVariant(questionVariant); + sortOrder.setSortType("alphabetical"); + sortOrder.setSortOrder(databaseDao.getQuestionIdsBySubject(session, questionVariant, subject)); + alphabeticalSort(sortOrder); + return databaseDao.createOrUpdateSortOrder(sortOrder); + } + } public SortOrder alphabeticalSort(SortOrder sortOrder){ if ("".equals(sortOrder.getSubject())) { + List<String> subjects = sortOrder.getSortOrder(); + Collections.sort(subjects); + sortOrder.setSortOrder(subjects); + return sortOrder; + } + else { Hashtable<String, String> hash = new Hashtable(); for (String qid : sortOrder.getSortOrder()) { Question question = getQuestion(qid); @@ -839,6 +898,7 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis } List<String> sortList = new ArrayList(); List<String> keys = new ArrayList(hash.keySet()); + Collections.sort(keys); for (String textKey : keys) { sortList.add(hash.get(textKey)); }