Example #1
0
 public function executeQueries(array $filters, ReportView $view)
 {
     $config = Zend_Registry::get('config');
     $dbName = $config->database->params->dbname;
     $db = Zend_Registry::get('dbAdapter');
     $ret = array();
     $filterQueries = array();
     $reportFilters = array();
     foreach ($this->reportFilters as $key => $filter) {
         if ($filter->type == 'QUERY') {
             $filterQueries[$filter->query] = $filter->query;
         }
         $reportFilters['{{' . $filter->name . '}}'] = $filter;
     }
     //trigger_error(print_r($reportFilters,true),E_USER_NOTICE);
     $reportQuery = new ReportQuery();
     $reportQueryIterator = $reportQuery->getIteratorByBaseId($this->reportBaseId);
     $viewColumnDefinitions = array();
     $unserializedColumnDefinitions = $view->unserializedColumnDefinitions;
     if ($unserializedColumnDefinitions === null) {
         $unserializedColumnDefinitions = array();
     }
     foreach ($unserializedColumnDefinitions as $id => $value) {
         $viewColumnDefinitions[$value->queryId][$id] = $value;
     }
     //file_put_contents('/tmp/columns.txt',print_r($columnDefinitions,true));
     foreach ($reportQueryIterator as $query) {
         if (isset($filterQueries[$query->reportQueryId])) {
             continue;
         }
         // report query associated with filter not included
         $row = array();
         $row['reportQuery'] = $query->toArray();
         $row['reportQuery']['customColNames'] = (bool) $view->customizeColumnNames;
         $queryValue = $query->query;
         $tokens = $this->_extractTokens($queryValue);
         if (isset($tokens[0])) {
             // tokens defined
             // check for undefined/orphaned filter
             $undefinedTokens = array();
             foreach ($tokens as $token) {
                 if (!isset($reportFilters[$token])) {
                     $undefinedTokens[] = $token;
                 }
             }
             if (isset($undefinedTokens[0])) {
                 $error = 'Query "' . $query->displayName . '" contains undefined tokens: ' . implode(', ', $undefinedTokens);
                 $row['error'] = $error;
                 trigger_error($error, E_USER_NOTICE);
                 $ret[] = $row;
                 continue;
             }
             $queryValue = $this->_applyFilters($filters, $queryValue);
         }
         $columnDefinitions = array();
         if (isset($viewColumnDefinitions[$query->reportQueryId])) {
             $columnDefinitions = $viewColumnDefinitions[$query->reportQueryId];
         } else {
             foreach ($viewColumnDefinitions as $id => $value) {
                 foreach ($value as $i => $v) {
                     if ($v->queryId != 0 || $v->queryName != $query->reportQueryId) {
                         continue;
                     }
                     $columnDefinitions[$i] = $v;
                 }
             }
         }
         //file_put_contents('/tmp/columns.txt',$query->reportQueryId.' = '.print_r($columnDefinitions,true),FILE_APPEND);
         $columnDefinitionLen = count($columnDefinitions);
         switch ($query->type) {
             case ReportQuery::TYPE_SQL:
                 //file_put_contents('/tmp/query.sql',$queryValue);
                 trigger_error($queryValue, E_USER_NOTICE);
                 // extract and execute defined SQL variables
                 $tmp = explode(';', $queryValue);
                 if (count($tmp) > 0) {
                     foreach ($tmp as $key => $line) {
                         $line = trim($line);
                         if (substr($line, 0, 5) == 'SET @') {
                             unset($tmp[$key]);
                             trigger_error('EXECUTING SQL: ' . $line);
                             $db->query($line);
                         }
                     }
                     $queryValue = implode(';', $tmp);
                 }
                 try {
                     $results = array();
                     $headers = array();
                     $stmt = $db->query($queryValue, array(), Zend_Db::FETCH_NUM);
                     $columnInfo = array();
                     $rowCount = $stmt->rowCount();
                     for ($i = 0; $i < $rowCount; $i++) {
                         $fetchRow = $stmt->fetch(Zend_Db::FETCH_NUM, null, $i);
                         if ($i == 0) {
                             for ($ctr = 0, $rowLen = count($fetchRow); $ctr < $rowLen; $ctr++) {
                                 $columnMeta = $stmt->getColumnMeta($ctr);
                                 if ($view->customizeColumnNames && $columnDefinitionLen > 0) {
                                     $resultSetName = $dbName . '.' . $columnMeta['table'] . '.' . $columnMeta['name'];
                                     foreach ($columnDefinitions as $id => $mapping) {
                                         // id, queryId, queryName, resultSetName, displayName, transform
                                         if ($mapping->resultSetName == $resultSetName) {
                                             $headers[$ctr] = $mapping->displayName;
                                             $columnInfo[$ctr] = $mapping;
                                             break;
                                         }
                                     }
                                 } else {
                                     $headers[$ctr] = $columnMeta['name'];
                                 }
                             }
                         }
                         $tmpResult = array('id' => $i, 'data' => array());
                         if ($view->customizeColumnNames && $columnDefinitionLen > 0) {
                             $tmp = array();
                             foreach ($columnInfo as $index => $mapping) {
                                 $tmp[$mapping->displayName] = $this->_applyTransforms($mapping->transforms, $fetchRow[$index]);
                             }
                             $tmpHeaders = $headers;
                             $headers = array();
                             foreach ($columnDefinitions as $id => $mapping) {
                                 // id, queryId, queryName, resultSetName, displayName, transform
                                 $tmpResult['data'][] = $tmp[$mapping->displayName];
                                 foreach ($tmpHeaders as $key => $header) {
                                     if ($header != $mapping->displayName) {
                                         continue;
                                     }
                                     $headers[] = $header;
                                     unset($tmpHeaders[$key]);
                                     break;
                                 }
                             }
                         } else {
                             foreach ($headers as $index => $header) {
                                 $tmpResult['data'][] = $fetchRow[$index];
                             }
                         }
                         $results[] = $tmpResult;
                     }
                     $row['headers'] = $headers;
                     $row['rows'] = $results;
                 } catch (Exception $e) {
                     $uniqErrCode = uniqid();
                     $row['error'] = 'There was a problem executing query: ' . $query->displayName . '. Contact your administrator with error code: ' . $uniqErrCode;
                     trigger_error('Exception error (' . $uniqErrCode . '): ' . $e->getMessage(), E_USER_NOTICE);
                     trigger_error('SQL Query (' . $uniqErrCode . '): ' . $queryValue, E_USER_NOTICE);
                 }
                 $ret[] = $row;
                 break;
             case ReportQuery::TYPE_NSDR:
                 $nsdr = explode("\n", $queryValue);
                 $nsdrResults = array();
                 $allDefaults = true;
                 foreach ($nsdr as $key => $value) {
                     $value = $this->_applyFilters($filters, $value);
                     $resultSetName = ReportView::extractNamespace($value);
                     //$displayName = ReportView::metaDataPrettyName($resultSetName);
                     $nsdrResult = NSDR2::populate($value);
                     // NOTE: return of NSDR2::populate() can be either of the following: string, associative array (all keys are treated as column names and values as row/ cell values), and multidimensional array (contains multiple associative arrays)
                     $data = array($resultSetName, $nsdrResult);
                     if (is_array($nsdrResult)) {
                         if (array_key_exists(0, $nsdrResult)) {
                             if (!is_array($nsdrResult[0])) {
                                 $data[1] = implode("\n", $nsdrResult);
                             } else {
                                 // multi dimensional array
                                 $allDefaults = false;
                                 foreach ($nsdrResult as $index => $results) {
                                     $data = array();
                                     $row['headers'] = array();
                                     foreach ($results as $k => $v) {
                                         $row['headers'][] = ReportView::metaDataPrettyName($k);
                                         $data[] = $v;
                                     }
                                     $nsdrResults[$resultSetName][] = array('id' => $key . $index, 'data' => $data);
                                 }
                                 continue;
                             }
                         } else {
                             $allDefaults = false;
                             $row['headers'] = array();
                             $data = array();
                             foreach ($nsdrResult as $k => $v) {
                                 $row['headers'][] = ReportView::metaDataPrettyName($k);
                                 $data[] = $v;
                             }
                         }
                     }
                     $nsdrResults[$resultSetName][] = array('id' => $key, 'data' => $data);
                 }
                 if ($allDefaults) {
                     $row['headers'] = array('Name', 'Value');
                 }
                 /*else {
                 			if (isset($row['headers'][0]) && $row['headers'][0] != 'Name') $row['headers'][0] .= ' / Name';
                 			if (isset($row['headers'][1]) && $row['headers'][1] != 'Value') $row['headers'][1] .= ' / Value';
                 		}*/
                 if ($view->customizeColumnNames && $columnDefinitionLen > 0) {
                     foreach ($columnDefinitions as $id => $mapping) {
                         // id, queryId, queryName, resultSetName, displayName, transform
                         $displayName = $mapping->resultSetName;
                         if (!isset($nsdrResults[$displayName]) || ($mapping->queryId != 0 && $mapping->queryId != $query->reportQueryId || $mapping->queryId == 0 && $mapping->queryName != $query->reportQueryId) && $mapping->queryName != $query->displayName) {
                             continue;
                         }
                         //$displayName = ReportView::metaDataPrettyName($mapping->resultSetName);
                         foreach ($nsdrResults[$displayName] as $key => $value) {
                             $data = $nsdrResults[$displayName][$key]['data'];
                             if (!array_key_exists(0, $data)) {
                                 continue;
                             }
                             foreach ($data as $k => $v) {
                                 if ($k == 0 && $v == $displayName) {
                                     $v = $mapping->displayName;
                                 } else {
                                     $v = $this->_applyTransforms($mapping->transforms, $v);
                                 }
                                 $nsdrResults[$displayName][$key]['data'][$k] = $v;
                             }
                             $data = $nsdrResults[$displayName][$key]['data'][1];
                         }
                     }
                 }
                 $results = array();
                 foreach ($nsdrResults as $result) {
                     foreach ($result as $key => $value) {
                         $results[] = $value;
                     }
                 }
                 $row['rows'] = $results;
                 $ret[] = $row;
                 break;
         }
     }
     return $ret;
 }
 public function processAddMappingAction()
 {
     $config = Zend_Registry::get('config');
     $dbName = $config->database->params->dbname;
     $viewId = (int) $this->_getParam('viewId');
     $reportView = new ReportView();
     $reportView->reportViewId = $viewId;
     $reportView->populate();
     $columnDefinitions = $reportView->unserializedColumnDefinitions;
     $queryName = '';
     $row = ReportView::generateMappingObject($queryName);
     $row->resultSetName = $dbName;
     $row->displayName = ReportView::metaDataPrettyName($row->resultSetName);
     $columnDefinitions[$row->id] = $row;
     $reportView->serializedColumnDefinitions = $columnDefinitions;
     $reportView->persist();
     $data = $this->_generateMappingGridRowData($row);
     $json = Zend_Controller_Action_HelperBroker::getStaticHelper('json');
     $json->suppressExit = true;
     $json->direct($data);
 }
