Index: lams_build/lib/lams/lams.jar =================================================================== RCS file: /usr/local/cvsroot/lams_build/lib/lams/lams.jar,v diff -u -r1.481 -r1.482 Binary files differ Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/language/lams/ApplicationResources.properties,v diff -u -r1.158 -r1.159 --- lams_central/conf/language/lams/ApplicationResources.properties 23 Dec 2015 15:07:51 -0000 1.158 +++ lams_central/conf/language/lams/ApplicationResources.properties 8 Jan 2016 05:43:11 -0000 1.159 @@ -677,4 +677,6 @@ label.like=Like label.dislike=Dislike label.no.comments=No Comments +label.newest.first=Newest First +label.top.comments=Top Comments #======= End labels: Exported 439 labels for en AU ===== Index: lams_central/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/language/lams/ApplicationResources_en_AU.properties,v diff -u -r1.122 -r1.123 --- lams_central/conf/language/lams/ApplicationResources_en_AU.properties 16 Dec 2015 11:15:22 -0000 1.122 +++ lams_central/conf/language/lams/ApplicationResources_en_AU.properties 8 Jan 2016 05:43:11 -0000 1.123 @@ -668,4 +668,6 @@ label.like=Like label.dislike=Dislike label.no.comments=No Comments +label.newest.first=Newest First +label.top.comments=Top Comments #======= End labels: Exported 439 labels for en AU ===== Index: lams_central/src/java/org/lamsfoundation/lams/comments/CommentConstants.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/comments/CommentConstants.java,v diff -u -r1.1 -r1.2 --- lams_central/src/java/org/lamsfoundation/lams/comments/CommentConstants.java 5 Jan 2016 05:43:46 -0000 1.1 +++ lams_central/src/java/org/lamsfoundation/lams/comments/CommentConstants.java 8 Jan 2016 05:42:17 -0000 1.2 @@ -42,11 +42,12 @@ public static final String ATTR_STATUS = "status"; public static final String ATTR_LIKE_AND_DISLIKE = "likeAndDislike"; public static final String ATTR_READ_ONLY = "readOnly"; - + public static final String ATTR_SORT_BY = "sortBy"; // 0 date, 1 likes + // for paging long topics & inlining reply public static final String PAGE_LAST_ID = "pageLastId"; - public static final String PAGE_SIZE = "size"; - public static final int DEFAULT_PAGE_SIZE = 2; + public static final String PAGE_SIZE = "pageSize"; + public static final int DEFAULT_PAGE_SIZE = 5; public static final String ATTR_NO_MORE_PAGES = "noMorePages"; public static final int MAX_BODY_LENGTH = 5000; Index: lams_central/src/java/org/lamsfoundation/lams/comments/web/CommentAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/comments/web/CommentAction.java,v diff -u -r1.3 -r1.4 --- lams_central/src/java/org/lamsfoundation/lams/comments/web/CommentAction.java 5 Jan 2016 05:43:46 -0000 1.3 +++ lams_central/src/java/org/lamsfoundation/lams/comments/web/CommentAction.java 8 Jan 2016 05:42:17 -0000 1.4 @@ -141,6 +141,8 @@ String mode; boolean likeAndDislike; boolean readOnly; + Integer pageSize; + Integer sortBy; // refresh forum page, not initial enter if (sessionMapID != null) { @@ -149,6 +151,8 @@ externalType = (Integer) sessionMap.get(CommentConstants.ATTR_EXTERNAL_TYPE); externalSignature = (String) sessionMap.get(CommentConstants.ATTR_EXTERNAL_SIG); mode = (String) sessionMap.get(AttributeNames.ATTR_MODE); + pageSize = (Integer) sessionMap.get(CommentConstants.PAGE_SIZE); + sortBy = (Integer) sessionMap.get(CommentConstants.ATTR_SORT_BY); } else { sessionMap = new SessionMap(); @@ -159,12 +163,21 @@ externalSignature = WebUtil.readStrParam(request, CommentConstants.ATTR_EXTERNAL_SIG); likeAndDislike = WebUtil.readBooleanParam(request, CommentConstants.ATTR_LIKE_AND_DISLIKE); readOnly = WebUtil.readBooleanParam(request, CommentConstants.ATTR_READ_ONLY); + pageSize = WebUtil.readIntParam(request, CommentConstants.PAGE_SIZE, true); + if ( pageSize == null ) + pageSize = CommentConstants.DEFAULT_PAGE_SIZE; + sortBy = (Integer) WebUtil.readIntParam(request, CommentConstants.ATTR_SORT_BY, true); + if ( sortBy == null ) + sortBy = ICommentService.SORT_BY_DATE; + sessionMap.put(CommentConstants.ATTR_EXTERNAL_ID, externalId); sessionMap.put(CommentConstants.ATTR_EXTERNAL_TYPE, externalType); sessionMap.put(CommentConstants.ATTR_EXTERNAL_SIG, externalSignature); sessionMap.put(CommentConstants.ATTR_LIKE_AND_DISLIKE, likeAndDislike); sessionMap.put(CommentConstants.ATTR_READ_ONLY, readOnly); - + sessionMap.put(CommentConstants.PAGE_SIZE, pageSize); + sessionMap.put(CommentConstants.ATTR_SORT_BY, sortBy); + mode = request.getParameter(AttributeNames.ATTR_MODE); sessionMap.put(AttributeNames.ATTR_MODE, mode != null ? mode : ToolAccessMode.LEARNER.toString()); } @@ -175,7 +188,7 @@ Comment rootComment = getCommentService().createOrGetRoot(externalId, externalType, externalSignature, user); sessionMap.put(CommentConstants.ATTR_ROOT_COMMENT_UID, rootComment.getUid()); - return viewTopicImpl(mapping, form, request, response, sessionMap); + return viewTopicImpl(mapping, form, request, response, sessionMap, pageSize, sortBy); } private void throwException(String msg, String loginName, Long externalId, Integer externalType, String externalSignature) throws ServletException { @@ -196,7 +209,8 @@ /** * Display the comments for a given external id (usually tool session id). The session comments will be - * arranged by Tree structure and loaded thread by thread (with paging). + * arranged by Tree structure and loaded thread by thread (with paging). This may set a new value of sort by, so + * make sure the session is updated. * * @param mapping * @param form @@ -210,12 +224,16 @@ String sessionMapID = WebUtil.readStrParam(request, CommentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - return viewTopicImpl(mapping, form, request, response, sessionMap); + Integer pageSize = WebUtil.readIntParam(request, CommentConstants.PAGE_SIZE, true); + Integer sortBy = WebUtil.readIntParam(request, CommentConstants.ATTR_SORT_BY, true); + if ( sortBy != null ) + sessionMap.put( CommentConstants.ATTR_SORT_BY, sortBy); + return viewTopicImpl(mapping, form, request, response, sessionMap, pageSize, sortBy); } private ActionForward viewTopicImpl(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response, SessionMap sessionMap) { + HttpServletResponse response, SessionMap sessionMap, Integer pageSize, Integer sortBy) { Long externalId = (Long) sessionMap.get(CommentConstants.ATTR_EXTERNAL_ID); Integer externalType = (Integer) sessionMap.get(CommentConstants.ATTR_EXTERNAL_TYPE); @@ -228,12 +246,20 @@ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); Long lastMsgSeqId = WebUtil.readLongParam(request, CommentConstants.PAGE_LAST_ID, true); - Integer pageSize = WebUtil.readIntParam(request, CommentConstants.PAGE_SIZE, true); - if ( pageSize == null || pageSize == 0 ) - pageSize = CommentConstants.DEFAULT_PAGE_SIZE; - - setupViewTopicPagedDTOList(request, externalId, externalType, externalSignature, sessionMap, user, lastMsgSeqId, pageSize); + String currentLikeCount = WebUtil.readStrParam(request, CommentConstants.ATTR_LIKE_COUNT, true); + if ( pageSize == null ) + pageSize = (Integer) sessionMap.get(CommentConstants.PAGE_SIZE); + if ( sortBy == null ) + sortBy = (Integer) sessionMap.get(CommentConstants.ATTR_SORT_BY); + + List msgDtoList = commentService.getTopicThread(externalId, externalType, externalSignature, lastMsgSeqId, pageSize, sortBy, currentLikeCount, user.getUserID()); + updateMessageFlag(msgDtoList, user.getUserID()); + request.setAttribute(CommentConstants.ATTR_COMMENT_THREAD, msgDtoList); + + // transfer SessionMapID as well + request.setAttribute(CommentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + return mapping.findForward("success"); } @@ -243,18 +269,6 @@ return (SessionMap) request.getSession().getAttribute(sessionMapId); } - private void setupViewTopicPagedDTOList(HttpServletRequest request, Long externalId, Integer externalType, String externalSignature, - SessionMap sessionMap, UserDTO user, Long lastMsgSeqId, Integer pageSize) { - - // get root topic list - List msgDtoList = commentService.getTopicThread(externalId, externalType, externalSignature, lastMsgSeqId, pageSize, user.getUserID()); - updateMessageFlag(msgDtoList, user.getUserID()); - request.setAttribute(CommentConstants.ATTR_COMMENT_THREAD, msgDtoList); - - // transfer SessionMapID as well - request.setAttribute(CommentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); - } - /** * Display the messages for a particular thread in a particular topic. Returns all messages for this thread - does not need paging. * @@ -275,7 +289,11 @@ // get forum user and forum UserDTO user = (UserDTO) SessionManager.getSession().getAttribute(AttributeNames.USER); Long threadId = WebUtil.readLongParam(request, CommentConstants.ATTR_THREAD_ID, true); - List msgDtoList = commentService.getThread(threadId, user.getUserID()); + Integer sortBy = WebUtil.readIntParam(request, CommentConstants.ATTR_SORT_BY, true); + if ( sortBy != null ) + sessionMap.put( CommentConstants.ATTR_SORT_BY, sortBy); + + List msgDtoList = commentService.getThread(threadId, sortBy, user.getUserID()); updateMessageFlag(msgDtoList, user.getUserID()); request.setAttribute(CommentConstants.ATTR_COMMENT_THREAD, msgDtoList); Index: lams_central/web/WEB-INF/tags/Comments.tag =================================================================== RCS file: /usr/local/cvsroot/lams_central/web/WEB-INF/tags/Comments.tag,v diff -u -r1.2 -r1.3 --- lams_central/web/WEB-INF/tags/Comments.tag 16 Dec 2015 11:15:22 -0000 1.2 +++ lams_central/web/WEB-INF/tags/Comments.tag 8 Jan 2016 05:43:11 -0000 1.3 @@ -1,3 +1,5 @@ +<%@ tag import="org.lamsfoundation.lams.comments.CommentConstants"%> + <%@ taglib uri="tags-core" prefix="c"%> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-function" prefix="fn" %> @@ -7,7 +9,12 @@ <%@ attribute name="height" required="false" rtexprvalue="true"%> <%@ attribute name="width" required="false" rtexprvalue="true"%> <%@ attribute name="mode" required="false" rtexprvalue="true"%> +<%@ attribute name="likeAndDislike" required="false" rtexprvalue="true"%> +<%@ attribute name="readOnly" required="false" rtexprvalue="true"%> +<%@ attribute name="pageSize" required="false" rtexprvalue="true"%> +<%@ attribute name="sortBy" required="false" rtexprvalue="true"%> + @@ -21,8 +28,24 @@ &mode=${mode} - + + + + + + + + + + + + + + + + + + + Index: lams_central/web/WEB-INF/tlds/lams/lams.tld =================================================================== RCS file: /usr/local/cvsroot/lams_central/web/WEB-INF/tlds/lams/lams.tld,v diff -u -r1.4 -r1.5 --- lams_central/web/WEB-INF/tlds/lams/lams.tld 15 Dec 2015 10:20:53 -0000 1.4 +++ lams_central/web/WEB-INF/tlds/lams/lams.tld 8 Jan 2016 05:43:11 -0000 1.5 @@ -481,9 +481,13 @@ head /WEB-INF/tags/Head.tag - + Comments /WEB-INF/tags/Comments.tag + + CommentsAuthor + /WEB-INF/tags/CommentsAuthor.tag + Index: lams_central/web/comments/comments.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_central/web/comments/comments.jsp,v diff -u -r1.4 -r1.5 --- lams_central/web/comments/comments.jsp 5 Jan 2016 05:43:46 -0000 1.4 +++ lams_central/web/comments/comments.jsp 8 Jan 2016 05:43:11 -0000 1.5 @@ -39,9 +39,28 @@
@@ -76,7 +71,7 @@
- +
Index: lams_central/web/comments/topicview.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_central/web/comments/topicview.jsp,v diff -u -r1.4 -r1.5 --- lams_central/web/comments/topicview.jsp 5 Jan 2016 05:43:46 -0000 1.4 +++ lams_central/web/comments/topicview.jsp 8 Jan 2016 05:43:11 -0000 1.5 @@ -1,6 +1,7 @@ <%@ page import="org.lamsfoundation.lams.comments.CommentConstants"%> + @@ -125,6 +126,9 @@ + + + @@ -165,7 +169,7 @@ Index: lams_common/src/java/org/lamsfoundation/lams/comments/dao/ICommentDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/comments/dao/ICommentDAO.java,v diff -u -r1.1 -r1.2 --- lams_common/src/java/org/lamsfoundation/lams/comments/dao/ICommentDAO.java 15 Dec 2015 10:17:27 -0000 1.1 +++ lams_common/src/java/org/lamsfoundation/lams/comments/dao/ICommentDAO.java 8 Jan 2016 05:48:17 -0000 1.2 @@ -22,8 +22,9 @@ */ public abstract Comment getRootTopic(Long externalId, Integer externalIdType, String externalSignature); - public abstract SortedSet getThreadByThreadId(Long threadCommentId, Integer userId); + public abstract SortedSet getThreadByThreadId(Long threadCommentId, Integer sortBy, Integer userId); - public abstract SortedSet getNextThreadByThreadId(final Long rootTopicId, final Long previousThreadMessageId, Integer numberOfThreads, Integer userId); + public abstract SortedSet getNextThreadByThreadId(final Long rootTopicId, final Long previousThreadMessageId, + Integer numberOfThreads, Integer sortBy, String extraSortParam, Integer userId); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/comments/dao/hibernate/CommentDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/comments/dao/hibernate/CommentDAO.java,v diff -u -r1.2 -r1.3 --- lams_common/src/java/org/lamsfoundation/lams/comments/dao/hibernate/CommentDAO.java 16 Dec 2015 11:15:33 -0000 1.2 +++ lams_common/src/java/org/lamsfoundation/lams/comments/dao/hibernate/CommentDAO.java 8 Jan 2016 05:48:17 -0000 1.3 @@ -25,6 +25,8 @@ package org.lamsfoundation.lams.comments.dao.hibernate; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; @@ -33,8 +35,9 @@ import org.hibernate.SQLQuery; import org.lamsfoundation.lams.comments.Comment; import org.lamsfoundation.lams.comments.dao.ICommentDAO; +import org.lamsfoundation.lams.comments.service.ICommentService; import org.lamsfoundation.lams.comments.util.TopicComparator; -import org.springframework.orm.hibernate3.HibernateTemplate; +import org.lamsfoundation.lams.comments.util.TopicComparatorLike; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** @@ -76,42 +79,30 @@ /* Thread based lookups - Returns a complex structure so that the likes information can be passed * back with it. */ - private static final String SQL_QUERY_FIND_FIRST_THREAD_TOP = "select uid from lams_comment" - + " where root_comment_uid = :rootUid and comment_level = 1 order by uid DESC"; - - private static final String SQL_QUERY_FIND_NEXT_THREAD_TOP = "select uid from lams_comment" - + " where root_comment_uid = :rootUid and uid < :lastUid and comment_level = 1 order by uid DESC"; - - private static final String SQL_QUERY_FIND_NEXT_THREAD_MESSAGES = + private static final String SQL_QUERY_GET_COMPLETE_THREAD = "SELECT c.*, SUM(l.vote) likes_total, l2.vote user_vote FROM lams_comment c " + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " - + " WHERE c.thread_comment_uid IN (:threadIds) " - + " GROUP BY c.uid"; - - private static final String SQL_QUERY_GET_COMPLETE_THREAD = - "SELECT c.*, SUM(l.vote) likes_total, l2.vote user_vote FROM lams_comment c " - + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " - + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " + " WHERE c.thread_comment_uid = :threadId " + " GROUP BY c.uid"; @Override @SuppressWarnings("unchecked") - public SortedSet getThreadByThreadId(Long threadCommentId, Integer userId) { + public SortedSet getThreadByThreadId(Long threadCommentId, Integer sortBy, Integer userId) { SQLQuery query = getSession().createSQLQuery(SQL_QUERY_GET_COMPLETE_THREAD); query.addEntity("comment", Comment.class) .addScalar("likes_total", Hibernate.INTEGER) .addScalar("user_vote", Hibernate.INTEGER) .setLong("userId", userId != null ? userId : 0) .setLong("threadId", threadCommentId); List results = query.list(); - return upgradeComments(results); + return upgradeComments(results, sortBy); } - private SortedSet upgradeComments(List rawObjects) { - SortedSet results = new TreeSet(new TopicComparator()); + private SortedSet upgradeComments(List rawObjects, Integer sortBy) { + Comparator comparator = ICommentService.SORT_BY_LIKE.equals(sortBy) ? new TopicComparatorLike() : new TopicComparator(); + SortedSet results = new TreeSet(comparator); for ( Object[] rawObject : rawObjects ) { Comment comment = (Comment) rawObject[0]; Integer likeCount = (Integer) rawObject[1]; @@ -124,34 +115,139 @@ } @Override - @SuppressWarnings("unchecked") - public SortedSet getNextThreadByThreadId(final Long rootTopicId, final Long previousThreadMessageId, Integer numberOfThreads, Integer userId) { + public SortedSet getNextThreadByThreadId(final Long rootTopicId, final Long previousThreadMessageId, + Integer numberOfThreads, Integer sortBy, String extraSortParam, Integer userId) { + if (ICommentService.SORT_BY_LIKE.equals(sortBy)) { + return getNextThreadByThreadIdLikes(rootTopicId, previousThreadMessageId, numberOfThreads, sortBy, extraSortParam, + userId); + } else { + return getNextThreadByThreadIdNewestFirst(rootTopicId, previousThreadMessageId, numberOfThreads, sortBy, userId); + } + + } + + private static final String SQL_QUERY_FIND_FIRST_THREAD_TOP_BY_UID = "SELECT uid FROM lams_comment" + + " WHERE root_comment_uid = :rootUid AND comment_level = 1 ORDER BY uid DESC"; + + private static final String SQL_QUERY_FIND_NEXT_THREAD_TOP = "SELECT uid FROM lams_comment" + + " WHERE root_comment_uid = :rootUid AND uid < :lastUid AND comment_level = 1 ORDER BY uid DESC"; + + private static final String SQL_QUERY_FIND_NEXT_THREAD_MESSAGES = + "SELECT c.*, SUM(l.vote) likes_total, l2.vote user_vote FROM lams_comment c " + + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " + + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " + + " WHERE c.thread_comment_uid IN (:threadIds) " + + " GROUP BY c.uid"; + + + @SuppressWarnings({"unchecked" }) + private SortedSet getNextThreadByThreadIdNewestFirst(final Long rootTopicId, + final Long previousThreadMessageId, Integer numberOfThreads, Integer sortBy, Integer userId) { + + // the search to get to the top level is quite light, so get just the uids + // then build a complete set. List threadUidList = null; if (previousThreadMessageId == null || previousThreadMessageId == 0L) { - threadUidList = (List) getSession().createSQLQuery(SQL_QUERY_FIND_FIRST_THREAD_TOP) + threadUidList = (List) getSession(). + createSQLQuery(SQL_QUERY_FIND_FIRST_THREAD_TOP_BY_UID) .setLong("rootUid", rootTopicId) .setMaxResults(numberOfThreads) .list(); } else { - threadUidList = (List) getSession().createSQLQuery(SQL_QUERY_FIND_NEXT_THREAD_TOP) + threadUidList = (List) getSession() + .createSQLQuery(SQL_QUERY_FIND_NEXT_THREAD_TOP) .setLong("rootUid", rootTopicId) .setLong("lastUid", previousThreadMessageId) .setMaxResults(numberOfThreads) .list(); } if (threadUidList != null && threadUidList.size() > 0) { - SQLQuery query = getSession().createSQLQuery(SQL_QUERY_FIND_NEXT_THREAD_MESSAGES); + SQLQuery query = getSession().createSQLQuery(SQL_QUERY_FIND_NEXT_THREAD_MESSAGES); query.addEntity("comment", Comment.class) .addScalar("likes_total", Hibernate.INTEGER) - .addScalar("user_vote", Hibernate.INTEGER) - .setLong("userId", userId != null ? userId : 0) - .setParameterList("threadIds", threadUidList); + .addScalar("user_vote", Hibernate.INTEGER) + .setLong("userId", userId != null ? userId : 0) + .setParameterList("threadIds", threadUidList); List results = query.list(); - return upgradeComments(results); + return upgradeComments(results, sortBy); } return new TreeSet(); } + + private static final String SQL_QUERY_FIND_FIRST_THREAD_TOP_BY_LIKES = "SELECT c.*, COALESCE(SUM(l.vote),0) likes_total, l2.vote user_vote" + + " FROM lams_comment c " + + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " + + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " + + " WHERE root_comment_uid = :rootUid AND comment_level = 1 " + + " GROUP BY c.uid " + + " ORDER BY likes_total DESC, c.uid DESC"; + private static final String SQL_QUERY_FIND_NEXT_THREAD_TOP_BY_LIKE = "SELECT * FROM ( " + + " SELECT c.*, COALESCE(SUM(l.vote),0) likes_total, l2.vote user_vote " + + " FROM lams_comment c " + + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " + + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " + + " WHERE root_comment_uid = :rootUid AND comment_level = 1 " + + " GROUP BY c.uid " + + " ORDER BY likes_total DESC, c.uid DESC) cl " + + " WHERE (cl.likes_total = :like AND cl.uid < :lastUid ) " + + " OR cl.likes_total < :like"; + + private static final String SQL_QUERY_FIND_NEXT_THREAD_MESSAGES_REPLIES_ONLY = + "SELECT c.*, COALESCE(SUM(l.vote),0) likes_total, l2.vote user_vote FROM lams_comment c " + + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " + + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " + + " WHERE c.thread_comment_uid IN (:threadIds) and comment_level > 1 " + + " GROUP BY c.uid"; + + @SuppressWarnings({ "unchecked" }) + private SortedSet getNextThreadByThreadIdLikes(final Long rootTopicId, final Long previousThreadMessageId, + Integer numberOfThreads, Integer sortBy, String extraSortParam, Integer userId) { + + // the search to get to the top level is quite heavy and involves grouping the likes, so get all the data + // for the top level then get the child replies. + List topThreadObjects = null; + if (previousThreadMessageId == null || previousThreadMessageId == 0L) { + topThreadObjects = (List) getSession().createSQLQuery(SQL_QUERY_FIND_FIRST_THREAD_TOP_BY_LIKES) + .addEntity("comment", Comment.class) + .addScalar("likes_total", Hibernate.INTEGER) + .addScalar("user_vote", Hibernate.INTEGER) + .setLong("rootUid", rootTopicId) + .setLong("userId", userId != null ? userId : 0) + .setMaxResults(numberOfThreads) + .list(); + } else { + // get more entries with the same number of likes or less likes + topThreadObjects = (List) getSession() + .createSQLQuery(SQL_QUERY_FIND_NEXT_THREAD_TOP_BY_LIKE) + .addEntity("comment", Comment.class) + .addScalar("likes_total", Hibernate.INTEGER) + .addScalar("user_vote", Hibernate.INTEGER) + .setLong("rootUid", rootTopicId) + .setLong("lastUid", previousThreadMessageId) + .setString("like", extraSortParam) + .setLong("userId", userId != null ? userId : 0) + .setMaxResults(numberOfThreads).list(); + } + if (topThreadObjects != null && topThreadObjects.size() > 0) { + // build the list of uids + List threadUidList = new ArrayList(); + for ( Object[] rawObject : topThreadObjects ) { + Comment comment = (Comment) rawObject[0]; + threadUidList.add(comment.getUid()); + } + SQLQuery query = getSession().createSQLQuery(SQL_QUERY_FIND_NEXT_THREAD_MESSAGES_REPLIES_ONLY); + query.addEntity("comment", Comment.class) + .addScalar("likes_total", Hibernate.INTEGER) + .addScalar("user_vote", Hibernate.INTEGER) + .setLong("userId", userId != null ? userId : 0) + .setParameterList("threadIds", threadUidList); + List results = query.list(); + topThreadObjects.addAll(results); + return upgradeComments(topThreadObjects, sortBy); + } + return new TreeSet(); + } } Index: lams_common/src/java/org/lamsfoundation/lams/comments/service/CommentService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/comments/service/CommentService.java,v diff -u -r1.2 -r1.3 --- lams_common/src/java/org/lamsfoundation/lams/comments/service/CommentService.java 5 Jan 2016 05:43:47 -0000 1.2 +++ lams_common/src/java/org/lamsfoundation/lams/comments/service/CommentService.java 8 Jan 2016 05:48:17 -0000 1.3 @@ -62,7 +62,8 @@ private ICommentLikeDAO commentLikeDAO; @Override - public List getTopicThread(Long externalId, Integer externalType, String externalSignature, Long lastCommentSeqId, Integer pageSize, Integer userId) { + public List getTopicThread(Long externalId, Integer externalType, String externalSignature, Long lastCommentSeqId, + Integer pageSize, Integer sortBy, String extraSortParam, Integer userId) { long lastThreadMessageUid = lastCommentSeqId != null ? lastCommentSeqId.longValue() : 0L; @@ -74,7 +75,7 @@ return new ArrayList(); } - SortedSet comments = commentDAO.getNextThreadByThreadId(rootTopic.getUid(), lastThreadMessageUid, pageSize, userId); + SortedSet comments = commentDAO.getNextThreadByThreadId(rootTopic.getUid(), lastThreadMessageUid, pageSize, sortBy, extraSortParam, userId); return getSortedCommentDTO(comments); } @@ -90,8 +91,8 @@ return msgDtoList; } - public List getThread( Long threadId, Integer userId ) { - SortedSet comments = commentDAO.getThreadByThreadId(threadId, userId); + public List getThread( Long threadId, Integer sortBy, Integer userId ) { + SortedSet comments = commentDAO.getThreadByThreadId(threadId, sortBy, userId); return getSortedCommentDTO(comments); } Index: lams_common/src/java/org/lamsfoundation/lams/comments/service/ICommentService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/comments/service/ICommentService.java,v diff -u -r1.1 -r1.2 --- lams_common/src/java/org/lamsfoundation/lams/comments/service/ICommentService.java 15 Dec 2015 10:17:27 -0000 1.1 +++ lams_common/src/java/org/lamsfoundation/lams/comments/service/ICommentService.java 8 Jan 2016 05:48:17 -0000 1.2 @@ -33,8 +33,13 @@ public interface ICommentService { + public static final Integer SORT_BY_DATE = 0; + public static final Integer SORT_BY_LIKE = 1; + + /** Gets the comments for a tool, based on the tool session and the tool's id. Allows for paging */ - List getTopicThread(Long externalId, Integer externalType, String externalSignature, Long lastMsgSeqId, Integer pageSize, Integer userId); + List getTopicThread(Long externalId, Integer externalType, String externalSignature, Long lastMsgSeqId, + Integer pageSize, Integer sortBy, String extraSortParam, Integer userId); /** Saves a comment - either creating a whole tree one if there is no parent or saving under the given parent. */ Comment createReply(Long parentId, String replyText, User user); @@ -49,7 +54,7 @@ /** * Get one complete thread within a topic Note that the return type is DTO. */ - List getThread( Long threadId, Integer userId ); + List getThread( Long threadId, Integer sortBy, Integer userId ); /** Get a single comment. Note that the return type is DTO */ CommentDTO getComment(Long commentUid); @@ -62,10 +67,6 @@ /** Update the hidden / not hidden flag */ Comment hideComment(Long commentUid, User user, boolean status); - /** - * Get the id of the root topic of this comment. - */ -// public Long getRootTopicId(Long commentId);// /* Utility calls for the Action */ MessageService getMessageService(); Index: lams_common/src/java/org/lamsfoundation/lams/comments/util/TopicComparator.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/comments/util/TopicComparator.java,v diff -u -r1.1 -r1.2 --- lams_common/src/java/org/lamsfoundation/lams/comments/util/TopicComparator.java 15 Dec 2015 10:17:27 -0000 1.1 +++ lams_common/src/java/org/lamsfoundation/lams/comments/util/TopicComparator.java 8 Jan 2016 05:48:17 -0000 1.2 @@ -88,8 +88,8 @@ } // If Level = 1 then "top" so sort newest first. Otherwise sort oldest first. - private int compareUids(int compareLevel, Comment c1, Comment c2) { - if ( compareLevel <= 1 ) + protected int compareUids(int compareLevel, Comment c1, Comment c2) { + if ( compareLevel <= 2 ) return c1.getUid() < c2.getUid() ? 1 : -1; else return c1.getUid() > c2.getUid() ? 1 : -1; Index: lams_common/src/java/org/lamsfoundation/lams/comments/util/TopicComparatorLike.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/comments/util/TopicComparatorLike.java,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_common/src/java/org/lamsfoundation/lams/comments/util/TopicComparatorLike.java 8 Jan 2016 05:48:17 -0000 1.1 @@ -0,0 +1,45 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id: TopicComparatorLike.java,v 1.1 2016/01/08 05:48:17 fionam Exp $ */ + +package org.lamsfoundation.lams.comments.util; + +import org.lamsfoundation.lams.comments.Comment; + +/** + * This class implements the java.util.Comparator interface. Sorts Level 1 and Level 2 on # likes, Level 3 onwards on creation date/time. + */ +public class TopicComparatorLike extends TopicComparator { + + protected int compareUids(int compareLevel, Comment c1, Comment c2) { + if ( compareLevel <= 2 ) { + if ( c1.getLikeCount() == c2.getLikeCount() ) + return c1.getUid() < c2.getUid() ? 1 : -1; + else + return c1.getLikeCount() < c2.getLikeCount() ? 1 : -1; + } else { + return c1.getUid() > c2.getUid() ? 1 : -1; + } + } +} Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040051.sql =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/dbupdates/Attic/patch2040051.sql,v diff -u -r1.2 -r1.3 --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040051.sql 15 Dec 2015 10:17:27 -0000 1.2 +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040051.sql 8 Jan 2016 05:48:17 -0000 1.3 @@ -27,9 +27,6 @@ `root_comment_uid` bigint(20) DEFAULT NULL, `comment_level` smallint(6) DEFAULT NULL, `thread_comment_uid` bigint(20) DEFAULT NULL, - `likes` text DEFAULT NULL, - `dislikes` text DEFAULT NULL, - `like_count` int(11) DEFAULT 0, PRIMARY KEY (`uid`), KEY `FK_comment_session` (`session_id`), KEY `FK_comment_create` (`create_by`),