diff --git a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java index f1b1c5be7e6fc7bf62727e3a506f99ac8be34e5a..3e4f7b3d5a4d23b48b83f81e4634cbc0b0c703ea 100644 --- a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java +++ b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java @@ -18,6 +18,7 @@ package de.thm.arsnova.controller; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; @@ -377,6 +378,16 @@ public class LecturerQuestionController extends AbstractController { return questionService.getAnswerCount(questionId); } + @RequestMapping(value = "/{questionId}/answerandabstentioncount", method = RequestMethod.GET) + public final List<Integer> getAnswerAndAbstentionCount(@PathVariable final String questionId) { + List<Integer> list = Arrays.asList( + questionService.getAnswerCount(questionId), + questionService.getAbstentionAnswerCount(questionId) + ); + + return list; + } + @RequestMapping(value = "/{questionId}/freetextanswer/", method = RequestMethod.GET) public final List<Answer> getFreetextAnswers(@PathVariable final String questionId) { return questionService.getFreetextAnswers(questionId); diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index fceb127446f3cbdb421f2eaf4b3fe9c921d5ec71..f439cbacbac7b811e0c4cafef6833c3764b3d163 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -183,18 +183,22 @@ public class CouchDBDao implements IDatabaseDao { private List<SessionInfo> getInfosForSessions(final List<Session> sessions) { final ExtendedView questionCountView = new ExtendedView("skill_question/count_by_session"); final ExtendedView answerCountView = new ExtendedView("skill_question/count_answers_by_session"); - final ExtendedView interposedCountView = new ExtendedView("interposed_question/count_by_session_reading"); + final ExtendedView interposedCountView = new ExtendedView("interposed_question/count_by_session"); + final ExtendedView unredInterposedCountView = new ExtendedView("interposed_question/count_by_session_reading"); + + interposedCountView.setSessionIdKeys(sessions); + interposedCountView.setGroup(true); questionCountView.setSessionIdKeys(sessions); questionCountView.setGroup(true); answerCountView.setSessionIdKeys(sessions); answerCountView.setGroup(true); - List<String> interposedQueryKeys = new ArrayList<String>(); + List<String> unredInterposedQueryKeys = new ArrayList<String>(); for (Session s : sessions) { - interposedQueryKeys.add("[\"" + s.get_id() + "\",\"unread\"]"); + unredInterposedQueryKeys.add("[\"" + s.get_id() + "\",\"unread\"]"); } - interposedCountView.setKeys(interposedQueryKeys); - interposedCountView.setGroup(true); - return getSessionInfoData(sessions, questionCountView, answerCountView, interposedCountView); + unredInterposedCountView.setKeys(unredInterposedQueryKeys); + unredInterposedCountView.setGroup(true); + return getSessionInfoData(sessions, questionCountView, answerCountView, interposedCountView, unredInterposedCountView); } private List<SessionInfo> getInfosForVisitedSessions(final List<Session> sessions, final User user) { @@ -273,10 +277,12 @@ public class CouchDBDao implements IDatabaseDao { private List<SessionInfo> getSessionInfoData(final List<Session> sessions, final ExtendedView questionCountView, final ExtendedView answerCountView, - final ExtendedView interposedCountView) { + final ExtendedView interposedCountView, + final ExtendedView unredInterposedCountView) { final ViewResults questionCountViewResults = getDatabase().view(questionCountView); final ViewResults answerCountViewResults = getDatabase().view(answerCountView); final ViewResults interposedCountViewResults = getDatabase().view(interposedCountView); + final ViewResults unredInterposedCountViewResults = getDatabase().view(unredInterposedCountView); Map<String, Integer> questionCountMap = new HashMap<String, Integer>(); for (final Document d : questionCountViewResults.getResults()) { @@ -288,13 +294,19 @@ public class CouchDBDao implements IDatabaseDao { } Map<String, Integer> interposedCountMap = new HashMap<String, Integer>(); for (final Document d : interposedCountViewResults.getResults()) { - interposedCountMap.put(d.getJSONArray("key").getString(0), d.getInt("value")); + interposedCountMap.put(d.getString("key"), d.getInt("value")); + } + Map<String, Integer> unredInterposedCountMap = new HashMap<String, Integer>(); + for (final Document d : unredInterposedCountViewResults.getResults()) { + unredInterposedCountMap.put(d.getJSONArray("key").getString(0), d.getInt("value")); } + List<SessionInfo> sessionInfos = new ArrayList<SessionInfo>(); for (Session session : sessions) { int numQuestions = 0; int numAnswers = 0; int numInterposed = 0; + int numUnredInterposed = 0; if (questionCountMap.containsKey(session.get_id())) { numQuestions = questionCountMap.get(session.get_id()); } @@ -304,10 +316,15 @@ public class CouchDBDao implements IDatabaseDao { if (interposedCountMap.containsKey(session.get_id())) { numInterposed = interposedCountMap.get(session.get_id()); } + if (unredInterposedCountMap.containsKey(session.get_id())) { + numUnredInterposed = unredInterposedCountMap.get(session.get_id()); + } + SessionInfo info = new SessionInfo(session); info.setNumQuestions(numQuestions); info.setNumAnswers(numAnswers); info.setNumInterposed(numInterposed); + info.setNumUnredInterposed(numUnredInterposed); sessionInfos.add(info); } return sessionInfos; @@ -771,7 +788,8 @@ public class CouchDBDao implements IDatabaseDao { return answers; } - private int getAbstentionAnswerCount(final String questionId) { + @Override + public int getAbstentionAnswerCount(final String questionId) { final NovaView view = new NovaView("skill_question/count_abstention_answers_by_question"); view.setKey(questionId); view.setGroup(true); @@ -792,6 +810,7 @@ public class CouchDBDao implements IDatabaseDao { if (results.getResults().size() == 0) { return 0; } + return results.getJSONArray("rows").optJSONObject(0).optInt("value"); } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 36b2f59d39459e047431c792736e1b1a407b2f4e..802240158f02a93e8f234b88ff56704e5470068d 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -75,6 +75,8 @@ public interface IDatabaseDao { List<Answer> getAnswers(String questionId, int piRound); int getAnswerCount(Question question, int piRound); + + int getAbstentionAnswerCount(String questionId); List<Answer> getFreetextAnswers(String questionId); diff --git a/src/main/java/de/thm/arsnova/entities/SessionInfo.java b/src/main/java/de/thm/arsnova/entities/SessionInfo.java index 8910586d0a6cebb6f3e3b6b8fb0fce32a34f1cdc..671211fabb068832bb82f3a961beb59b5a411a09 100644 --- a/src/main/java/de/thm/arsnova/entities/SessionInfo.java +++ b/src/main/java/de/thm/arsnova/entities/SessionInfo.java @@ -32,6 +32,7 @@ public class SessionInfo { private int numQuestions; private int numAnswers; private int numInterposed; + private int numUnredInterposed; private int numUnanswered; public SessionInfo(Session session) { @@ -130,4 +131,12 @@ public class SessionInfo { public void setCreationTime(long creationTime) { this.creationTime = creationTime; } + + public int getNumUnredInterposed() { + return numUnredInterposed; + } + + public void setNumUnredInterposed(int numUnredInterposed) { + this.numUnredInterposed = numUnredInterposed; + } } diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java index a0e05fa64dfc902995ae4d083485c0493cc41e44..a79438cc06fb9f1e63fc01acec509a2aa914a559 100644 --- a/src/main/java/de/thm/arsnova/services/IQuestionService.java +++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java @@ -91,7 +91,7 @@ public interface IQuestionService { int getPreparationQuestionCount(String sessionkey); - SimpleEntry<String,Integer> getAnswerCountByQuestion(String questionid); + SimpleEntry<String, List<Integer>> getAnswerAndAbstentionCountByQuestion(String questionid); int countLectureQuestionAnswers(String sessionkey); @@ -126,4 +126,6 @@ public interface IQuestionService { void deleteAllPreparationAnswers(String sessionkey); void deleteAllLectureAnswers(String sessionkey); + + int getAbstentionAnswerCount(String questionId); } diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java index d1c56f79609ffd1a52db81df8c3af5486c0f4ad5..0a25db46ae1cf73fbd5c85f30323e8385b8b0dca 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -19,6 +19,7 @@ package de.thm.arsnova.services; import java.util.AbstractMap; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -269,8 +270,20 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis if (question == null) { return 0; } + return databaseDao.getAnswerCount(question, question.getPiRound()); } + + @Override + @PreAuthorize("isAuthenticated()") + public int getAbstentionAnswerCount(final String questionId) { + final Question question = getQuestion(questionId); + if (question == null) { + return 0; + } + + return databaseDao.getAbstentionAnswerCount(questionId); + } @Override @PreAuthorize("isAuthenticated()") @@ -503,9 +516,13 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis @Override @PreAuthorize("isAuthenticated()") - public SimpleEntry<String,Integer> getAnswerCountByQuestion(final String questionid) { - final int questioncount = getAnswerCount(questionid); - return new AbstractMap.SimpleEntry<String, Integer>(questionid, questioncount); + public SimpleEntry<String,List<Integer>> getAnswerAndAbstentionCountByQuestion(final String questionid) { + final List<Integer> countList = Arrays.asList( + getAnswerCount(questionid), + getAbstentionAnswerCount(questionid) + ); + + return new AbstractMap.SimpleEntry<String, List<Integer>>(questionid, countList); } @Override diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java index f8a8dcc2760bc5fe7aee23565bc4308276610c80..c925e80ddd34407ed244b67aaea67d0d5fda169f 100644 --- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java +++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java @@ -420,7 +420,7 @@ public class ARSnovaSocketIOServer implements ApplicationListener<NovaEvent>, No public void visit(NewAnswerEvent event) { final String sessionKey = event.getSession().getKeyword(); this.reportAnswersToLecturerQuestionAvailable(event.getSession(), new Question(event.getQuestion())); - broadcastInSession(sessionKey, "countQuestionAnswersByQuestion", questionService.getAnswerCountByQuestion(event.getQuestion().get_id())); + broadcastInSession(sessionKey, "countQuestionAnswersByQuestion", questionService.getAnswerAndAbstentionCountByQuestion(event.getQuestion().get_id())); broadcastInSession(sessionKey, "countLectureQuestionAnswers", questionService.countLectureQuestionAnswersInternal(sessionKey)); broadcastInSession(sessionKey, "countPreparationQuestionAnswers", questionService.countPreparationQuestionAnswersInternal(sessionKey)); sendToUser(event.getUser(), "unansweredLecturerQuestions", questionService.getUnAnsweredLectureQuestionIds(sessionKey, event.getUser())); diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 4fad97d34bf85c163c55e6c14d9d7e6a127ad4b2..8a09d652ccb10b0d08070a0080287798ab24256a 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -567,4 +567,10 @@ public class StubDatabaseDao implements IDatabaseDao { // TODO Auto-generated method stub } + + @Override + public int getAbstentionAnswerCount(String questionId) { + // TODO Auto-generated method stub + return 0; + } }