Example #3
0
 public function executeQueries(array $filters, ReportView $view)
 {
     $config = Zend_Registry::get('config');
     $dbName = $config->database->params->dbname;
     $db = Zend_Registry::get('dbAdapter');
     $ret = array();
     $reportFilters = array();
     foreach ($this->reportFilters as $key => $filter) {
         $reportFilters['{{' . $filter->name . '}}'] = $filter;
     }
     //trigger_error(print_r($reportFilters,true),E_USER_NOTICE);
     $reportQuery = new ReportQuery();
     $reportQueryIterator = $reportQuery->getIteratorByBaseId($this->reportBaseId);
     foreach ($reportQueryIterator as $query) {
         $row = array();
         $row['reportQuery'] = $query->toArray();
         $queryValue = $query->query;
         $tokens = $this->_extractTokens($queryValue);
         if (isset($tokens[0])) {
             // tokens defined
             // check for undefined/orphaned filter
             $undefinedTokens = array();
             foreach ($tokens as $token) {
                 if (!isset($reportFilters[$token])) {
                     $undefinedTokens[] = $token;
                 }
             }
             if (isset($undefinedTokens[0])) {
                 $error = 'Query "' . $query->displayName . '" contains undefined tokens: ' . implode(', ', $undefinedTokens);
                 $row['error'] = $error;
                 trigger_error($error, E_USER_NOTICE);
                 $ret[] = $row;
                 continue;
             }
             $queryValue = $this->_applyFilters($filters, $queryValue, $tokens);
         }
         $columnDefinitions = $view->unserializedColumnDefinitions;
         switch ($query->type) {
             case ReportQuery::TYPE_SQL:
                 trigger_error($queryValue, E_USER_NOTICE);
                 try {
                     if ($view->customizeColumnNames) {
                         $results = array();
                         $stmt = $db->query($queryValue, array(), Zend_Db::FETCH_NUM);
                         $columnInfo = array();
                         $rowCount = $stmt->rowCount();
                         for ($i = 0; $i < $rowCount; $i++) {
                             $fetchRow = $stmt->fetch(Zend_Db::FETCH_NUM, null, $i);
                             if ($i == 0) {
                                 for ($ctr = 0, $rowLen = count($fetchRow); $ctr < $rowLen; $ctr++) {
                                     $columnMeta = $stmt->getColumnMeta($ctr);
                                     $resultSetName = $dbName . '.' . $columnMeta['table'] . '.' . $columnMeta['name'];
                                     foreach ($columnDefinitions as $id => $mapping) {
                                         // id, queryId, queryName, resultSetName, displayName, transform
                                         if ($mapping->resultSetName == $resultSetName) {
                                             $columnInfo[$ctr] = $mapping;
                                             break;
                                         }
                                     }
                                 }
                             }
                             $tmp = array();
                             foreach ($columnInfo as $index => $mapping) {
                                 $tmp[$mapping->displayName] = $this->_applyTransforms($mapping->transforms, $fetchRow[$index]);
                             }
                             $tmpResult = array();
                             foreach ($columnDefinitions as $id => $mapping) {
                                 // id, queryId, queryName, resultSetName, displayName, transform
                                 $tmpResult[$mapping->displayName] = $tmp[$mapping->displayName];
                             }
                             $results[] = $tmpResult;
                         }
                     } else {
                         $results = $db->fetchAll($queryValue);
                     }
                     $row['rows'] = $results;
                 } catch (Exception $e) {
                     $uniqErrCode = uniqid();
                     $row['error'] = 'There was a problem executing query: ' . $query->displayName . '. Contact your administrator with error code: ' . $uniqErrCode;
                     trigger_error('Exception error (' . $uniqErrCode . '): ' . $e->getMessage(), E_USER_NOTICE);
                     trigger_error('SQL Query (' . $uniqErrCode . '): ' . $queryValue, E_USER_NOTICE);
                 }
                 $ret[] = $row;
                 break;
             case ReportQuery::TYPE_NSDR:
                 $nsdr = explode("\n", $queryValue);
                 $results = array();
                 foreach ($nsdr as $key => $value) {
                     $tokens = $this->_extractTokens($queryValue);
                     if (isset($tokens[0])) {
                         $value = $this->_applyFilters($filters, $value);
                     }
                     $resultSetName = ReportView::extractNamespace($value);
                     $displayName = ReportView::metaDataPrettyName($resultSetName);
                     $nsdrResult = NSDR::populate($value);
                     $tmp = array('Name' => $displayName, 'Value' => '');
                     $tmp['Value'] = $nsdrResult[$value];
                     $results[] = $tmp;
                 }
                 if ($view->customizeColumnNames) {
                     $tmpResults = $results;
                     $results = array();
                     foreach ($columnDefinitions as $id => $mapping) {
                         // id, queryId, queryName, resultSetName, displayName, transform
                         if ($mapping->queryId != $query->reportQueryId && $mapping->queryName != $query->displayName) {
                             continue;
                         }
                         $displayName = ReportView::metaDataPrettyName($mapping->resultSetName);
                         $tmp = array('Name' => $displayName, 'Value' => '');
                         if (isset($tmpResults[$displayName])) {
                             $tmp['Value'] = $this->_applyTransforms($mapping->transforms, $tmpResults[$displayName]);
                         }
                         $results[] = $tmp;
                     }
                 }
                 $row['rows'] = $results;
                 $ret[] = $row;
                 break;
         }
     }
     return $ret;
 }