public function crearTablaIndicador(FichaTecnica $fichaTecnica, $duracion = 10) { $ahora = new \DateTime("now"); if ($fichaTecnica->getUpdatedAt() != '') { $ultimo_calculo = $fichaTecnica->getUpdatedAt()->getTimestamp(); $diff_minutos = ($ahora->getTimestamp() - $ultimo_calculo) / 60; if ($diff_minutos <= $duracion) { return; } } $em = $this->getEntityManager(); $util = new \MINSAL\IndicadoresBundle\Util\Util(); $campos = str_replace("'", '', $fichaTecnica->getCamposIndicador()); $nombre_indicador = $util->slug($fichaTecnica->getNombre()); $tablas_variables = array(); $sql = ''; // Crear las tablas para cada variable foreach ($fichaTecnica->getVariables() as $variable) { //Recuperar la información de los campos para crear la tabla $tabla = strtolower($variable->getIniciales()); $sql .= 'DROP TABLE IF EXISTS tmp_ind_' . $nombre_indicador . '; '; $sql .= 'CREATE TEMP TABLE IF NOT EXISTS ' . $tabla . '('; foreach ($variable->getOrigenDatos()->getCampos() as $campo) { $sql .= $campo->getSignificado()->getCodigo() . ' ' . $campo->getTipoCampo()->getCodigo() . ', '; } $sql = trim($sql, ', ') . ');'; //Llenar la tabla con los valores del hstore $sql .= "INSERT INTO {$tabla}\n SELECT (populate_record(null::{$tabla}, datos)).* \n FROM fila_origen_dato \n WHERE id_origen_dato = " . $variable->getOrigenDatos()->getId() . ' ;'; //Obtener solo los datos que se pueden procesar en el indicador $sql .= "SELECT {$campos}, SUM(calculo::numeric) AS " . $tabla . "\n INTO TEMP {$tabla}" . "_var\n FROM {$tabla} \n GROUP BY {$campos} \n HAVING SUM(calculo::numeric) > 0\n ;"; $tablas_variables[] = $tabla; } $sql .= 'SELECT ' . $campos . ',' . implode(',', $tablas_variables) . " INTO tmp_ind_" . $nombre_indicador . " FROM " . array_shift($tablas_variables) . '_var '; foreach ($tablas_variables as $tabla) { $sql .= " INNER JOIN " . $tabla . "_var USING ({$campos}) "; } $fichaTecnica->setUpdatedAt($ahora); $em->persist($fichaTecnica); $em->flush(); $em->getConnection()->exec($sql); }