summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2015-05-18 07:16:16 -0700
committerJesse Morgan <jesse@jesterpm.net>2015-05-18 07:16:16 -0700
commit2e76039d4ecaff8d2ed40b67c309c2498ff4a1d5 (patch)
tree30bc97d1148118adaca0d1b1a0e59bddaa2bcb87 /src
parentb5ad47d5b77bfc023b9d3d466f9fd9ed2c29a452 (diff)
Changing assessment scoring model.
Previously scores aligned on the answer values: 0 (seeker), 2, 3, and 4 (teacher). Now scores align halfway between: 0 (seeker), 1.5, 2.5, 3.5 (teacher)
Diffstat (limited to 'src')
-rw-r--r--src/com/p4square/grow/backend/resources/TrainingRecordResource.java36
-rw-r--r--src/com/p4square/grow/model/Score.java46
2 files changed, 60 insertions, 22 deletions
diff --git a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
index 4403b12..51ba56a 100644
--- a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
+++ b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
@@ -174,25 +174,35 @@ public class TrainingRecordResource extends ServerResource {
return null;
}
+ private Score getAssessedScore(String userId) throws IOException {
+ // Get the user's score.
+ Score assessedScore = new Score(0, 0);
+
+ String summaryString = mAnswerProvider.get(userId, "summary");
+ if (summaryString == null) {
+ throw new IOException("Asked to create training record for unassessed user " + userId);
+ }
+
+ Map<?,?> summary = MAPPER.readValue(summaryString, Map.class);
+
+ if (summary.containsKey("sum") && summary.containsKey("count")) {
+ double sum = (Double) summary.get("sum");
+ int count = (Integer) summary.get("count");
+ assessedScore = new Score(sum, count);
+ }
+
+ return assessedScore;
+ }
+
/**
* Mark the chapters which the user assessed through as not required.
*/
private void skipAssessedChapters(String userId, TrainingRecord record) {
// Get the user's score.
- double assessedScore = 0;
+ Score assessedScore = new Score(0, 0);
try {
- String summaryString = mAnswerProvider.get(userId, "summary");
- if (summaryString == null) {
- LOG.warn("Asked to create training record for unassessed user " + userId);
- return;
- }
- Map<?,?> summary = MAPPER.readValue(summaryString, Map.class);
-
- if (summary.containsKey("score")) {
- assessedScore = (Double) summary.get("score");
- }
-
+ assessedScore = getAssessedScore(userId);
} catch (IOException e) {
LOG.error("IOException fetching assessment record for " + userId, e);
return;
@@ -212,7 +222,7 @@ public class TrainingRecordResource extends ServerResource {
} else {
// Chapter required if the floor of the score is <= the chapter's numeric value.
- required = Math.floor(assessedScore) <= Score.numericScore(chapterId);
+ required = assessedScore.floor() <= Score.numericScore(chapterId);
}
if (!required) {
diff --git a/src/com/p4square/grow/model/Score.java b/src/com/p4square/grow/model/Score.java
index f7920dd..82f26c9 100644
--- a/src/com/p4square/grow/model/Score.java
+++ b/src/com/p4square/grow/model/Score.java
@@ -11,17 +11,20 @@ package com.p4square.grow.model;
*/
public class Score {
/**
- * Return the integer value for the given Score String.
+ * Return the decimal value for the given Score String.
+ *
+ * This method satisfies the invariant for Score x:
+ * numericScore(x.toString()) <= x.getScore()
*/
- public static int numericScore(String score) {
+ public static double numericScore(String score) {
if ("teacher".equals(score)) {
- return 4;
+ return 3.5;
} else if ("disciple".equals(score)) {
- return 3;
+ return 2.5;
} else if ("believer".equals(score)) {
- return 2;
+ return 1.5;
} else if ("seeker".equals(score)) {
- return 1;
+ return 0;
} else {
return Integer.MAX_VALUE;
}
@@ -35,6 +38,11 @@ public class Score {
count = 0;
}
+ public Score(double sum, int count) {
+ this.sum = sum;
+ this.count = count;
+ }
+
/**
* Copy Constructor.
*/
@@ -68,17 +76,37 @@ public class Score {
return sum / count;
}
+ /**
+ * @return the lowest score in the same category as this score.
+ */
+ public double floor() {
+ final double score = getScore();
+
+ if (score >= 3.5) {
+ return 3.5; // teacher
+
+ } else if (score >= 2.5) {
+ return 2.5; // disciple
+
+ } else if (score >= 1.5) {
+ return 1.5; // believer
+
+ } else {
+ return 0; // seeker
+ }
+ }
+
@Override
public String toString() {
final double score = getScore();
- if (score >= 4) {
+ if (score >= 3.5) {
return "teacher";
- } else if (score >= 3) {
+ } else if (score >= 2.5) {
return "disciple";
- } else if (score >= 2) {
+ } else if (score >= 1.5) {
return "believer";
} else {