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