diff options
Diffstat (limited to 'src/com/p4square/grow/backend/resources')
4 files changed, 33 insertions, 209 deletions
diff --git a/src/com/p4square/grow/backend/resources/Point.java b/src/com/p4square/grow/backend/resources/Point.java deleted file mode 100644 index e1b15a8..0000000 --- a/src/com/p4square/grow/backend/resources/Point.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.backend.resources; - -/** - * Simple double based point class. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -class Point { - public static Point valueOf(String str) { - final int comma = str.indexOf(','); - if (comma == -1) { - throw new IllegalArgumentException("Malformed point string"); - } - - final String sX = str.substring(0, comma); - final String sY = str.substring(comma + 1); - - return new Point(Double.valueOf(sX), Double.valueOf(sY)); - } - - private final double mX; - private final double mY; - - public Point(double x, double y) { - mX = x; - mY = y; - } - - public double distance(Point other) { - final double dx = mX - other.mX; - final double dy = mY - other.mY; - - return Math.sqrt(dx*dx + dy*dy); - } - - public double getX() { - return mX; - } - - public double getY() { - return mY; - } - - @Override - public String toString() { - return String.format("%.2f,%.2f", mX, mY); - } -} diff --git a/src/com/p4square/grow/backend/resources/Score.java b/src/com/p4square/grow/backend/resources/Score.java deleted file mode 100644 index 6f52c02..0000000 --- a/src/com/p4square/grow/backend/resources/Score.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.backend.resources; - -/** - * Simple structure containing a score's sum and count. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -class Score { - /** - * Return the integer value for the given Score String. - */ - public static int numericScore(String score) { - if ("teacher".equals(score)) { - return 4; - } else if ("disciple".equals(score)) { - return 3; - } else if ("believer".equals(score)) { - return 2; - } else { - return 1; - } - } - - double sum; - int count; - - @Override - public String toString() { - final double score = sum / count; - - if (score >= 4) { - return "teacher"; - - } else if (score >= 3) { - return "disciple"; - - } else if (score >= 2) { - return "believer"; - - } else { - return "seeker"; - } - } - -} diff --git a/src/com/p4square/grow/backend/resources/SurveyResultsResource.java b/src/com/p4square/grow/backend/resources/SurveyResultsResource.java index f0bb2aa..91d4d0f 100644 --- a/src/com/p4square/grow/backend/resources/SurveyResultsResource.java +++ b/src/com/p4square/grow/backend/resources/SurveyResultsResource.java @@ -14,16 +14,20 @@ import org.codehaus.jackson.map.ObjectMapper; import org.restlet.data.MediaType; import org.restlet.data.Status; -import org.restlet.resource.ServerResource; import org.restlet.representation.Representation; import org.restlet.representation.StringRepresentation; +import org.restlet.resource.ServerResource; import org.apache.log4j.Logger; -import com.p4square.grow.model.Answer; -import com.p4square.grow.model.Question; import com.p4square.grow.backend.GrowBackend; import com.p4square.grow.backend.db.CassandraDatabase; +import com.p4square.grow.model.Answer; +import com.p4square.grow.model.Question; +import com.p4square.grow.model.RecordedAnswer; +import com.p4square.grow.model.Score; +import com.p4square.grow.provider.Provider; + /** * Store the user's answers to the assessment and generate their score. @@ -31,15 +35,16 @@ import com.p4square.grow.backend.db.CassandraDatabase; * @author Jesse Morgan <jesse@jesterpm.net> */ public class SurveyResultsResource extends ServerResource { - private final static Logger cLog = Logger.getLogger(SurveyResultsResource.class); + private static final Logger LOG = Logger.getLogger(SurveyResultsResource.class); - private final static ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = new ObjectMapper(); static enum RequestType { ASSESSMENT, ANSWER } private CassandraDatabase mDb; + private Provider<String, Question> mQuestionProvider; private RequestType mRequestType; private String mUserId; @@ -51,6 +56,7 @@ public class SurveyResultsResource extends ServerResource { final GrowBackend backend = (GrowBackend) getApplication(); mDb = backend.getDatabase(); + mQuestionProvider = backend.getQuestionProvider(); mUserId = getAttribute("userId"); mQuestionId = getAttribute("questionId"); @@ -105,7 +111,7 @@ public class SurveyResultsResource extends ServerResource { success = true; } catch (Exception e) { - cLog.warn("Caught exception putting answer: " + e.getMessage(), e); + LOG.warn("Caught exception putting answer: " + e.getMessage(), e); } break; @@ -146,18 +152,30 @@ public class SurveyResultsResource extends ServerResource { continue; } - final String questionId = c.getName(); - final String answerId = c.getStringValue(); - if (!scoringDone) { - scoringDone = !scoreQuestion(score, questionId, answerId); + try { + Question question = mQuestionProvider.get(c.getName()); + RecordedAnswer userAnswer = MAPPER.readValue(c.getStringValue(), RecordedAnswer.class); + + if (question == null) { + LOG.warn("Answer for unknown question: " + c.getName()); + continue; + } + + LOG.error("Scoring questionId: " + c.getName()); + scoringDone = !question.scoreAnswer(score, userAnswer); + + } catch (Exception e) { + LOG.error("Failed to score question: {userid: \"" + mUserId + + "\", questionid:\"" + c.getName() + + "\", userAnswer:\"" + c.getStringValue() + "\"}", e); } totalAnswers++; } - sb.append(", \"score\":" + score.sum / score.count); - sb.append(", \"sum\":" + score.sum); - sb.append(", \"count\":" + score.count); + sb.append(", \"score\":" + score.getScore()); + sb.append(", \"sum\":" + score.getSum()); + sb.append(", \"count\":" + score.getCount()); sb.append(", \"totalAnswers\":" + totalAnswers); sb.append(", \"result\":\"" + score.toString() + "\""); } @@ -170,99 +188,4 @@ public class SurveyResultsResource extends ServerResource { return summary; } - - private boolean scoreQuestion(final Score score, final String questionId, - final String answerJson) { - - final String data = mDb.getKey("strings", "/questions/" + questionId); - - try { - final Map<?,?> questionMap = MAPPER.readValue(data, Map.class); - final Map<?,?> answerMap = MAPPER.readValue(answerJson, Map.class); - final Question question = new Question((Map<String, Object>) questionMap); - final String answerId = (String) answerMap.get("answerId"); - - switch (question.getType()) { - case TEXT: - case IMAGE: - final Answer answer = question.getAnswers().get(answerId); - if (answer == null) { - cLog.warn("Got unknown answer " + answerId - + " for question " + questionId); - } else { - if (!scoreAnswer(score, answer)) { - return false; // Quit scoring - } - } - break; - - case SLIDER: - score.sum += Double.valueOf(answerId) * 4 + 1; - score.count++; - break; - - case CIRCLE: - case QUAD: - scoreQuad(score, question, answerId); - break; - } - - } catch (Exception e) { - cLog.error("Exception parsing question id " + questionId, e); - } - - return true; - } - - private boolean scoreAnswer(final Score score, final Answer answer) { - switch (answer.getType()) { - case TRUMP: - score.sum = answer.getScoreFactor(); - score.count = 1; - return false; // Quit scoring. - - case AVERAGE: - score.sum += answer.getScoreFactor(); - score.count++; - break; - - case NONE: - break; - } - - return true; // Continue scoring - } - - private boolean scoreQuad(final Score score, final Question question, - final String answerId) { - - Point[] answers = new Point[question.getAnswers().size()]; - { - int i = 0; - for (String answer : question.getAnswers().keySet()) { - answers[i++] = Point.valueOf(answer); - } - } - - Point userAnswer = Point.valueOf(answerId); - - double minDistance = Double.MAX_VALUE; - int answerIndex = 0; - for (int i = 0; i < answers.length; i++) { - final double distance = userAnswer.distance(answers[i]); - if (distance < minDistance) { - minDistance = distance; - answerIndex = i; - } - } - - cLog.debug("Quad " + question.getId() + ": Got answer " - + answers[answerIndex].toString() + " for user point " + answerId); - - final Answer answer = question.getAnswers().get(answers[answerIndex].toString()); - score.sum += answer.getScoreFactor(); - score.count++; - - return true; // Continue scoring - } } diff --git a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java index 009d0fe..6de9507 100644 --- a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java +++ b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java @@ -27,6 +27,8 @@ import org.apache.log4j.Logger; import com.p4square.grow.backend.GrowBackend; import com.p4square.grow.backend.db.CassandraDatabase; +import com.p4square.grow.model.Score; + /** * * @author Jesse Morgan <jesse@jesterpm.net> |