protected function prepareCubeRequestColumns(CubeQueryRequest $request, CubeMetaData $cube, array $columnNames)
 {
     $metamodel = data_controller_get_metamodel();
     foreach ($columnNames as $requestColumnIndex => $columnName) {
         list($elementName, $subElementName, $propertyName) = ParameterHelper::splitName($columnName);
         list($referencedDatasetName, $referencedElementName) = ReferencePathHelper::splitReference($elementName);
         // checking that referenced cube exists
         $referencedCube = isset($referencedDatasetName) ? $metamodel->getCubeByDatasetName($referencedDatasetName) : NULL;
         if (isset($subElementName)) {
             if (isset($referencedCube)) {
                 throw new IllegalArgumentException(t('Referenced dimensions are not supported'));
             }
             // checking the level exists
             $dimension = $cube->getDimension($elementName);
             $level = $dimension->getLevel($subElementName);
             // adding the level
             if (isset($propertyName)) {
                 $request->addDimensionLevelProperty($requestColumnIndex, $elementName, $subElementName, $propertyName);
             } else {
                 $request->addDimensionLevel($requestColumnIndex, $elementName, $subElementName);
             }
         } else {
             $selectedRequest = $request;
             if (isset($referencedCube)) {
                 // checking the measure exists in the referenced cube
                 $measure = $referencedCube->getMeasure($referencedElementName);
                 // preparing referenced request
                 $selectedRequest = $request->registerReferencedRequest($referencedCube->name);
             } else {
                 // checking the measure exists
                 $measure = $cube->getMeasure($referencedElementName);
             }
             // adding the measure
             $selectedRequest->addMeasure($requestColumnIndex, $referencedElementName);
         }
     }
 }
    protected function prepareAttributeCustomMeasure(AbstractAttributeUIMetaData $attributeUIMetaData, $referencePath, CubeMetaData $cube, $measureName) {
        $measure = $cube->getMeasure($measureName);
        $measureUIMetaData = new FactMeasureUIMetaData();
        $measureUIMetaData->name = self::prepareMeasureUIMetaDataName($referencePath, $cube, $measureName);
        $measureUIMetaData->publicName = $measure->publicName;
        $measureUIMetaData->description = $measure->description;
        $measureUIMetaData->type = clone $measure->type;

        $attributeUIMetaData->registerElement($measureUIMetaData);
    }
 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);
     }
 }