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); }
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; }