diff --git a/pom-dependency-tree.txt b/pom-dependency-tree.txt index dc8978d8e..ba16ef6d3 100644 --- a/pom-dependency-tree.txt +++ b/pom-dependency-tree.txt @@ -1,4 +1,4 @@ -ai.elimu:webapp:war:2.6.32-SNAPSHOT +ai.elimu:webapp:war:2.6.34-SNAPSHOT +- ai.elimu:model:jar:model-2.0.97:compile | \- com.google.code.gson:gson:jar:2.13.0:compile | \- com.google.errorprone:error_prone_annotations:jar:2.37.0:compile diff --git a/src/main/java/ai/elimu/web/analytics/students/StudentController.java b/src/main/java/ai/elimu/web/analytics/students/StudentController.java index eb0774d77..6bf905b19 100644 --- a/src/main/java/ai/elimu/web/analytics/students/StudentController.java +++ b/src/main/java/ai/elimu/web/analytics/students/StudentController.java @@ -143,6 +143,38 @@ public String handleRequest(@PathVariable Long studentId, Model model) { } model.addAttribute("wordAssessmentEventCorrectCountList", wordAssessmentEventCorrectCountList); model.addAttribute("wordAssessmentEventIncorrectCountList", wordAssessmentEventIncorrectCountList); + + // Prepare chart data - Reading speed (words per minute) + List readingSpeedAvgList = new ArrayList<>(); + if (!wordAssessmentEvents.isEmpty()) { + Map eventCountByWeekMap = new HashMap<>(); + Map timeSpentMsSumByWeekMap = new HashMap<>(); + for (WordAssessmentEvent event : wordAssessmentEvents) { + String eventWeek = simpleDateFormat.format(event.getTimestamp().getTime()); + if (event.getMasteryScore() >= 0.5) { + eventCountByWeekMap.put(eventWeek, eventCountByWeekMap.getOrDefault(eventWeek, 0) + 1); + timeSpentMsSumByWeekMap.put(eventWeek, eventCountByWeekMap.getOrDefault(eventWeek, 0) + event.getTimeSpentMs()); + } + } + week = (Calendar) calendar6MonthsAgo.clone(); + while (!week.after(calendarNow)) { + String weekAsString = simpleDateFormat.format(week.getTime()); + Integer wordsReadCount = eventCountByWeekMap.getOrDefault(weekAsString, 0); + log.info("wordsReadCount: " + wordsReadCount); + Long timeSpentMsSum = timeSpentMsSumByWeekMap.getOrDefault(weekAsString, 0L); + log.info("timeSpentMsSum: " + timeSpentMsSum); + Double timeSpentInMinutes = (double) (timeSpentMsSum / 1_000); + log.info("timeSpentInMinutes: " + timeSpentInMinutes); + Double wordsPerMinute = 0.00; + if (timeSpentInMinutes > 0) { + wordsPerMinute = wordsReadCount / timeSpentInMinutes; + log.info("wordsPerMinute: " + wordsPerMinute); + } + readingSpeedAvgList.add(wordsPerMinute); + week.add(Calendar.WEEK_OF_YEAR, 1); + } + } + model.addAttribute("readingSpeedAvgList", readingSpeedAvgList); // Prepare chart data - WordLearningEvents List wordLearningEvents = wordLearningEventDao.readAll(student.getAndroidId()); diff --git a/src/main/webapp/WEB-INF/jsp/analytics/students/id.jsp b/src/main/webapp/WEB-INF/jsp/analytics/students/id.jsp index cb1cc9213..673a82ee7 100644 --- a/src/main/webapp/WEB-INF/jsp/analytics/students/id.jsp +++ b/src/main/webapp/WEB-INF/jsp/analytics/students/id.jsp @@ -202,6 +202,34 @@
🔤 Words
+
Reading speed (correct words per minute)
+ + + +
+ Export to CSVvertical_align_bottom