From 64bfc50ecd7ddc9e325d5664570bcf81315d2e58 Mon Sep 17 00:00:00 2001 From: Christoph Thelen <christoph.thelen@mni.thm.de> Date: Fri, 6 Jun 2014 02:20:16 +0200 Subject: [PATCH] Implemented learning progress in just one CouchDB view --- .../java/de/thm/arsnova/dao/CouchDBDao.java | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 0b071513..113415a5 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -1323,42 +1323,41 @@ public class CouchDBDao implements IDatabaseDao { } @Override - public int getLearningProgress(final Session session) { - final NovaView courseView = new NovaView("learning_progress_course_value/course_value"); - final NovaView maximumView = new NovaView("learning_progress_maximum_value/maximum_value"); - courseView.setKey(session.get_id()); - maximumView.setKey(session.get_id()); + public int getLearningProgress(Session session) { + NovaView progressView = new NovaView("learning_progress/all"); + progressView.setStartKeyArray(session.get_id()); + progressView.setEndKeyArray(session.get_id(), "{}"); - return getProgressPercentage(courseView, maximumView); + List<Document> progressResults = this.getDatabase().view(progressView).getResults(); + // when filtering just by session, the query contains all three values. + return getProgressPercentage(progressResults, progressResults); } @Override - public int getMyLearningProgress(final Session session, final User user) { - final NovaView userView = new NovaView("learning_progress_user_value/user_value"); - final NovaView maximumView = new NovaView("learning_progress_maximum_value/maximum_value"); - userView.setKey(session.get_id(), user.getUsername()); - maximumView.setKey(session.get_id()); + public int getMyLearningProgress(Session session, User user) { + NovaView progressView = new NovaView("learning_progress/all"); + NovaView maximumView = new NovaView("learning_progress/all"); + progressView.setKey(session.get_id(), user.getUsername()); + maximumView.setStartKeyArray(session.get_id()); + maximumView.setEndKeyArray(session.get_id(), "{}"); - return getProgressPercentage(userView, maximumView); + List<Document> progressResults = this.getDatabase().view(progressView).getResults(); + List<Document> maximumResults = this.getDatabase().view(maximumView).getResults(); + return getProgressPercentage(progressResults, maximumResults); } - private int getProgressPercentage(final NovaView progressView, final NovaView maximumView) { - final List<Document> progressValue = getDatabase().view(progressView).getResults(); - final List<Document> maximumValue = getDatabase().view(maximumView).getResults(); - if (maximumValue.isEmpty()) { + private int getProgressPercentage(List<Document> progressResults, List<Document> maximumResults) { + if (progressResults.isEmpty() || maximumResults.isEmpty()) { return 0; } - final int maximum = maximumValue.get(0).getInt("value"); - int progress = 0; - if (!progressValue.isEmpty()) { - if (progressValue.get(0).optJSONArray("value").isArray()) { - JSONArray courseProgress = progressValue.get(0).getJSONArray("value"); - progress = courseProgress.getInt(0) / courseProgress.getInt(1); - } else { - progress = progressValue.get(0).getInt("value"); - } + final int max = maximumResults.get(0).getJSONArray("value").getInt(0); + JSONArray values = progressResults.get(0).getJSONArray("value"); + final int userResult = values.getInt(1); + final int numAnswers = values.getInt(2); + if (numAnswers == 0) { + return 0; } - final int percentage = (int)(progress * 100.0f / maximum); - return percentage < 0 ? 0 : percentage; + final int averageResult = userResult/numAnswers; + return (int)((averageResult * 100.0f) / max); } } -- GitLab