001package model.repository;
002
003import model.entity.Section;
004
005import javax.persistence.EntityManager;
006import javax.persistence.PersistenceContext;
007import java.io.Serializable;
008import java.time.Instant;
009import java.util.List;
010
011
012/**
013 * Classe che incapsula la logica per il recupero di entità di tipo {@link Section}
014 */
015public class SectionRepository implements Serializable {
016
017    @PersistenceContext
018    protected EntityManager em;
019
020    /**
021     * Restituisce una lista con i dati delle sezioni con più follows
022     * @return lista di entità Section delle sezioni con più follows
023     */
024    public List<Section> getMostFollowedSections(){
025        return em.createQuery("from Section s order by follows.size desc", Section.class).getResultList();
026    }
027
028    /**
029     * Restituisce una lista con i dati delle sezioni con più follows in un dato arco di tempo
030     * @param after data dopo la quale contare i follows delle sezioni
031     * @return lista di entità Section delle sezioni con più follows
032     */
033    public List<Section> getMostFollowedSections(Instant after){
034        return em.createQuery(
035                "select s from Section s right join s.follows f where f.followDate >= :after " +
036                "group by s " +
037                "order by count(f) desc", Section.class)
038                .setParameter("after",after).getResultList();
039    }
040}