Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieSessionDAO.java =================================================================== diff -u -r2db58f73e88ecef930d486c60cc53fb3fa483415 -r682279f3b246b3293dd9a4b550a06767949499ac --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieSessionDAO.java (.../ScratchieSessionDAO.java) (revision 2db58f73e88ecef930d486c60cc53fb3fa483415) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieSessionDAO.java (.../ScratchieSessionDAO.java) (revision 682279f3b246b3293dd9a4b550a06767949499ac) @@ -43,10 +43,8 @@ void deleteBySessionId(Long toolSessionId); - List getRawLeaderMarksByToolContentId(Long toolContentId); + List getRawLeaderMarksByToolContentId(Long toolContentId); - Object[] getStatsMarksForLeaders(Long toolContentId); - /** * Returns all session ids where specified qbQuestionUid is used with the given answer */ Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieSessionDAOHibernate.java =================================================================== diff -u -r83fc3f4fbaa1c8985a2ecdaa48627c489b515a66 -r682279f3b246b3293dd9a4b550a06767949499ac --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieSessionDAOHibernate.java (.../ScratchieSessionDAOHibernate.java) (revision 83fc3f4fbaa1c8985a2ecdaa48627c489b515a66) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieSessionDAOHibernate.java (.../ScratchieSessionDAOHibernate.java) (revision 682279f3b246b3293dd9a4b550a06767949499ac) @@ -30,8 +30,6 @@ import org.hibernate.query.NativeQuery; import org.hibernate.query.Query; -import org.hibernate.type.FloatType; -import org.hibernate.type.IntegerType; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.tool.scratchie.dao.ScratchieSessionDAO; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswerVisitLog; @@ -52,11 +50,6 @@ private static final String LOAD_MARKS = "SELECT mark FROM tl_lascrt11_session session " + " JOIN tl_lascrt11_scratchie scratchie ON session.scratchie_uid = scratchie.uid " + " WHERE session.scratching_finished = 1 AND scratchie.content_id = :toolContentId"; - - private static final String FIND_MARK_STATS = "SELECT MIN(mark) min_grade, AVG(mark) avg_grade, MAX(mark) max_grade, COUNT(mark) num_complete " - + " FROM tl_lascrt11_session session " - + " JOIN tl_lascrt11_scratchie scratchie ON session.scratchie_uid = scratchie.uid " - + " WHERE session.scratching_finished = 1 AND scratchie.content_id = :toolContentId"; @SuppressWarnings("rawtypes") @Override @@ -91,28 +84,13 @@ @SuppressWarnings("unchecked") @Override - public List getRawLeaderMarksByToolContentId(Long toolContentId) { - NativeQuery query = getSession().createNativeQuery(LOAD_MARKS); + public List getRawLeaderMarksByToolContentId(Long toolContentId) { + NativeQuery query = getSession().createNativeQuery(LOAD_MARKS); query.setParameter("toolContentId", toolContentId); - return (List) query.list(); + return query.list(); } @Override - public Object[] getStatsMarksForLeaders(Long toolContentId) { - NativeQuery query = getSession().createNativeQuery(FIND_MARK_STATS) - .addScalar("min_grade", FloatType.INSTANCE).addScalar("avg_grade", FloatType.INSTANCE) - .addScalar("max_grade", FloatType.INSTANCE).addScalar("num_complete", IntegerType.INSTANCE); - query.setParameter("toolContentId", toolContentId); - @SuppressWarnings("unchecked") - List list = (List) query.list(); - if ((list == null) || (list.size() == 0)) { - return null; - } else { - return list.get(0); - } - } - - @Override public List getSessionIdsByQbQuestion(Long qbQuestionUid, String answer) { final String FIND_BY_QBQUESTION_AND_FINISHED = "SELECT DISTINCT session.sessionId FROM " + ScratchieItem.class.getName() + " AS item, " + ScratchieSession.class.getName() + " AS session, " Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/LeaderResultsDTO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r682279f3b246b3293dd9a4b550a06767949499ac --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/LeaderResultsDTO.java (.../LeaderResultsDTO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/LeaderResultsDTO.java (.../LeaderResultsDTO.java) (revision 682279f3b246b3293dd9a4b550a06767949499ac) @@ -21,62 +21,124 @@ * **************************************************************** */ - package org.lamsfoundation.lams.tool.scratchie.dto; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.lamsfoundation.lams.util.NumberUtil; + public class LeaderResultsDTO { private Long contentId; - private int numberGroupsLeaderFinished; - private String minMark; - private String maxMark; - private String avgMark; + private int count; + private Integer min; + private Integer max; + private Float average; + private Float median; + private Collection modes; - public LeaderResultsDTO() { - } - - public LeaderResultsDTO(Long contentId) { + public LeaderResultsDTO(Long contentId, List grades) { this.contentId = contentId; + + if (grades == null || grades.isEmpty()) { + return; + } + + float sum = 0; + min = Integer.MAX_VALUE; + max = Integer.MIN_VALUE; + for (Integer grade : grades) { + if (grade < min) { + min = grade; + } + if (grade > max) { + max = grade; + } + sum += grade; + } + + count = grades.size(); + average = sum / count; + + Collections.sort(grades); + median = grades.get(count / 2).floatValue(); + if (count % 2 == 0) { + median = (median + grades.get(count / 2 - 1)) / 2; + } + + modes = grades.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) // grade -> its count + .entrySet().stream().collect(Collectors.groupingBy(Map.Entry::getValue, // convert to count -> grades that have this count (can be many) + TreeMap::new, Collectors.mapping(Map.Entry::getKey, Collectors.toCollection(TreeSet::new)))) + .lastEntry().getValue(); // get top count } public Long getContentId() { return contentId; } - public void setContentId(Long contentId) { - this.contentId = contentId; + public int getCount() { + return count; } - public int getNumberGroupsLeaderFinished() { - return numberGroupsLeaderFinished; + public Integer getMin() { + return min; } - public void setNumberGroupsLeaderFinished(int numberGroupsLeaderFinished) { - this.numberGroupsLeaderFinished = numberGroupsLeaderFinished; + public String getMinString() { + return LeaderResultsDTO.format(min); } - public String getAvgMark() { - return avgMark; + public Integer getMax() { + return max; } - public void setAvgMark(String avgMark) { - this.avgMark = avgMark; + public String getMaxString() { + return LeaderResultsDTO.format(max); } - public String getMinMark() { - return minMark; + public Float getAverage() { + return average; } - public void setMinMark(String minMark) { - this.minMark = minMark; + public String getAverageString() { + return LeaderResultsDTO.format(average); } - public String getMaxMark() { - return maxMark; + public Float getMedian() { + return median; } - public void setMaxMark(String maxMark) { - this.maxMark = maxMark; + public String getMedianString() { + return LeaderResultsDTO.format(median); } -} + public Collection getModes() { + return modes; + } + + public String getModesString() { + if (modes == null || modes.isEmpty()) { + return "-"; + } + + Iterator modeIterator = modes.iterator(); + StringBuilder result = new StringBuilder(LeaderResultsDTO.format(modeIterator.next())); + while (modeIterator.hasNext()) { + result.append(", ").append(LeaderResultsDTO.format(modeIterator.next())); + } + return result.toString(); + } + + private static String format(Number input) { + return input == null ? "-" : NumberUtil.formatLocalisedNumber(input, (Locale) null, 2); + } +} \ No newline at end of file Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java =================================================================== diff -u -r281e19ba98aa6bf38fc1f25507a9098304d668fb -r682279f3b246b3293dd9a4b550a06767949499ac --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision 281e19ba98aa6bf38fc1f25507a9098304d668fb) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision 682279f3b246b3293dd9a4b550a06767949499ac) @@ -447,10 +447,10 @@ int getMaxPossibleScore(Scratchie scratchie); /** Get the raw marks for display in a graph in monitoring */ - List getMarksArray(Long contentId); + List getMarksArray(Long contentId); /** Get the statistics such as average, max, min for the marks. Used in monitoring */ - LeaderResultsDTO getLeaderResultsDTOForLeaders(Long contentId); + LeaderResultsDTO getLeaderResultsDTOForLeaders(Long toolContentId); Map prepareStudentChoicesData(Scratchie scratchie); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r82c531ec90377dbaf474edc1966f9490582a03ff -r682279f3b246b3293dd9a4b550a06767949499ac --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 82c531ec90377dbaf474edc1966f9490582a03ff) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 682279f3b246b3293dd9a4b550a06767949499ac) @@ -35,7 +35,6 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.SortedMap; @@ -113,7 +112,6 @@ import org.lamsfoundation.lams.util.FileUtil; import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; -import org.lamsfoundation.lams.util.NumberUtil; import org.lamsfoundation.lams.util.excel.ExcelRow; import org.lamsfoundation.lams.util.excel.ExcelSheet; @@ -1923,26 +1921,16 @@ } @Override - public List getMarksArray(Long toolContentId) { + public List getMarksArray(Long toolContentId) { return scratchieSessionDao.getRawLeaderMarksByToolContentId(toolContentId); } @Override - public LeaderResultsDTO getLeaderResultsDTOForLeaders(Long contentId) { - LeaderResultsDTO newDto = new LeaderResultsDTO(contentId); - Object[] markStats = scratchieSessionDao.getStatsMarksForLeaders(contentId); - if (markStats != null) { - newDto.setMinMark( - markStats[0] != null ? NumberUtil.formatLocalisedNumber((Float) markStats[0], (Locale) null, 2) - : "0.00"); - newDto.setAvgMark( - markStats[1] != null ? NumberUtil.formatLocalisedNumber((Float) markStats[1], (Locale) null, 2) - : "0.00"); - newDto.setMaxMark( - markStats[2] != null ? NumberUtil.formatLocalisedNumber((Float) markStats[2], (Locale) null, 2) - : "0.00"); - newDto.setNumberGroupsLeaderFinished((Integer) markStats[3]); - } + public LeaderResultsDTO getLeaderResultsDTOForLeaders(Long toolContentId) { + + List marks = scratchieSessionDao.getRawLeaderMarksByToolContentId(toolContentId); + LeaderResultsDTO newDto = new LeaderResultsDTO(toolContentId, marks); + return newDto; } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/MonitoringController.java =================================================================== diff -u -r67eb97d89e2400b6dfba6b978f608c376a25a00d -r682279f3b246b3293dd9a4b550a06767949499ac --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 67eb97d89e2400b6dfba6b978f608c376a25a00d) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 682279f3b246b3293dd9a4b550a06767949499ac) @@ -262,7 +262,7 @@ SessionMap sessionMap = getSessionMap(request); Scratchie scratchie = (Scratchie) sessionMap.get(ScratchieConstants.ATTR_SCRATCHIE); - List results = null; + List results = null; if (scratchie != null) { results = scratchieService.getMarksArray(scratchie.getContentId()); @@ -272,7 +272,7 @@ if (results != null) { responseJSON.set("data", JsonUtil.readArray(results)); } else { - responseJSON.set("data", JsonUtil.readArray(new Float[0])); + responseJSON.set("data", JsonUtil.readArray(new Integer[0])); } res.setContentType("application/json;charset=utf-8"); Index: lams_tool_scratchie/web/pages/monitoring/parts/statisticpart.jsp =================================================================== diff -u -r8d79fbc9e80429ecf01a5c571b710ad5b881a790 -r682279f3b246b3293dd9a4b550a06767949499ac --- lams_tool_scratchie/web/pages/monitoring/parts/statisticpart.jsp (.../statisticpart.jsp) (revision 8d79fbc9e80429ecf01a5c571b710ad5b881a790) +++ lams_tool_scratchie/web/pages/monitoring/parts/statisticpart.jsp (.../statisticpart.jsp) (revision 682279f3b246b3293dd9a4b550a06767949499ac) @@ -41,23 +41,23 @@ : - + - + - : + - - + @@ -66,26 +66,26 @@
- : + - +
- +
- : + - - +