public function prepareCubeMetaData(DataControllerCallContext $callcontext, CubeMetaData $cube) { $measureNames = NULL; if (isset($cube->measures)) { foreach ($cube->measures as $measure) { if ($measure->isComplete()) { continue; } $measureNames[] = $measure->name; } } // we need at least one incomplete measure to proceed if (!isset($measureNames)) { return; } $environment_metamodel = data_controller_get_environment_metamodel(); $datasource = $environment_metamodel->getDataSource($cube->sourceDataset->datasourceName); $queryRequest = new CubeQueryRequest($cube->name); // requesting all measures to get their type foreach ($measureNames as $requestColumnIndex => $measureName) { $queryRequest->addMeasure($requestColumnIndex, $measureName); } // we do not need to return any records, we just analyze structure $queryRequest->setPagination(0); $aggrStatement = $this->prepareCubeQueryStatement($callcontext, $queryRequest); list($isSubqueryRequired, $assembledAggregationSections) = $aggrStatement->prepareSections(NULL); $sql = Statement::assemble($isSubqueryRequired, NULL, $assembledAggregationSections); // applying pagination $this->applyPagination($queryRequest, $sql); $measureDatasetMetaData = $this->processDatasetMetaData($callcontext, $datasource, $sql); // processing all measures and setting up types foreach ($measureNames as $measureName) { $column = $measureDatasetMetaData->getColumn($measureName); $cube->getMeasure($measureName)->initializeTypeFrom($column->type); } }