@@ -143,6 +143,38 @@ public String handleRequest(@PathVariable Long studentId, Model model) {
143143 }
144144 model .addAttribute ("wordAssessmentEventCorrectCountList" , wordAssessmentEventCorrectCountList );
145145 model .addAttribute ("wordAssessmentEventIncorrectCountList" , wordAssessmentEventIncorrectCountList );
146+
147+ // Prepare chart data - Reading speed (words per minute)
148+ List <Double > readingSpeedAvgList = new ArrayList <>();
149+ if (!wordAssessmentEvents .isEmpty ()) {
150+ Map <String , Integer > eventCountByWeekMap = new HashMap <>();
151+ Map <String , Long > timeSpentMsSumByWeekMap = new HashMap <>();
152+ for (WordAssessmentEvent event : wordAssessmentEvents ) {
153+ String eventWeek = simpleDateFormat .format (event .getTimestamp ().getTime ());
154+ if (event .getMasteryScore () >= 0.5 ) {
155+ eventCountByWeekMap .put (eventWeek , eventCountByWeekMap .getOrDefault (eventWeek , 0 ) + 1 );
156+ timeSpentMsSumByWeekMap .put (eventWeek , eventCountByWeekMap .getOrDefault (eventWeek , 0 ) + event .getTimeSpentMs ());
157+ }
158+ }
159+ week = (Calendar ) calendar6MonthsAgo .clone ();
160+ while (!week .after (calendarNow )) {
161+ String weekAsString = simpleDateFormat .format (week .getTime ());
162+ Integer wordsReadCount = eventCountByWeekMap .getOrDefault (weekAsString , 0 );
163+ log .info ("wordsReadCount: " + wordsReadCount );
164+ Long timeSpentMsSum = timeSpentMsSumByWeekMap .getOrDefault (weekAsString , 0L );
165+ log .info ("timeSpentMsSum: " + timeSpentMsSum );
166+ Double timeSpentInMinutes = (double ) (timeSpentMsSum / 1_000 );
167+ log .info ("timeSpentInMinutes: " + timeSpentInMinutes );
168+ Double wordsPerMinute = 0.00 ;
169+ if (timeSpentInMinutes > 0 ) {
170+ wordsPerMinute = wordsReadCount / timeSpentInMinutes ;
171+ log .info ("wordsPerMinute: " + wordsPerMinute );
172+ }
173+ readingSpeedAvgList .add (wordsPerMinute );
174+ week .add (Calendar .WEEK_OF_YEAR , 1 );
175+ }
176+ }
177+ model .addAttribute ("readingSpeedAvgList" , readingSpeedAvgList );
146178
147179 // Prepare chart data - WordLearningEvents
148180 List <WordLearningEvent > wordLearningEvents = wordLearningEventDao .readAll (student .getAndroidId ());
0 commit comments