diff --git a/.gitignore b/.gitignore index 043004ca4b70cbf09120b936500595f19d034055..fb7773093c65498cdb1b57bcdb3ff03623b5089a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ target/* chromedriver.log .checkstyle +/target diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index d33d692bdc5fa73cd88ef60df5c33957b704d9d1..559e5964383c271fac2c59ef9ed1c4d72d8be43e 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -23,6 +23,8 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; +import java.util.AbstractMap; +import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -1323,42 +1325,44 @@ 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 SimpleEntry<Integer,Integer> 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(); + + int myprogress = getProgressPercentage(progressResults, maximumResults); + int courseprogress = getProgressPercentage(maximumResults, maximumResults); + return new AbstractMap.SimpleEntry<Integer, Integer>(myprogress, courseprogress); } - 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()) { - final 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); } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 948402374f93dff6c72961635840580a47a06bce..40bb3f97ca33db3970cc8dd5f04f072f5d879471 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -19,6 +19,7 @@ package de.thm.arsnova.dao; +import java.util.AbstractMap.SimpleEntry; import java.util.List; import de.thm.arsnova.connector.model.Course; @@ -164,5 +165,5 @@ public interface IDatabaseDao { int getLearningProgress(Session session); - int getMyLearningProgress(Session session, User user); + SimpleEntry<Integer, Integer> getMyLearningProgress(Session session, User user); }