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.HashMap;
import java.util.List;
import java.util.Map;
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 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
(1.5.0/docs/api/java/lang/Long.html">Long id,
boolean onlyNotAnswered
)
{
AnnouncementDaoImpl.
FindUsersResult findUsersResult =
new AnnouncementDaoImpl.
FindUsersResult();
List
<String
> users =
new ArrayList
<String
>();
findUsersResult.
emails = users
;
1.5.0/docs/api/javax/management/Query.html">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.
FindUsersResult findUsersEmailsPedagogico
(boolean onlyNotAnswered,
long cursoAfetoId,
long unidadeAfetaId
)
{
AnnouncementDaoImpl.
FindUsersResult findUsersResult =
new AnnouncementDaoImpl.
FindUsersResult();
List
<String
> users =
new ArrayList
<String
>();
findUsersResult.
emails = users
;
1.5.0/docs/api/javax/management/Query.html">Query q = AbstractDao.
getCurrentSession().
createQuery("SELECT " +
" u.outEmail, u.preferrefEmail, u.email " +
"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();
fullFillResults
(findUsersResult, results
);
return findUsersResult
;
}
private void fullFillResults
(AnnouncementDaoImpl.
FindUsersResult findUsersResult, List
<Object
[]> results
) {
Map
<String,String
> emailsSet =
new HashMap
<String, String
>();
for(5+0%2Fdocs%2Fapi+Object">Object[] result: results
)
{
if(result
[0
] !=
null)
{
emailsSet.
put((1.5.0/docs/api/java/lang/String.html">String) result
[0],
"");
}
if(result
[1
] !=
null)
{
emailsSet.
put((1.5.0/docs/api/java/lang/String.html">String) result
[1],
"");
}
if(result
[2
] !=
null)
{
emailsSet.
put((1.5.0/docs/api/java/lang/String.html">String) result
[2],
"");
}
}
findUsersResult.
emails.
addAll(emailsSet.
keySet());
findUsersResult.
users = results.
size();
}
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 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 " +
",sum (u.turmas) AS turmas " +
",sum (u.students) AS students " +
",sum (case when u.usar = true then u.students else 0 end) AS alunosDeUsadas " +
",sum (case when u.usar = true then u.profs else 0 end) AS profsDeUsadas " +
",sum (case when u.usar = true then 1 else 0 end) AS unidadesUsadas " +
",sum (case when u.usar = true then 1 else 1 end) AS unidadesTodasCheck " +
",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 " +
"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.
unidadesUsadas =
(1.5.0/docs/api/java/lang/Long.html">Long) results
[7
];
if(((1.5.0/docs/api/java/lang/Long.html">Long) results
[8]) != questionarioStatsVars.
unidades)
logger.
error("TEM UM ERRO NA QUERY, a contagem de usadas com o distinct da diferente de com o SUM");
questionarioStatsVars.
profsTimeStudents =
(1.5.0/docs/api/java/lang/Long.html">Long) results
[9
];
questionarioStatsVars.
respostasRequisitadas = getNumeroRespostasRequisitadas
(questionarioId
);
questionarioStatsVars.
respostasObtidas = getNumeroRespostas
(questionarioId
);
}
return questionarioStatsVars
;
}
}