package com.rjconsultores.ventaboletos.dao.hibernate; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; import com.rjconsultores.ventaboletos.dao.ConexionDAO; import com.rjconsultores.ventaboletos.entidad.Conexion; import com.rjconsultores.ventaboletos.entidad.ConexionCtrlTemp; import com.rjconsultores.ventaboletos.entidad.ConexionTemp; import com.rjconsultores.ventaboletos.vo.conexion.ConexionVO; @Repository("conexionDAO") public class ConexionHibernateDAO extends GenericHibernateDAO implements ConexionDAO { @Autowired public ConexionHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) { setSessionFactory(factory); } @Override public List buscarConexionesValidas() { StringBuilder sb = new StringBuilder(); sb.append("SELECT DISTINCT cct.conexionctrl_id AS conexionCtrlId, "); sb.append(" po1.descparada AS conOrigen, "); sb.append(" pd1.descparada AS conDestino, "); sb.append(" c.numgrupo AS grupo, "); sb.append(" po2.descparada AS tramoOrigen, "); sb.append(" pd2.descparada AS tramoDestino, "); sb.append(" c.numsecuencia AS numSecuencia "); sb.append("FROM conexion c "); sb.append(" inner join conexion_conf cf "); sb.append(" ON ( cf.conexionctrl_id = c.conexionctrl_id "); sb.append(" AND cf.activo = 1 ) "); sb.append(" inner join conexion_ctrl cct "); sb.append(" ON ( cct.conexionctrl_id = c.conexionctrl_id "); sb.append(" AND cct.activo = 1 ) "); sb.append(" inner join parada po1 "); sb.append(" ON ( po1.parada_id = cct.origen_id ) "); sb.append(" inner join parada pd1 "); sb.append(" ON ( pd1.parada_id = cct.destino_id ) "); sb.append(" inner join parada po2 "); sb.append(" ON ( po2.parada_id = c.origen_id ) "); sb.append(" inner join parada pd2 "); sb.append(" ON ( pd2.parada_id = c.destino_id ) "); sb.append("WHERE cct.activo = 1 and c.activo = 1 "); sb.append("ORDER BY po1.descparada, "); sb.append(" pd1.descparada, "); sb.append(" cct.conexionctrl_id, "); sb.append(" c.numgrupo, "); sb.append(" c.numsecuencia, "); sb.append(" po2.descparada, "); sb.append(" pd2.descparada "); Query query = getSession().createSQLQuery(sb.toString()); List conexionVOs = new ArrayList(); for (Object o : query.list()) { Object[] oc = (Object[]) o; ConexionVO conexionVO = new ConexionVO(); conexionVO.setConexionCtrlId(((BigDecimal) oc[0]).longValue()); conexionVO.setConOrigen((String) oc[1]); conexionVO.setConDestino((String) oc[2]); conexionVO.setGrupo(((BigDecimal) oc[3]).intValue()); conexionVO.setTramoOrigen((String) oc[4]); conexionVO.setTramoDestino((String) oc[5]); conexionVO.setBuscaAgruapada(false); conexionVOs.add(conexionVO); } return conexionVOs; } @Override public List buscarConexiones(boolean isBuscaAgrupada, Integer origenId, Integer destinoId) { String queryStr = getQueryConexiones(origenId, destinoId); Query query = getSession().createSQLQuery(queryStr); List list = query.list(); List vos = new ArrayList(); for (Object[] o : list) { ConexionVO vo = new ConexionVO(); vo.setGrupo(((BigDecimal) o[0]).intValue()); vo.setConexionCtrlId(((BigDecimal) o[1]).longValue()); vo.setConOrigen((String) o[2]); vo.setConDestino((String) o[3]); vo.setTramoOrigen((String) o[4]); vo.setTramoDestino((String) o[5]); vo.setBuscaAgruapada(isBuscaAgrupada); vos.add(vo); } if (isBuscaAgrupada) { return agruparConexiones(vos); } return vos; } private List agruparConexiones(List conexiones) { LinkedHashMap> map = new LinkedHashMap>(); List agrpVo = new ArrayList(); String grupoTrecho = null; Integer grupo = null; for (ConexionVO vo : conexiones) { if (grupo == null) grupo = vo.getGrupo(); if (!grupo.equals(vo.getGrupo())) { if (!map.containsKey(grupoTrecho)) { map.put(grupoTrecho, agrpVo); } grupo = vo.getGrupo(); grupoTrecho = null; agrpVo = new ArrayList(); } if (grupo.equals(vo.getGrupo())) { if (grupoTrecho == null) { grupoTrecho = vo.getTramoOrigen() + ";" + vo.getTramoDestino() + ";"; } else { grupoTrecho += vo.getTramoOrigen() + ";" + vo.getTramoDestino() + ";"; } agrpVo.add(vo); } } List agrupados = new ArrayList(); for (Map.Entry> entry : map.entrySet()) { agrupados.addAll(entry.getValue()); } return agrupados; } private String getQueryConexiones(Integer origenId, Integer destinoId) { StringBuilder sb = new StringBuilder(); sb.append(" select "); sb.append(" c.numgrupo as grupo, "); sb.append(" cc.conexionctrl_id as conexionCtrlId, occ.descparada as conOrigen, dcc.descparada as conDestino, "); sb.append(" oc.descparada as tramoOrigen, dc.descparada as tramoDestino, c.numsecuencia as numsecuencia "); sb.append(" from conexion_ctrl cc "); sb.append(" inner join conexion_conf conf "); sb.append(" on conf.conexionctrl_id = cc.conexionctrl_id, "); sb.append(" conexion c, "); sb.append(" parada occ, "); sb.append(" parada dcc, "); sb.append(" parada oc, "); sb.append(" parada dc "); sb.append(" where cc.activo = 1 and c.activo = 1 and conf.activo = 1"); sb.append(" and cc.conexionctrl_id = c.conexionctrl_id "); sb.append(" and occ.parada_id = cc.origen_id "); sb.append(" and conf.grupo = c.numgrupo "); sb.append(" and dcc.parada_id = cc.destino_id "); sb.append(" and oc.parada_id = c.origen_id "); sb.append(" and dc.parada_id = c.destino_id "); if (origenId != null) { sb.append(" and cc.origen_id = ").append(origenId); } if (destinoId != null) { sb.append(" and cc.destino_id = ").append(destinoId); } sb.append(" order by conOrigen, conDestino, conexionCtrlId, grupo, numsecuencia, tramoOrigen, tramoDestino "); return sb.toString(); } @Override public void generarConexiones(Integer usuarioId) { this.getSession().createQuery("DELETE ConexionTemp").executeUpdate(); this.getSession().createQuery("DELETE ConexionCtrlTemp").executeUpdate(); Query queryParadas = this.getSession().createQuery("select distinct t.origem.paradaId,t.destino.paradaId from Tramo t where t.activo = 1 order by t.origem.paradaId "); List lsParadas = queryParadas.list(); StringBuilder sb = new StringBuilder(""); sb.append("SELECT "); sb.append(" t.origem.paradaId, "); sb.append(" t.destino.paradaId, "); sb.append(" t2.origem.paradaId, "); sb.append(" t2.destino.paradaId, "); sb.append(" MAX(t.kmReal), "); sb.append(" MAX(tcs.tiemporecorrido), "); sb.append(" MAX(t2.kmReal), "); sb.append(" MAX(tcs2.tiemporecorrido) "); sb.append(" "); sb.append("FROM "); sb.append(" Tramo t, "); sb.append(" Tramo t2, "); sb.append(" TramoServicio tcs, "); sb.append(" TramoServicio tcs2 "); sb.append(" "); sb.append("where "); sb.append(" t.origem.paradaId = :origen "); sb.append(" and t.activo=1 "); sb.append(" "); sb.append(" and t2.destino.paradaId = :destino "); sb.append(" and t2.activo=1 "); sb.append(" and t2.origem= t.destino "); sb.append(" "); sb.append(" and tcs.tramo=t "); sb.append(" and tcs.activo=1 "); sb.append(" "); sb.append(" and tcs2.tramo=t2 "); sb.append(" and tcs2.activo=1 "); sb.append(" "); sb.append("group by "); sb.append(" t.origem.paradaId, "); sb.append(" t.destino.paradaId, "); sb.append(" t2.origem.paradaId, "); sb.append(" t2.destino.paradaId "); Map mapConexionCtrlId = new HashMap(); for (Object[] obj : lsParadas) { int grupo = 0; Integer origenId = (Integer) obj[0]; Integer destinoId = (Integer) obj[1]; Query query = getSession().createQuery(sb.toString()); query.setParameter("origen", origenId); query.setParameter("destino", destinoId); List list = query.list(); for (Object[] objConexion : list) { Integer origen1 = (Integer) objConexion[0]; Integer destino1 = (Integer) objConexion[1]; Integer origen2 = (Integer) objConexion[2]; Integer destino2 = (Integer) objConexion[3]; String claveConexionCtrl = origenId + "-" + destinoId; Long conexionCtrlId = mapConexionCtrlId.get(claveConexionCtrl); if (conexionCtrlId == null) { ConexionCtrlTemp c = new ConexionCtrlTemp(); c.setActivo(true); c.setOrigenId(origen1); c.setDestinoId(destino2); c.setFecmodif(new java.util.Date()); c.setUsuarioId(usuarioId); conexionCtrlId = (Long) this.getSession().save(c); mapConexionCtrlId.put(claveConexionCtrl, conexionCtrlId); } grupo++; ConexionTemp cTemp = new ConexionTemp(); cTemp.setActivo(true); cTemp.setConexionctrlId(conexionCtrlId); cTemp.setOrigenId(origen1); cTemp.setDestinoId(destino1); cTemp.setNumgrupo(grupo); cTemp.setNumsecuencia((short) 1); cTemp.setUsuarioId(usuarioId); cTemp.setFecmodif(new java.util.Date()); ConexionTemp cTemp2 = new ConexionTemp(); cTemp2.setActivo(true); cTemp2.setConexionctrlId(conexionCtrlId); cTemp2.setOrigenId(origen2); cTemp2.setDestinoId(destino2); cTemp2.setNumgrupo(grupo); cTemp2.setNumsecuencia((short) 2); cTemp2.setUsuarioId(usuarioId); cTemp2.setFecmodif(new java.util.Date()); getSession().save(cTemp); getSession().save(cTemp2); } } // deletando, exceto conexoes que foram criadas manualmente: this.getSession().createQuery("DELETE Conexion c WHERE c.conexionctrlId NOT IN (SELECT cc.conexionCtrl.conexionctrlId FROM ConexionConf cc)").executeUpdate(); this.getSession().createQuery("DELETE ConexionCtrl cct WHERE cct.conexionctrlId NOT IN (SELECT cc.conexionCtrl.conexionctrlId FROM ConexionConf cc)").executeUpdate(); sb = new StringBuilder(""); sb.append(" INSERT INTO ConexionCtrl (conexionctrlId,fecmodif,activo,usuarioId,origenId,destinoId) "); sb.append(" SELECT cct.conexionctrlId, "); sb.append(" cct.fecmodif, "); sb.append(" cct.activo, "); sb.append(" cct.usuarioId, "); sb.append(" cct.origenId, "); sb.append(" cct.destinoId "); sb.append(" FROM ConexionCtrlTemp cct "); sb.append(" WHERE cct.origenId || '_' || cct.destinoId NOT IN "); sb.append(" ( SELECT cc.origenId || '_' || cc.destinoId "); sb.append(" FROM ConexionCtrl cc "); sb.append(" WHERE cc.activo = 1) "); this.getSession().createQuery(sb.toString()).executeUpdate(); sb = new StringBuilder(""); sb.append(" INSERT INTO Conexion (conexionId,numgrupo,numsecuencia,activo,fecmodif,usuarioId,origenId,destinoId,conexionctrlId) "); sb.append(" SELECT ct.conexionId, "); sb.append(" ct.numgrupo, "); sb.append(" ct.numsecuencia, "); sb.append(" ct.activo, "); sb.append(" ct.fecmodif, "); sb.append(" ct.usuarioId, "); sb.append(" ct.origenId, "); sb.append(" ct.destinoId, "); sb.append(" ct.conexionctrlId "); sb.append(" FROM ConexionTemp ct "); sb.append(" WHERE ct.origenId || '_' || ct.destinoId NOT IN "); sb.append(" ( SELECT c.origenId || '_' || c.destinoId "); sb.append(" FROM Conexion c "); sb.append(" WHERE c.activo = 1) "); this.getSession().createQuery(sb.toString()).executeUpdate(); } @Override public List buscarPorConexionCtrl(Long conexionCtrlId) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("conexionctrlId", conexionCtrlId)); c.add(Restrictions.eq(ACTIVO, Boolean.TRUE)); c.addOrder(Order.asc("numgrupo")); c.addOrder(Order.asc("numsecuencia")); return c.list(); } @Override public Conexion buscarPorConexionRutaTramoCtrl(Integer conexionRutaTramoId) { Criteria c = getSession().createCriteria(getPersistentClass()); c.add(Restrictions.eq("conexionRutaTramoId", conexionRutaTramoId)); c.add(Restrictions.eq(ACTIVO, Boolean.TRUE)); return (Conexion) c.uniqueResult(); } }