From aaadcc74633db063f28f9ddcc15ef1080722e18b Mon Sep 17 00:00:00 2001 From: Marcus Kammer Date: Wed, 19 Feb 2025 23:54:35 +0100 Subject: [PATCH] Add functions to parse questionnaires for assessments --- src/assessment/assessment.lisp | 43 +++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/assessment/assessment.lisp b/src/assessment/assessment.lisp index 41aa660..60b10b5 100644 --- a/src/assessment/assessment.lisp +++ b/src/assessment/assessment.lisp @@ -16,7 +16,8 @@ #:calculate-statistics #:average) (:export #:assessment-results-html - #:parse-assessments)) + #:parse-assessments + #:parse-questionnaires)) (in-package :ml-qmetrics/assessment) @@ -112,11 +113,14 @@ ENTRY: Entry from a response." (append (getf acc cat-name) value)) acc)) -(defun create-assessment (type responses) - (ecase type - (:visawi (make-instance 'visawi-assessment :responses responses)) - (:sus (make-instance 'sus-assessment :responses responses)) - (:nps (make-instance 'nps-assessment :responses responses)))) +(defun create-assessment (name responses) + (cond ((string= name "VISAWI") + (make-instance 'visawi-assessment :responses responses)) + ((string= name "SUS") + (make-instance 'sus-assessment :responses responses)) + ((string= name "NPS") + (make-instance 'nps-assessment :responses responses)) + (t nil))) (defun parse-assessments (categorized-responses) (loop for (type data) on categorized-responses by #'cddr @@ -127,6 +131,33 @@ ENTRY: Entry from a response." (mapcar entry-fn responses) :initial-value '())) +(defun extract-names (questionnaires) + "Extract unique names from a list of questionnaires." + (remove-duplicates (mapcar (lambda (q) + (getf q :name)) + questionnaires) + :test #'string=)) + +(defun filter-questionnaires (questionnaires name) + "Return a list of questionnaires with the given name." + (remove-if-not (lambda (q) + (string= (getf q :name) name)) + questionnaires)) + +(defun extract-data (questionnaire) + "Extract timestamp-created and post-params from a questionnaire." + (cons (getf questionnaire :timestamp-created) + (getf questionnaire :post-params))) + +(defun parse-questionnaires (questionnaires) + "Parse a list of questionnaires and create assessments for each unique name." + (let ((names (extract-names questionnaires))) + (mapcar (lambda (name) + (create-assessment (string-upcase name) + (mapcar #'extract-data + (filter-questionnaires questionnaires name)))) + names))) + (defun average-score-per-group (entry-fn responses) (let* ((values-per-group (aggregate-values-per-group entry-fn responses)) (average-scores (loop for (category values) on values-per-group by #'cddr