package org.kalipo.agent; import org.joda.time.DateTime; import org.kalipo.aop.KalipoExceptionHandler; import org.kalipo.domain.Thread; import org.kalipo.repository.CommentRepository; import org.kalipo.repository.ThreadRepository; import org.kalipo.repository.VoteRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.inject.Inject; import java.util.List; /** * Scheduled jobs for Thread entity * Created by damoeb on 13.07.15. */ @Service @KalipoExceptionHandler public class ThreadAgent { private final Logger log = LoggerFactory.getLogger(ThreadAgent.class); @Inject private ThreadRepository threadRepository; @Inject private VoteRepository voteRepository; @Inject private CommentRepository commentRepository; @Scheduled(fixedDelay = 20000) public void updateThreadStats() { Sort sort = new Sort(Sort.Direction.ASC, "lastModifiedDate"); PageRequest pageable = new PageRequest(0, 10, sort); List<Thread> threads = threadRepository.findByStatus(Thread.Status.OPEN, pageable); for (Thread thread : threads) { log.debug("Updating stats of thread {}", thread.getId()); Integer likes = voteRepository.countLikesInThread(thread.getId()); thread.setLikes(likes); int commentCount = commentRepository.countApprovedInThread(thread.getId()); thread.setCommentCount(commentCount); thread.setPendingCount(commentRepository.countPendingInThread(thread.getId())); thread.setLastModifiedDate(DateTime.now()); // todo unique authors, views double passedMinutes = (DateTime.now().toDate().getTime() - thread.getCreatedDate().toDate().getTime()) / 60000; double score = likes + commentCount == 0 || passedMinutes == 0 ? 0 : (likes + commentCount) / passedMinutes; thread.setScore(score); threadRepository.save(thread); } } }