Esempio n. 1
0
 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);
 }