Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20210506.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20210506.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20210506.sql (revision 8967cf285e8f080454bfeb80ea34e9022041ee34) @@ -0,0 +1,31 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +-- Put all sql statements below here + +--LDEV-5208 Add Discussion Sentiment widget + +CREATE TABLE lams_discussion_sentiment ( + uid BIGINT AUTO_INCREMENT, + lesson_id BIGINT NOT NULL, + tool_content_id BIGINT NOT NULL, + burning_question_uid BIGINT, + user_id BIGINT, + selected_option TINYINT UNSIGNED, + PRIMARY KEY (uid), + INDEX IDX_lams_discussion_sentiment_burning_question_uid (burning_question_uid), + CONSTRAINT FK_lams_discussion_sentiment_1 FOREIGN KEY (lesson_id) REFERENCES lams_lesson (lesson_id) + ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT FK_lams_discussion_sentiment_2 FOREIGN KEY (tool_content_id) REFERENCES lams_tool_content (tool_content_id) + ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT FK_lams_discussion_sentiment_3 FOREIGN KEY (user_id) REFERENCES lams_user (user_id) + ON DELETE CASCADE ON UPDATE CASCADE +); + + +-- Put all sql statements above here + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; Index: lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/dao/IDiscussionSentimentDAO.java =================================================================== diff -u --- lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/dao/IDiscussionSentimentDAO.java (revision 0) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/dao/IDiscussionSentimentDAO.java (revision 8967cf285e8f080454bfeb80ea34e9022041ee34) @@ -0,0 +1,13 @@ +package org.lamsfoundation.lams.learning.discussion.dao; + +import java.util.Map; + +import org.lamsfoundation.lams.dao.IBaseDAO; +import org.lamsfoundation.lams.learning.discussion.model.DiscussionSentimentVote; + +public interface IDiscussionSentimentDAO extends IBaseDAO { + + DiscussionSentimentVote getActiveDiscussion(long lessonId); + + Map getDiscussionAggregatedVotes(long lessonId, long toolContentId, Long burningQuestionUid); +} \ No newline at end of file Index: lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/dao/hibernate/DiscussionSentimentDAO.java =================================================================== diff -u --- lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/dao/hibernate/DiscussionSentimentDAO.java (revision 0) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/dao/hibernate/DiscussionSentimentDAO.java (revision 8967cf285e8f080454bfeb80ea34e9022041ee34) @@ -0,0 +1,35 @@ +package org.lamsfoundation.lams.learning.discussion.dao.hibernate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.stream.Collectors; + +import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; +import org.lamsfoundation.lams.learning.discussion.dao.IDiscussionSentimentDAO; +import org.lamsfoundation.lams.learning.discussion.model.DiscussionSentimentVote; + +public class DiscussionSentimentDAO extends LAMSBaseDAO implements IDiscussionSentimentDAO { + private static final String FIND_ACTIVE_DISCUSSION = "FROM " + DiscussionSentimentVote.class.getName() + + " WHERE lessonId = :lessonId AND userId IS NULL"; + + @Override + public DiscussionSentimentVote getActiveDiscussion(long lessonId) { + return getSession().createQuery(FIND_ACTIVE_DISCUSSION, DiscussionSentimentVote.class) + .setParameter("lessonId", lessonId).uniqueResult(); + } + + @Override + public Map getDiscussionAggregatedVotes(long lessonId, long toolContentId, Long burningQuestionUid) { + Map properties = new HashMap<>(); + properties.put("lessonId", lessonId); + properties.put("toolContentId", toolContentId); + if (burningQuestionUid != null) { + properties.put("burningQuestionUid", burningQuestionUid); + } + List votes = findByProperties(DiscussionSentimentVote.class, properties); + return votes.stream().filter(v -> v.getUserId() != null).collect( + Collectors.groupingBy(DiscussionSentimentVote::getSelectedOption, TreeMap::new, Collectors.counting())); + } +} \ No newline at end of file Index: lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/model/DiscussionSentimentVote.java =================================================================== diff -u --- lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/model/DiscussionSentimentVote.java (revision 0) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/discussion/model/DiscussionSentimentVote.java (revision 8967cf285e8f080454bfeb80ea34e9022041ee34) @@ -0,0 +1,88 @@ +package org.lamsfoundation.lams.learning.discussion.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "lams_discussion_sentiment") +public class DiscussionSentimentVote { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long uid; + + @Column(name = "lesson_id") + private Long lessonId; + + @Column(name = "tool_content_id") + private Long toolContentId; + + @Column(name = "burning_question_uid") + private Long burningQuestionUid; + + @Column(name = "user_id") + private Integer userId; + + @Column(name = "selected_option") + private Integer selectedOption; + + public DiscussionSentimentVote() { + } + + public DiscussionSentimentVote(Long lessonId, Long toolContentId) { + this.lessonId = lessonId; + this.toolContentId = toolContentId; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Long getLessonId() { + return lessonId; + } + + public void setLessonId(Long lessonId) { + this.lessonId = lessonId; + } + + public Long getToolContentId() { + return toolContentId; + } + + public void setToolContentId(Long toolContentId) { + this.toolContentId = toolContentId; + } + + public Long getBurningQuestionUid() { + return burningQuestionUid; + } + + public void setBurningQuestionUid(Long burningQuestionUid) { + this.burningQuestionUid = burningQuestionUid; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getSelectedOption() { + return selectedOption; + } + + public void setSelectedOption(Integer selectedOption) { + this.selectedOption = selectedOption; + } +} \ No newline at end of file