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