Subversion Repositories bacoAlunos

Rev

Rev 1429 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.domain.dao.impl;

import jomm.dao.DaoException;
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.*;

import java.util.ArrayList;
import java.util.List;

import static org.hibernate.criterion.Restrictions.*;

/**
 * @author Jorge Machado
 * @date 28/Fev/2008
 * @time 2:51:06
 * @see pt.estgp.estgweb.domain.dao.impl
 */

public class QuestionarioDaoImpl extends QuestionarioDao
{

    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(QuestionarioDaoImpl.class);

    public static QuestionarioDaoImpl getInstance()
    {
        if (myInstance == null)
            myInstance = new QuestionarioDaoImpl();
        return (QuestionarioDaoImpl) myInstance;
    }

    public List<QuestionarioImpl> findSortedBy(int pageIndex, int sizeOfPage,1.5.0/docs/api/java/lang/String.html">String field)
    {
        try
        {
            Criteria criteria = createCriteria();

            criteria.setFirstResult(pageIndex * sizeOfPage);
            criteria.setMaxResults(sizeOfPage);
            criteria.addOrder(Order.desc(field));

            return criteria.list();
        }
        catch (HibernateException e)
        {
            throw new DaoException(e);
        }
    }

    public List<QuestionarioImpl> findAnoSemestre(1.5.0/docs/api/java/lang/String.html">String year, 1.5.0/docs/api/java/lang/String.html">String semestre,long historyDriveId )
    {
        try
        {
            Criteria criteria = createCriteria();
            criteria.add(eq("year",year))
                    .add(eq("semestre", semestre))
                    .add(eq("questionarioHistoryDrive.id",historyDriveId));
            return criteria.list();
        }
        catch (HibernateException e)
        {
            throw new DaoException(e);
        }
    }

    public List<QuestionarioImpl> findProcessing()
    {
        try
        {
            Criteria criteria = createCriteria();
            criteria.add(or(eq("state",QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.PROCESSING.name()),eq("state",QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.PROCESSING_WITH_ANSWERS.name())));
            return criteria.list();
        }
        catch (HibernateException e)
        {
            throw new DaoException(e);
        }
    }

    public List<QuestionarioImpl> findNotClosed()
    {
        try
        {
            Criteria criteria = createCriteria();
            criteria.add(not(or(or(eq("state",QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.CLOSED.name()),eq("state",QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.PROCESSING_OLAP.name())),
                    eq("state",QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.OLAP.name()))))
                    .addOrder(Order.desc("id"));
            return criteria.list();
        }
        catch (HibernateException e)
        {
            throw new DaoException(e);
        }
    }


    public long getNumeroRespostas(long questionarioId)
    {
        1.5.0/docs/api/javax/management/Query.html">Query q = getCurrentSession().createQuery
                ("select count(r.id) from r in class " + QuestionarioResposta.class.getName() + " " +
                        " JOIN r.questionario q " +
                        " where q.id = " + questionarioId);
        5+0%2Fdocs%2Fapi+Object">Object result = q.uniqueResult();
        if(result != null && ((1.5.0/docs/api/java/lang/Long.html">Long)result) > 0)
        {
            return (1.5.0/docs/api/java/lang/Long.html">Long)result;
        }
        else
            return 0;
    }
    public long getNumeroUnidadesUsadas(long questionarioId)
    {
        1.5.0/docs/api/javax/management/Query.html">Query q = getCurrentSession().createQuery
                ("select count(u.id) from u in class " + QuestionarioPedagogicoUnidadeCurricularAfeta.class.getName() + " " +
                        " JOIN u.cursoAfeto c " +
                        " JOIN c.questionario q " +
                        " where u.usar = true AND q.id = " + questionarioId);
        5+0%2Fdocs%2Fapi+Object">Object result = q.uniqueResult();
        if(result != null && ((1.5.0/docs/api/java/lang/Long.html">Long)result) > 0)
        {
            return (1.5.0/docs/api/java/lang/Long.html">Long)result;
        }
        else
            return 0;
    }

    public long getNumeroRespostasRequisitadas(long questionarioId)
    {
        1.5.0/docs/api/javax/management/Query.html">Query q = getCurrentSession().createQuery
                ("select count(r.id) from r in class " + QuestionarioRespostaRequisitada.class.getName() + " " +
                        " JOIN r.questionario q " +
                        " where q.id = " + questionarioId);
        5+0%2Fdocs%2Fapi+Object">Object result = q.uniqueResult();
        if(result != null && ((1.5.0/docs/api/java/lang/Long.html">Long)result) > 0)
        {
            return (1.5.0/docs/api/java/lang/Long.html">Long)result;
        }
        else
            return 0;
    }

    /*
    public AnnouncementDaoImpl.FindUsersResult findUsersEmails(Long id,boolean onlyNotAnswered)
    {

            AnnouncementDaoImpl.FindUsersResult findUsersResult = new AnnouncementDaoImpl.FindUsersResult();
            List<String> users = new ArrayList<String>();
            findUsersResult.emails = users;


            Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
                " u.outEmail, u.preferrefEmail, u.email " +
                "from " + QuestionarioRespostaRequisitada.class.getName() + " rR " +
                "JOIN rR.questionario q " +
                "JOIN rR.user u " +
                "WHERE q.id = :id " +
                    (onlyNotAnswered? " AND rR.resposta is null " : "" ) +
                "GROUP BY u.id");

        q.setLong("id",id);
        List<Object[]> results = (List<Object[]>) q.list();

        fullFillResults(findUsersResult, results);

        return findUsersResult;


    }
    */


    public AnnouncementDaoImpl.FindUsersIdResult findUsersIds(1.5.0/docs/api/java/lang/Long.html">Long id,boolean onlyNotAnswered)
    {

        AnnouncementDaoImpl.FindUsersIdResult findUsersResult = new AnnouncementDaoImpl.FindUsersIdResult();
        List<Long> users = new ArrayList<Long>();
        findUsersResult.userIds = users;


        1.5.0/docs/api/javax/management/Query.html">Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
                " u.id " +
                "from " + QuestionarioRespostaRequisitada.class.getName() + " rR " +
                "JOIN rR.questionario q " +
                "JOIN rR.user u " +
                "WHERE q.id = :id " +
                (onlyNotAnswered? " AND rR.resposta is null " : "" ) +
                "GROUP BY u.id");

        q.setLong("id",id);
        List<Object> results = (List<Object>) q.list();


        for(5+0%2Fdocs%2Fapi+Object">Object result: results)
        {
            findUsersResult.userIds.add((1.5.0/docs/api/java/lang/Long.html">Long) result);
        }
        findUsersResult.users = results.size();
        return findUsersResult;
    }

    public AnnouncementDaoImpl.FindUsersIdResult findUsersIdsPedagogico(boolean onlyNotAnswered,long cursoAfetoId,long unidadeAfetaId)
    {

        AnnouncementDaoImpl.FindUsersIdResult findUsersResult = new AnnouncementDaoImpl.FindUsersIdResult();
        List<Long> users = new ArrayList<Long>();
        findUsersResult.userIds = users;

        1.5.0/docs/api/javax/management/Query.html">Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
                " u.id " +
                "from " + QuestionarioPedagogicoAlunoRequisitado.class.getName() + " aR " +
                "JOIN aR.respostaRequisitada rR " +
                "JOIN rR.user u " +
                "WHERE " +
                (cursoAfetoId > 0 ?
                        " aR.tipologiaRequisitada.unidadeAfeta.cursoAfeto.id = " + cursoAfetoId  :
                        " aR.tipologiaRequisitada.unidadeAfeta.id = " + unidadeAfetaId) +
                (onlyNotAnswered? " AND rR.resposta is null " : "" ) +
                "GROUP BY u.id");

        List<Object> results = (List<Object>) q.list();

        for(5+0%2Fdocs%2Fapi+Object">Object result: results)
        {
            findUsersResult.userIds.add((1.5.0/docs/api/java/lang/Long.html">Long) result);
        }
        findUsersResult.users = results.size();
        return findUsersResult;


    }


    public AnnouncementDaoImpl.FindUsersIdResult findUsersIdsPedagogicoAllProcessing(boolean onlyNotAnswered)
    {

        AnnouncementDaoImpl.FindUsersIdResult findUsersResult = new AnnouncementDaoImpl.FindUsersIdResult();
        List<Long> users = new ArrayList<Long>();
        findUsersResult.userIds = users;

        1.5.0/docs/api/javax/management/Query.html">Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
                " u.id " +
                "from " + QuestionarioPedagogicoAlunoRequisitado.class.getName() + " aR " +
                "JOIN aR.respostaRequisitada rR " +
                "JOIN rR.user u " +
                "WHERE " +

                "( " +
                " aR.tipologiaRequisitada.unidadeAfeta.cursoAfeto.questionario.state = :sP1 " +
                " OR " +
                " aR.tipologiaRequisitada.unidadeAfeta.cursoAfeto.questionario.state = :sP2 " +
                ")" +


                (onlyNotAnswered? " AND rR.resposta is null " : "" ) +
                "GROUP BY u.id");

        q.setString("sP1",QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.PROCESSING.name());
        q.setString("sP2",QuestionarioImpl.1.5.0/docs/api/org/omg/PortableServer/POAManagerPackage/State.html">State.PROCESSING_WITH_ANSWERS.name());

        List<Object> results = (List<Object>) q.list();

        for(5+0%2Fdocs%2Fapi+Object">Object result: results)
        {
            findUsersResult.userIds.add((1.5.0/docs/api/java/lang/Long.html">Long) result);
        }
        findUsersResult.users = results.size();
        return findUsersResult;


    }

    public static class QuestionarioStatsVars
    {
        public long cursos;
        public long unidades;
        public long profs;
        public long alunos;
        public long turmas;
        public long alunosDeUsadas;
        public long profsDeUsadas;
        public long unidadesUsadas;
        public long tipologiasUsadas;
        public long profsTimeStudents;
        public long respostasRequisitadas;
        public long respostasObtidas;
    }




    public QuestionarioStatsVars loadQuestionarioStatsPedagogico(long questionarioId)
    {
        QuestionarioStatsVars questionarioStatsVars = new QuestionarioStatsVars();
        1.5.0/docs/api/javax/management/Query.html">Query q = AbstractDao.getCurrentSession().createQuery("SELECT " +
                " count(distinct c.id) AS cursos " +
                ",count(distinct u.id) AS unidades " +
                ",sum (u.profs) AS profs " +
                ",count(distinct t.cdTurma) AS turmas " +
                ",sum (u.students) AS students " +
                ",count(distinct a.aluno.id) AS alunosDeUsadas " +
                ",count(distinct t.docenteAfeto.id) AS profsDeUsadas " +
                ",count(distinct t.id) AS tipologiasRequisitadas " +
                ",sum (case when u.usar = true then (u.profs * u.students) else 0 end) AS respostasEsperadas " +
                "from " + QuestionarioPedagogicoCursoAfeto.class.getName() + " c " +
                "JOIN c.questionario q " +
                "JOIN c.unidadesAfetas u " +
                "JOIN u.tipologiasRequisitadas t " +
                "JOIN t.alunosRequisitados a " +

                "WHERE q.id = :id " +
                "GROUP BY q.id");

        q.setLong("id",questionarioId);
        5+0%2Fdocs%2Fapi+Object">Object[] results = (5+0%2Fdocs%2Fapi+Object">Object[]) q.uniqueResult();

        if(results != null && results[0] != null)
        {
            questionarioStatsVars.cursos = (1.5.0/docs/api/java/lang/Long.html">Long) results[0];
            questionarioStatsVars.unidades = (1.5.0/docs/api/java/lang/Long.html">Long) results[1];
            questionarioStatsVars.profs =   (1.5.0/docs/api/java/lang/Long.html">Long) results[2];
            questionarioStatsVars.turmas =   (1.5.0/docs/api/java/lang/Long.html">Long) results[3];
            questionarioStatsVars.alunos =   (1.5.0/docs/api/java/lang/Long.html">Long) results[4];
            questionarioStatsVars.alunosDeUsadas =   (1.5.0/docs/api/java/lang/Long.html">Long) results[5];
            questionarioStatsVars.profsDeUsadas =   (1.5.0/docs/api/java/lang/Long.html">Long) results[6];
            questionarioStatsVars.tipologiasUsadas =   (1.5.0/docs/api/java/lang/Long.html">Long) results[7];
            questionarioStatsVars.profsTimeStudents = (1.5.0/docs/api/java/lang/Long.html">Long) results[8];
            questionarioStatsVars.respostasRequisitadas = getNumeroRespostasRequisitadas(questionarioId);
            questionarioStatsVars.respostasObtidas = getNumeroRespostas(questionarioId);
            questionarioStatsVars.unidadesUsadas = getNumeroUnidadesUsadas(questionarioId);
            if(questionarioStatsVars.unidadesUsadas > questionarioStatsVars.unidades)
                logger.error("TEM UM ERRO NA QUERY, a contagem de usadas com o distinct da diferente de com o SUM");

        }

        return questionarioStatsVars;
    }
}