public function execute(AMQPMessage $msg) { $msg = unserialize($msg->body); $em = $this->container->get('doctrine.orm.entity_manager'); $error = false; $idOrigen = $msg['id_origen_dato']; $origenDato = $em->find('IndicadoresBundle:OrigenDatos', $idOrigen); $nombre_conexion = null; $campos_sig = $msg['campos_significados']; $fecha = new \DateTime("now"); $ahora = $fecha->format('Y-m-d H:i:s'); //Leeré los datos en grupos de 10,000 $tamanio = 10000; try { if ($origenDato->getSentenciaSql() != '') { // Recorrer cada conexión que tenga asociado el origen de datos foreach ($origenDato->getConexiones() as $cnx) { $leidos = 10001; $i = 0; $nombre_conexion = $cnx->getNombreConexion(); if ($cnx->getIdMotor()->getCodigo() != 'pdo_dblib') { $sql = $msg['sql']; while ($leidos >= $tamanio) { // Limita la actualizacion incremental $where = ''; if (!empty($msg['limites']['valorSuperior']) || !empty($msg['limites']['valorInferior'])) { $where = 'WHERE 1=1 '; if (!empty($msg['limites']['valorSuperior'])) { $where .= ' AND ' . $msg['limites']['campoSuperior'] . '>' . $msg['limites']['valorSuperior']; } if (!empty($msg['limites']['valorInferior'])) { $where .= ' OR (' . $msg['limites']['campoSuperior'] . '=' . $msg['limites']['valorSuperior'] . ' AND ' . $msg['limites']['campoInferior'] . '>' . $msg['limites']['valorInferior'] . ')'; } } $sql_aux = 'SELECT * FROM (' . $sql . ') AS sqlOriginal ' . $where . ' LIMIT ' . $tamanio . ' OFFSET ' . $i * $tamanio; $datos = $em->getRepository('IndicadoresBundle:OrigenDatos')->getDatos($sql_aux, $cnx); $this->enviarDatos($idOrigen, $datos, $campos_sig, $ahora, $nombre_conexion, $msg); $leidos = count($datos); $i++; } } else { $datos = $em->getRepository('IndicadoresBundle:OrigenDatos')->getDatos($msg['sql'], $cnx); $this->enviarDatos($idOrigen, $datos, $campos_sig, $ahora, $nombre_conexion, $msg); } } } else { $datos = $em->getRepository('IndicadoresBundle:OrigenDatos')->getDatos(null, null, $origenDato->getAbsolutePath()); $this->enviarDatos($idOrigen, $datos, $campos_sig, $ahora, $nombre_conexion, $msg); } } catch (\Exception $exc) { $error = true; $origenDatos = $em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']); // Crear el registro para el reporte de actualizacion $reporteActualizacion = new ReporteActualizacion(); $reporteActualizacion->setOrigenDatos($origenDatos); $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 2)); $reporteActualizacion->setFecha(new \DateTime('now')); $reporteActualizacion->setReporte($exc->getMessage()); $em->persist($reporteActualizacion); $em->flush(); } if (!$error) { //Después de enviados todos los registros para guardar, mandar mensaje para borrar los antiguos $msg_guardar = array('id_origen_dato' => $idOrigen, 'method' => 'DELETE', 'ultima_lectura' => $ahora, 'es_incremental' => $msg['es_incremental']); $this->container->get('old_sound_rabbit_mq.guardar_registro_producer')->publish(serialize($msg_guardar)); } return true; }
protected function execute(InputInterface $input, OutputInterface $output) { $em = $this->getContainer()->get('doctrine')->getManager(); $ahora = new \DateTime("now"); //Recuperar todos los origenes de datos $origenesDatos = $em->getRepository('IndicadoresBundle:OrigenDatos')->findAll(); foreach ($origenesDatos as $origenDato) { $ultima_lectura = $em->getRepository('IndicadoresBundle:ReporteActualizacion')->getUltimaActualizacion($origenDato->getId()); if ($ultima_lectura == null) { $dif = 1; } else { // Agregar a la ultima lectura la ventana de actualizacion if ($origenDato->getVentana()) { $days = $origenDato->getVentana() == 1 ? 'day' : 'days'; $ultima_lectura->add(date_interval_create_from_date_string($origenDato->getVentana() . ' ' . $days)); } if ($origenDato->getPeriodicidad() != null) { $periocidad = $origenDato->getPeriodicidad()->getCodigo(); } else { $periocidad = 'd'; } $intervalo = $ahora->diff($ultima_lectura); $dif_dias = $intervalo->format('%a'); if ($periocidad == 'd') { //Diario? $dif = $dif_dias; } elseif ($periocidad == 'sm') { //semanal? $dif = $dif_dias / 7; } elseif ($periocidad == 'q') { $dif = $dif_dias / 15; } elseif ($periocidad == 'm') { $dif = $dif_dias / 30; } elseif ($periocidad == 'b') { $dif = $dif_dias / 30 * 2; } elseif ($periocidad == 't') { $dif = $dif_dias / 30 * 3; } elseif ($periocidad == 'c') { $dif = $dif_dias / 30 * 4; } elseif ($periocidad == 's') { $dif = $dif_dias / 30 * 6; } elseif ($periocidad == 'a') { $dif = $dif_dias / 365; } else { $dif = 1; } // No tiene periocidad, cargarlo } if ($dif >= 1) { // Recuperar el nombre y significado de los campos del origen de datos $campos_sig = array(); $campos = $origenDato->getCampos(); foreach ($campos as $campo) { $campos_sig[$campo->getNombre()] = $campo->getSignificado()->getCodigo(); } $campos = null; $limites = null; if ($origenDato->getActualizacionIncremental()) { $limites = null; // Obtener todos los campos del origen de datos // es necesario para la carga incremental $objsCampos = $origenDato->getCampos(); $ordenTiempo = $this->getContainer()->getParameter('tiempo'); $campos = array(); foreach ($objsCampos as $campo) { $campos[$campo->getSignificado()->getCodigo()] = $campo->getNombre(); } $maxCampoSuperior = ''; $maxCampoInferior = ''; $sqlCampoSuperior = ''; $sqlCampoInferior = ''; foreach ($ordenTiempo as $tiempo) { if (empty($maxCampoSuperior)) { if (array_key_exists($tiempo, $campos)) { $maxCampoSuperior = $tiempo; $sqlCampoSuperior = $campos[$tiempo]; } } if (array_key_exists($tiempo, $campos)) { $maxCampoInferior = $tiempo; $sqlCampoInferior = $campos[$tiempo]; } } $sql = 'SELECT MAX(CAST (datos->\'' . $maxCampoSuperior . '\' AS INTEGER)) AS val_superior, MAX(CAST (datos->\'' . $maxCampoInferior . '\' AS INTEGER)) AS val_inferior FROM fila_origen_dato WHERE id_origen_dato = ' . $origenDato->getId(); $result = $em->getConnection()->executeQuery($sql)->fetchAll(); if (!empty($result)) { $maxValorSuperior = $result[0]['val_superior']; $maxValorInferior = $result[0]['val_inferior']; // Si el mes superior es 12 entonces tomamos datos del siguiente año if ($maxCampoSuperior == 'anio' && $maxCampoInferior == 'id_mes' && $maxValorInferior == 12) { $maxValorInferior = 0; } if ($maxCampoSuperior == $maxCampoInferior) { $maxCampoInferior = null; $maxValorInferior = null; } $limites = array('campoSuperior' => $sqlCampoSuperior, 'valorSuperior' => $maxValorSuperior, 'campoInferior' => $sqlCampoInferior, 'valorInferior' => $maxValorInferior); } } $msg = array('id_origen_dato' => $origenDato->getId(), 'sql' => $origenDato->getSentenciaSql(), 'es_incremental' => $origenDato->getActualizacionIncremental(), 'campos_significados' => $campos_sig, 'limites' => $limites); $carga_directa = $origenDato->getEsCatalogo(); // No mandar a la cola de carga los que son catálogos, Se cargarán directamente if ($carga_directa) { $respuesta = $em->getRepository('IndicadoresBundle:OrigenDatos')->cargarCatalogo($origenDato); $reporteActualizacion = new ReporteActualizacion(); $reporteActualizacion->setOrigenDatos($origenDato); $reporteActualizacion->setFecha(new \DateTime('now')); if ($respuesta !== true) { // Crear el registro para el reporte de actualizacion $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 2)); $reporteActualizacion->setReporte($respuesta); } else { // Crear el registro para el reporte de actualizacion $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 1)); $reporteActualizacion->setReporte('Actualizacion correcta'); } $em->persist($reporteActualizacion); $em->flush(); } else { $this->getContainer()->get('old_sound_rabbit_mq.cargar_origen_datos_producer')->publish(serialize($msg)); } } } $em->flush(); }
public function execute(AMQPMessage $mensaje) { $msg = unserialize($mensaje->body); // Si se retorna falso se enviará un mensaje que le indicará al producer que no se pudo procesar // correctamente el mensaje y será enviado nuevamente if ($msg['method'] == 'PUT') { $fila1 = $msg['datos'][0]; $llaves_aux1 = ''; foreach ($fila1 as $k => $campo) { $llaves_aux1 .= "'{$k}', "; } $llaves_aux1 = trim($llaves_aux1, ', '); // Verificar si existe la tabla fila_origen_dato_aux, sino existe crearla try { $this->em->getConnection()->exec("SELECT 1 FROM fila_origen_dato_aux LIMIT 1"); } catch (\Exception $exc) { $this->em->getConnection()->exec("SELECT id_origen_dato, datos, ultima_lectura INTO fila_origen_dato_aux FROM fila_origen_dato LIMIT 0"); } try { $sql = "INSERT INTO fila_origen_dato_aux(id_origen_dato, datos, ultima_lectura)\n VALUES "; $i = 0; foreach ($msg['datos'] as $fila) { $llaves_aux2 = ''; foreach ($fila as $k => $campo) { $llaves_aux2 .= ":{$k}" . "_{$i}, "; } $llaves_aux2 = trim($llaves_aux2, ', '); $sql .= "(:id_origen_dato, hstore(ARRAY[{$llaves_aux1}], ARRAY[{$llaves_aux2}]), :ultima_lectura), "; $i++; } $sql = trim($sql, ', '); $sth = $this->em->getConnection()->prepare($sql); $sth->bindParam(':id_origen_dato', $msg['id_origen_dato']); $sth->bindParam(':ultima_lectura', $msg['ultima_lectura']); $this->em->getConnection()->beginTransaction(); $i = 0; foreach ($msg['datos'] as $fila) { foreach ($fila as $k => $value) { $llave = ':' . $k . '_' . $i; $sth->bindValue("{$llave}", trim($value)); } $i++; } $result = $sth->execute(); if (!$result) { return false; } $this->em->getConnection()->commit(); } catch (\Exception $exc) { $origenDatos = $this->em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']); // Crear el registro para el reporte de actualizacion $reporteActualizacion = new ReporteActualizacion(); $reporteActualizacion->setOrigenDatos($origenDatos); $reporteActualizacion->setEstatusAct($this->em->find('IndicadoresBundle:EstatusActualizacion', 2)); $reporteActualizacion->setFecha(new \DateTime('now')); $reporteActualizacion->setReporte($exc->getMessage()); $this->em->persist($reporteActualizacion); $this->em->flush(); return false; } return true; } elseif ($msg['method'] == 'DELETE') { try { $this->em->getConnection()->beginTransaction(); //Borrar los datos existentes por el momento así será pero debería haber una forma de ir a traer solo los nuevos $sql = ''; if ($msg['es_incremental'] == true) { $sql = "INSERT INTO fila_origen_dato SELECT * FROM fila_origen_dato_aux WHERE id_origen_dato='{$msg['id_origen_dato']}';\n DELETE FROM fila_origen_dato_aux WHERE id_origen_dato='{$msg['id_origen_dato']}' ;\n "; } else { $sql = "DELETE FROM fila_origen_dato WHERE id_origen_dato='{$msg['id_origen_dato']}' ;\n INSERT INTO fila_origen_dato SELECT * FROM fila_origen_dato_aux WHERE id_origen_dato='{$msg['id_origen_dato']}';\n DELETE FROM fila_origen_dato_aux WHERE id_origen_dato='{$msg['id_origen_dato']}' ;\n "; } $this->em->getConnection()->exec($sql); $this->em->getConnection()->commit(); $origenDatos = $this->em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']); // Crear el registro para el reporte de actualizacion $reporteActualizacion = new ReporteActualizacion(); $reporteActualizacion->setOrigenDatos($origenDatos); $reporteActualizacion->setEstatusAct($this->em->find('IndicadoresBundle:EstatusActualizacion', 1)); $reporteActualizacion->setFecha(new \DateTime('now')); $reporteActualizacion->setReporte('Actualizacion correcta'); $this->em->persist($reporteActualizacion); $this->em->flush(); //Recalcular la tabla del indicador //Recuperar las variables en las que está presente el origen de datos $origenDatos = $this->em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']); foreach ($origenDatos->getVariables() as $var) { foreach ($var->getIndicadores() as $ind) { // Se actualiza el campo ultima lectura del indicador $ind->setUltimaLectura(new \DateTime("now")); $this->em->persist($ind); $this->em->flush(); $fichaTec = $this->em->find('IndicadoresBundle:FichaTecnica', $ind->getId()); $fichaRepository = $this->em->getRepository('IndicadoresBundle:FichaTecnica'); $fichaRepository->crearCamposIndicador($fichaTec); if (!$fichaTec->getEsAcumulado()) { $fichaRepository->crearIndicador($fichaTec); } } } $ahora = new \DateTime("now"); foreach ($origenDatos->getVariables() as $var) { foreach ($var->getIndicadores() as $ind) { $ind->setUltimaLectura($ahora); } } } catch (\Exception $exc) { $origenDatos = $this->em->find('IndicadoresBundle:OrigenDatos', $msg['id_origen_dato']); // Crear el registro para el reporte de actualizacion $reporteActualizacion = new ReporteActualizacion(); $reporteActualizacion->setOrigenDatos($origenDatos); $reporteActualizacion->setEstatusAct($this->em->find('IndicadoresBundle:EstatusActualizacion', 2)); $reporteActualizacion->setFecha(new \DateTime('now')); $reporteActualizacion->setReporte($exc->getMessage()); $this->em->persist($reporteActualizacion); $this->em->flush(); return false; } return true; } }
public function batchActionLoadData($idx = null, $dir = "") { //Mardar a la cola de carga de datos cada origen seleccionado $parameterBag = $this->get('request')->request; $em = $this->getDoctrine()->getManager(); if (!$parameterBag->get('all_elements')) { $selecciones = $idx == null ? $parameterBag->get('idx') : $idx; } else { $selecciones = $em->getRepository('IndicadoresBundle:OrigenDatos')->findAll(); } foreach ($selecciones as $origen) { if (!$parameterBag->get('all_elements')) { $origenDato = $em->find('IndicadoresBundle:OrigenDatos', $origen); } else { $origenDato = $origen; } // Recuperar el nombre y significado de los campos del origen de datos $campos_sig = array(); $campos = $origenDato->getCampos(); foreach ($campos as $campo) { $campos_sig[$campo->getNombre()] = $campo->getSignificado()->getCodigo(); } if ($origenDato->getActualizacionIncremental()) { $limites = NULL; // Obtener todos los campos del origen de datos // es necesario para la carga incremental $objsCampos = $origenDato->getCampos(); $ordenTiempo = $this->container->getParameter('tiempo'); $campos = array(); foreach ($objsCampos as $campo) { $campos[$campo->getSignificado()->getCodigo()] = $campo->getNombre(); } $maxCampoSuperior = ''; $maxCampoInferior = ''; $sqlCampoSuperior = ''; $sqlCampoInferior = ''; foreach ($ordenTiempo as $tiempo) { if (empty($maxCampoSuperior)) { if (array_key_exists($tiempo, $campos)) { $maxCampoSuperior = $tiempo; $sqlCampoSuperior = $campos[$tiempo]; } } if (array_key_exists($tiempo, $campos)) { $maxCampoInferior = $tiempo; $sqlCampoInferior = $campos[$tiempo]; } } $sql = 'SELECT MAX(CAST (datos->\'' . $maxCampoSuperior . '\' AS INTEGER)) AS val_superior, MAX(CAST (datos->\'' . $maxCampoInferior . '\' AS INTEGER)) AS val_inferior FROM fila_origen_dato WHERE id_origen_dato = ' . $origen; $result = $this->getDoctrine()->getManager()->getConnection()->executeQuery($sql)->fetchAll(); if (!empty($result)) { $maxValorSuperior = $result[0]['val_superior']; $maxValorInferior = $result[0]['val_inferior']; if ($maxCampoSuperior == 'anio' && $maxCampoInferior == 'id_mes' && $maxValorInferior == 12) { //$maxValorSuperior++; $maxValorInferior = 0; } if ($maxCampoSuperior == $maxCampoInferior) { $maxCampoInferior = null; $maxValorInferior = null; } $limites = array('campoSuperior' => $sqlCampoSuperior, 'valorSuperior' => $maxValorSuperior, 'campoInferior' => $sqlCampoInferior, 'valorInferior' => $maxValorInferior); } } $msg = array('id_origen_dato' => $origen, 'sql' => $origenDato->getSentenciaSql(), 'campos_significados' => $campos_sig, 'es_incremental' => $origenDato->getActualizacionIncremental(), 'limites' => $limites); $ahora = new \DateTime("now"); foreach ($origenDato->getVariables() as $var) { foreach ($var->getIndicadores() as $ind) { $ind->setUltimaLectura($ahora); } } $em->flush(); $carga_directa = $origenDato->getEsCatalogo(); // No mandar a la cola de carga los que son catálogos, Se cargarán directamente if ($carga_directa) { $mess = $em->getRepository('IndicadoresBundle:OrigenDatos')->cargarCatalogo($origenDato); if ($mess !== true) { $this->addFlash('sonata_flash_error', $mess); // Crear el registro para el reporte de actualizacion $reporteActualizacion = new ReporteActualizacion(); $reporteActualizacion->setOrigenDatos($origenDato); $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 2)); $reporteActualizacion->setFecha(new \DateTime('now')); $reporteActualizacion->setReporte($mess); $em->persist($reporteActualizacion); $em->flush(); if ($dir == "") { return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters())); } } else { // Crear el registro para el reporte de actualizacion $reporteActualizacion = new ReporteActualizacion(); $reporteActualizacion->setOrigenDatos($origenDato); $reporteActualizacion->setEstatusAct($em->find('IndicadoresBundle:EstatusActualizacion', 1)); $reporteActualizacion->setFecha(new \DateTime('now')); $reporteActualizacion->setReporte('Actualizacion correcta'); $em->persist($reporteActualizacion); $em->flush(); } } else { $this->get('old_sound_rabbit_mq.cargar_origen_datos_producer')->publish(serialize($msg)); } } $this->addFlash('sonata_flash_success', $this->get('translator')->trans('flash_batch_load_data_success')); if ($dir == "") { return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters())); } else { return $this->get('translator')->trans('flash_batch_load_data_success'); } }