Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r58de3acfcde3052a939146df7d0172599e56633a -r87806866f673458de317c4d1c6656b3bf5a81039 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java =================================================================== diff -u -ra949c337adc53b2df9207aa1de6e500281de7c20 -r87806866f673458de317c4d1c6656b3bf5a81039 --- lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java (.../IGradebookDAO.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) +++ lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java (.../IGradebookDAO.java) (revision 87806866f673458de317c4d1c6656b3bf5a81039) @@ -60,13 +60,22 @@ long getMedianTimeTakenLesson(Long lessonID); long getMedianTimeTakenForActivity(Long activityID); + + long getMinTimeTakenForActivity(Long activityID); + long getMaxTimeTakenForActivity(Long activityID); + Double getAverageMarkForActivity(Long activityID); Double getAverageMarkForGroupedActivity(Long activityID, Long groupID); long getMedianTimeTakenForGroupedActivity(Long activityID, Long groupID); + + long getMinTimeTakenForGroupedActivity(Long activityID, Long groupID); + + long getMaxTimeTakenForGroupedActivity(Long activityID, Long groupID); + List getLessonsByGroupAndUser(final Integer userId, final Integer orgId, int page, int size, String sortBy, String sortOrder, String searchString); Index: lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java =================================================================== diff -u -ra949c337adc53b2df9207aa1de6e500281de7c20 -r87806866f673458de317c4d1c6656b3bf5a81039 --- lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) +++ lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision 87806866f673458de317c4d1c6656b3bf5a81039) @@ -226,9 +226,57 @@ return ((Number) result.get(0)).intValue() * 1000; } } + + + @Override + @SuppressWarnings("unchecked") + public long getMinTimeTakenForActivity(Long activityID) { + + final String GET_MIN_TIME_TAKEN_FOR_ACTIVITY = "SELECT MIN(t1.timeTaken) AS minVal FROM (" + + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(progress.completed_date_time, progress.start_date_time)) AS timeTaken" + + " FROM lams_progress_completed progress, (SELECT @rownum\\:=0) r" + + " WHERE progress.activity_id=:activityID AND TIMEDIFF(progress.completed_date_time, progress.start_date_time) IS NOT NULL" + + " ORDER BY TIMEDIFF(progress.completed_date_time, progress.start_date_time)" + + " ) AS t1 "; + + List result = getSession().createSQLQuery(GET_MIN_TIME_TAKEN_FOR_ACTIVITY) + .setLong("activityID", activityID.longValue()).list(); + + if (result == null || result.size() == 0 || result.get(0) == null) { + return 0; + } else { + //converting into milliseconds + return ((Number) result.get(0)).intValue() * 1000; + } + } + @Override @SuppressWarnings("unchecked") + public long getMaxTimeTakenForActivity(Long activityID) { + + final String GET_MAX_TIME_TAKEN_FOR_ACTIVITY = "SELECT MAX(t1.timeTaken) AS maxVal FROM (" + + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(progress.completed_date_time, progress.start_date_time)) AS timeTaken" + + " FROM lams_progress_completed progress, (SELECT @rownum\\:=0) r" + + " WHERE progress.activity_id=:activityID AND TIMEDIFF(progress.completed_date_time, progress.start_date_time) IS NOT NULL" + + " ORDER BY TIMEDIFF(progress.completed_date_time, progress.start_date_time)" + + " ) AS t1 "; + + + List result = getSession().createSQLQuery(GET_MAX_TIME_TAKEN_FOR_ACTIVITY) + .setLong("activityID", activityID.longValue()).list(); + + if (result == null || result.size() == 0 || result.get(0) == null) { + return 0; + } else { + //converting into milliseconds + return ((Number) result.get(0)).intValue() * 1000; + } + } + + + @Override + @SuppressWarnings("unchecked") public Double getAverageMarkForActivity(Long activityID) { List result = getSessionFactory().getCurrentSession().createQuery(GET_AVERAGE_MARK_FOR_ACTIVTY) .setLong("activityID", activityID.longValue()).list(); @@ -287,8 +335,55 @@ return ((Number) result.get(0)).intValue() * 1000; } } + + @Override + @SuppressWarnings("unchecked") + public long getMinTimeTakenForGroupedActivity(Long activityID, Long groupID) { + + final String GET_MIN_TIME_TAKEN_FOR_GROUPED_ACTIVITY = "SELECT MIN(t1.timeTaken) AS minVal FROM (" + + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)) AS timeTaken" + + " FROM lams_progress_completed compProgress, (SELECT @rownum\\:=0) r, lams_learner_progress progr, lams_user_group ug " + + " WHERE compProgress.activity_id=:activityID AND TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time) IS NOT NULL" + + " AND ug.group_id=:groupID AND compProgress.learner_progress_id = progr.learner_progress_id AND progr.user_id=ug.user_id " + + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" + + " ) AS t1"; + List result = getSession().createSQLQuery(GET_MIN_TIME_TAKEN_FOR_GROUPED_ACTIVITY) + .setLong("activityID", activityID.longValue()).setLong("groupID", groupID.longValue()).list(); + + if (result == null || result.size() == 0 || result.get(0) == null) { + return 0; + } else { + //converting into milliseconds + return ((Number) result.get(0)).intValue() * 1000; + } + } + + @Override + @SuppressWarnings("unchecked") + public long getMaxTimeTakenForGroupedActivity(Long activityID, Long groupID) { + + final String GET_MAX_TIME_TAKEN_FOR_GROUPED_ACTIVITY = "SELECT MAX(t1.timeTaken) AS maxVal FROM (" + + " SELECT @rownum\\:=@rownum+1 AS `rowNumber`, TIME_TO_SEC(TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)) AS timeTaken" + + " FROM lams_progress_completed compProgress, (SELECT @rownum\\:=0) r, lams_learner_progress progr, lams_user_group ug " + + " WHERE compProgress.activity_id=:activityID AND TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time) IS NOT NULL" + + " AND ug.group_id=:groupID AND compProgress.learner_progress_id = progr.learner_progress_id AND progr.user_id=ug.user_id " + + " ORDER BY TIMEDIFF(compProgress.completed_date_time, compProgress.start_date_time)" + + " ) AS t1"; + List result = getSession().createSQLQuery(GET_MAX_TIME_TAKEN_FOR_GROUPED_ACTIVITY) + .setLong("activityID", activityID.longValue()).setLong("groupID", groupID.longValue()).list(); + + if (result == null || result.size() == 0 || result.get(0) == null) { + return 0; + } else { + //converting into milliseconds + return ((Number) result.get(0)).intValue() * 1000; + } + } + + + @Override public List getLessonsByGroupAndUser(final Integer userId, final Integer orgId, int page, int size, String sortBy, String sortOrder, String searchString) { Index: lams_gradebook/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rb380240ba5ab7813174c6606f4ed67f254ec8e83 -r87806866f673458de317c4d1c6656b3bf5a81039 --- lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision b380240ba5ab7813174c6606f4ed67f254ec8e83) +++ lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 87806866f673458de317c4d1c6656b3bf5a81039) @@ -69,6 +69,8 @@ gradebook.export.learner.view =Learner view gradebook.export.time.taken.seconds =Time taken (seconds) gradebook.export.average.time.taken.seconds =Median time taken (seconds) +gradebook.export.max.time.taken.seconds =Maximum time taken (seconds) +gradebook.export.min.time.taken.seconds =Minimum time taken (seconds) gradebook.export.user =User gradebook.exportcourse.course.summary =Course summary gradebook.exportcourse.lessonFeedback =Lesson feedback Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java =================================================================== diff -u -r67e969ea1140cc5d811e298485cadf091af73b19 -r87806866f673458de317c4d1c6656b3bf5a81039 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java (.../GradebookGridRowDTO.java) (revision 67e969ea1140cc5d811e298485cadf091af73b19) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java (.../GradebookGridRowDTO.java) (revision 87806866f673458de317c4d1c6656b3bf5a81039) @@ -55,6 +55,12 @@ // Another unit of time that represents average time taken for a corresponding task protected Long medianTimeTaken; + + // Another unit of time that represents minimum time taken for a corresponding task + protected Long minTimeTaken; + + // Another unit of time that represents maximum time taken for a corresponding task + protected Long maxTimeTaken; // The mark for the corresponding gradebook grid row task protected Double mark; @@ -183,7 +189,40 @@ public void setMedianTimeTaken(Long medianTimeTaken) { this.medianTimeTaken = medianTimeTaken; } + + + public Long getMinTimeTaken() { + return minTimeTaken; + } + + public Long getMinTimeTakenSeconds() { + if (minTimeTaken != null) { + return minTimeTaken / 1000; + } else { + return null; + } + } + public void setMinTimeTaken(Long minTimeTaken) { + this.minTimeTaken = minTimeTaken; + } + + public Long getMaxTimeTaken() { + return maxTimeTaken; + } + + public Long getMaxTimeTakenSeconds() { + if (maxTimeTaken != null) { + return maxTimeTaken / 1000; + } else { + return null; + } + } + + public void setMaxTimeTaken(Long maxTimeTaken) { + this.maxTimeTaken = maxTimeTaken; + } + public Double getAverageMark() { return averageMark; } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -ra3549eb5e124fddc99947655db5cc3656f33449e -r87806866f673458de317c4d1c6656b3bf5a81039 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision a3549eb5e124fddc99947655db5cc3656f33449e) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 87806866f673458de317c4d1c6656b3bf5a81039) @@ -170,6 +170,8 @@ // Setting averages activityDTO.setAverageMark(gradebookDAO.getAverageMarkForActivity(activity.getActivityId())); activityDTO.setMedianTimeTaken(gradebookDAO.getMedianTimeTakenForActivity(activity.getActivityId())); + activityDTO.setMaxTimeTaken(gradebookDAO.getMaxTimeTakenForActivity(activity.getActivityId())); + activityDTO.setMinTimeTaken(gradebookDAO.getMinTimeTakenForActivity(activity.getActivityId())); // Get the tool outputs for this user if there are any ToolSession toolSession = toolService.getToolSessionByLearner(learner, activity); @@ -1006,22 +1008,26 @@ rowList.add(activityAverageTitle); // Setting up the activity summary table - ExcelCell[] activityAverageRow = new ExcelCell[4]; + ExcelCell[] activityAverageRow = new ExcelCell[6]; activityAverageRow[0] = new ExcelCell(getMessage("gradebook.export.activity"), true); activityAverageRow[1] = new ExcelCell(getMessage("gradebook.columntitle.competences"), true); activityAverageRow[2] = new ExcelCell(getMessage("gradebook.export.average.time.taken.seconds"), true); activityAverageRow[3] = new ExcelCell(getMessage("gradebook.columntitle.averageMark"), true); + activityAverageRow[4] = new ExcelCell(getMessage("gradebook.export.min.time.taken.seconds"), true); + activityAverageRow[5] = new ExcelCell(getMessage("gradebook.export.max.time.taken.seconds"), true); rowList.add(activityAverageRow); Iterator it = activityRows.iterator(); while (it.hasNext()) { GBActivityGridRowDTO activityRow = (GBActivityGridRowDTO) it.next(); // Add the activity average data - ExcelCell[] activityDataRow = new ExcelCell[4]; + ExcelCell[] activityDataRow = new ExcelCell[6]; activityDataRow[0] = new ExcelCell(activityRow.getRowName(), false); activityDataRow[1] = new ExcelCell(activityRow.getCompetences(), false); activityDataRow[2] = new ExcelCell(activityRow.getMedianTimeTakenSeconds(), false); activityDataRow[3] = new ExcelCell(activityRow.getAverageMark(), false); + activityDataRow[4] = new ExcelCell(activityRow.getMinTimeTakenSeconds(), false); + activityDataRow[5] = new ExcelCell(activityRow.getMaxTimeTakenSeconds(), false); rowList.add(activityDataRow); } rowList.add(GradebookService.EMPTY_ROW); @@ -1980,11 +1986,18 @@ .setAverageMark(gradebookDAO.getAverageMarkForGroupedActivity(activity.getActivityId(), groupId)); activityDTO.setMedianTimeTaken( gradebookDAO.getMedianTimeTakenForGroupedActivity(activity.getActivityId(), groupId)); + activityDTO.setMinTimeTaken( + gradebookDAO.getMinTimeTakenForGroupedActivity(activity.getActivityId(), groupId)); + activityDTO.setMaxTimeTaken( + gradebookDAO.getMaxTimeTakenForGroupedActivity(activity.getActivityId(), groupId)); } else { // Setting averages for lesson activityDTO.setAverageMark(gradebookDAO.getAverageMarkForActivity(activity.getActivityId())); activityDTO.setMedianTimeTaken(gradebookDAO.getMedianTimeTakenForActivity(activity.getActivityId())); + activityDTO.setMinTimeTaken(gradebookDAO.getMinTimeTakenForActivity(activity.getActivityId())); + activityDTO.setMaxTimeTaken(gradebookDAO.getMaxTimeTakenForActivity(activity.getActivityId())); + } // Set the possible marks if applicable