001package model.repository;
002
003import model.entity.Comment;
004import model.entity.Post;
005
006import javax.persistence.EntityManager;
007import javax.persistence.PersistenceContext;
008import java.io.Serializable;
009import java.util.List;
010
011
012/**
013 * Classe che incapsula la logica per il recupero di entità di tipo {@link Comment}
014 */
015public class CommentRepository implements Serializable {
016
017    @PersistenceContext
018    protected EntityManager em;
019
020    /**
021     *  Trova tutti i commenti di un determinato post
022     * @param post entità Post di cui si vuole ottenere i commenti
023     * @param depth profondità della ricorsione per le risposte ai post
024     * @return Lista di commenti
025     */
026    public List<Comment> getByPost(Post post, int depth){
027        return em.createQuery(
028                        "from Comment c where c.post = :post and length(c.path) <= (7 * :depth) + 1 order by c.path",
029                        Comment.class)
030                .setParameter("depth", depth)
031                .setParameter("post", post)
032                .getResultList();
033    }
034
035    /**
036     *  Trova tutti i commenti di riposta a un determinato commento
037     * @param comment Entità Comment di cui si vuole ottenere i commenti
038     * @param depth profondità della ricorsione per le risposte ai post
039     * @return Lista di commenti
040     */
041    public List<Comment> getReplies(Comment comment, int depth){
042        return em.createQuery(
043                    "from Comment c where c.path like :path and length(c.path) <= (7 * :depth) + 1 order by c.path",
044                    Comment.class)
045                .setParameter("depth", depth)
046                .setParameter("path", comment.getPath() + '%')
047                .getResultList();
048    }
049}