package com.oceaneconsulting.tanaguru.dao.impl;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import org.tanaguru.entity.statistics.CriterionStatistics;
import org.tanaguru.entity.statistics.CriterionStatisticsImpl;
import org.tanaguru.entity.statistics.TestStatistics;
import org.tanaguru.entity.statistics.TestStatisticsImpl;
import org.tanaguru.entity.statistics.ThemeStatistics;
import org.tanaguru.entity.statistics.ThemeStatisticsImpl;
import org.tanaguru.entity.statistics.WebResourceStatistics;
import org.tanaguru.entity.statistics.WebResourceStatisticsImpl;
import org.tanaguru.sdk.entity.dao.jpa.AbstractJPADAO;
import org.springframework.stereotype.Repository;
import com.oceaneconsulting.tanaguru.dao.StatisticsDAO;
import com.oceaneconsulting.tanaguru.ws.types.AuditResult;
import com.oceaneconsulting.tanaguru.ws.types.GlobalStatsOrder;
/**
* Statistics DAO implementation for webservice . This class is based
* on Tanaguru model to calculate different audit stats.
*
* @author shamdi at oceaneconsulting dot com
*
*/
@Repository("statisticsDAO")
public class StatisticsDAOImpl extends AbstractJPADAO<WebResourceStatistics, Long> implements StatisticsDAO{
//Audit page global stats query
private static final String SELECT_CLAUSE_Q1 = "SELECT WEB_RESOURCE_STATISTICS.Mark, AUDIT.STATUS, WEB_RESOURCE_STATISTICS.ID_WEB_RESOURCE ";
private static final String FROM_CLAUSE_Q1 = "FROM AUDIT left outer join WEB_RESOURCE on WEB_RESOURCE.ID_AUDIT = AUDIT.ID_AUDIT left outer join WEB_RESOURCE_STATISTICS on WEB_RESOURCE_STATISTICS.Id_Web_Resource=WEB_RESOURCE.Id_Web_Resource ";
private static final String WHERE_CLAUSE_Q1 = "WHERE AUDIT.ID_AUDIT = :idAudit";
//Audit site/scenario global stats query
private static final String SELECT_CLAUSE_Q2 = SELECT_CLAUSE_Q1;
private static final String FROM_CLAUSE_Q2 = FROM_CLAUSE_Q1;
private static final String WHERE_CLAUSE_Q20 = "WHERE 1=1 ";
private static final String WHERE_CLAUSE_Q21 = "AND AUDIT.ID_AUDIT in (SELECT WS_INVOCATION.ID_AUDIT FROM WS_INVOCATION WHERE 1=1 ";
private static final String WHERE_CLAUSE_Q22 = "AND WS_INVOCATION.ID_AUDIT in (:idAudits) ";
private static final String WHERE_CLAUSE_Q23 = "AND WS_INVOCATION.AUDIT_TYPE = :auditType ";
private static final String WHERE_CLAUSE_Q24 = "AND WS_INVOCATION.COUNTRY = :country ";
private static final String WHERE_CLAUSE_Q25 = "AND WS_INVOCATION.CATEGORY = :category ";
private static final String WHERE_CLAUSE_Q26 = ") ";
private static final String WHERE_CLAUSE_Q27 = "AND AUDIT.STATUS = :status ";
private static final String RESULT_URL = "http://localhost:8080/tgol-web-app/home/contract/page-result.html?wr=";
/**
* {@inheritDoc}
*/
@Override
public AuditResult findWeightedMarkAndStatusByAuditId(Long idAudit) {
AuditResult auditResult = new AuditResult();
StringBuilder queryString = new StringBuilder();
queryString.append(SELECT_CLAUSE_Q1);
queryString.append(FROM_CLAUSE_Q1);
queryString.append(WHERE_CLAUSE_Q1);
Query query = entityManager.createNativeQuery(queryString.toString());
query.setParameter("idAudit", idAudit);
try {
Object[] result = (Object[])query. getSingleResult();
if (result[0] instanceof Float) {
auditResult.setScore((Float)result[0]);
} else if (result[0] instanceof Double) {
auditResult.setScore(((Double)result[0]).floatValue());
} else {
auditResult.setScore(Float.valueOf(0));
}
auditResult.setStatus((String)result[1]);
if(result[2] != null){
auditResult.setUrl(RESULT_URL + (BigInteger)result[2]);
}
} catch (NoResultException e) {
return null;
}
return auditResult;
}
@Override
public List<AuditResult> findWeightedMarkAndStatus(GlobalStatsOrder globalStatsOrder) {
List<AuditResult> auditResults = new ArrayList<AuditResult>();
StringBuilder queryString = new StringBuilder();
queryString.append(SELECT_CLAUSE_Q2);
queryString.append(FROM_CLAUSE_Q2);
queryString.append(WHERE_CLAUSE_Q20);
queryString.append(WHERE_CLAUSE_Q21);
if(globalStatsOrder.getIdAudits() != null && !globalStatsOrder.getIdAudits().isEmpty()){
queryString.append(WHERE_CLAUSE_Q22);
}
if(globalStatsOrder.getAuditType() != null){
queryString.append(WHERE_CLAUSE_Q23);
}
if(globalStatsOrder.getCountry() != null && !globalStatsOrder.getCountry().isEmpty()){
queryString.append(WHERE_CLAUSE_Q24);
}
if(globalStatsOrder.getCategory() != null && !globalStatsOrder.getCategory().isEmpty()){
queryString.append(WHERE_CLAUSE_Q25);
}
queryString.append(WHERE_CLAUSE_Q26);
if(globalStatsOrder.getStatus() != null && !globalStatsOrder.getStatus().isEmpty()){
queryString.append(WHERE_CLAUSE_Q27);
}
Query query = entityManager.createNativeQuery(queryString.toString());
if(globalStatsOrder.getIdAudits() != null && !globalStatsOrder.getIdAudits().isEmpty()){
query.setParameter("idAudits", globalStatsOrder.getIdAudits());
}
if(globalStatsOrder.getAuditType() != null){
query.setParameter("auditType", globalStatsOrder.getAuditType());
}
if(globalStatsOrder.getCountry() != null && !globalStatsOrder.getCountry().isEmpty()){
query.setParameter("country", globalStatsOrder.getCountry());
}
if(globalStatsOrder.getCategory() != null && !globalStatsOrder.getCategory().isEmpty()){
query.setParameter("category", globalStatsOrder.getCategory());
}
if(globalStatsOrder.getStatus() != null && !globalStatsOrder.getStatus().isEmpty()){
query.setParameter("status", globalStatsOrder.getStatus());
}
try {
List<Object[]> results = (List<Object[]>)query. getResultList();
for(Object[] result : results){
AuditResult auditResult = new AuditResult();
if (result[0] instanceof Float) {
auditResult.setScore((Float)result[0]);
} else if (result[0] instanceof Double) {
auditResult.setScore(((Double)result[0]).floatValue());
} else {
auditResult.setScore(Float.valueOf(0));
}
auditResult.setStatus((String)result[1]);
if(result[2] != null){
auditResult.setUrl(RESULT_URL + (BigInteger)result[2]);
}
auditResults.add(auditResult);
}
} catch (NoResultException e) {
return null;
}
return auditResults;
}
@Override
protected Class<? extends WebResourceStatistics> getEntityClass() {
return WebResourceStatisticsImpl.class;
}
protected Class<? extends CriterionStatistics> getCriterionStatisticsEntityClass() {
return CriterionStatisticsImpl.class;
}
protected Class<? extends TestStatistics> getTestStatisticsEntityClass() {
return TestStatisticsImpl.class;
}
protected Class<? extends ThemeStatistics> getThemeStatisticsEntityClass() {
return ThemeStatisticsImpl.class;
}
}