protected function formatColumnNameImpl($uiMetaDataName) {
        $columnName = NULL;

        $formattedUIMetaDataName = parent::formatColumnNameImpl($uiMetaDataName);

        list($elementNameSpace, $elementName) = AbstractDatasetUIMetaDataGenerator::splitElementUIMetaDataName($formattedUIMetaDataName);
        switch ($elementNameSpace) {
            case AbstractAttributeUIMetaData::NAME_SPACE:
                list($dimensionName, $dimensionColumnName) = ParameterNameHelper::split($elementName);
                // TODO do we need to check for resource?
                list(, $columnName) = ReferencePathHelper::splitReference($dimensionName);

                $column = $this->dataset->getColumn($dimensionName);
                if ($column->type->getReferencedDatasetName() != NULL) {
                    // this column should not be used
                    if (isset($dimensionColumnName) && $column->type->getReferencedColumnName() != $dimensionColumnName) {
                        $columnName = NULL;
                    }
                }

                break;
            case AbstractMeasureUIMetaData::NAME_SPACE:
                throw new IllegalArgumentException(t('Measures are not supported by this result formatter'));
        }

        return $columnName;
    }
    protected function detectParameterKind(AbstractCubeQueryRequest $request, CubeMetaData $cube, $parameterName) {
        $metamodel = data_controller_get_metamodel();

        list($rootName, $leafName) = ParameterNameHelper::split($parameterName);

        list($referencedDatasetName, $referencedRootName) = ReferencePathHelper::splitReference($rootName);
        // checking that referenced cube exists
        $referencedCube = isset($referencedDatasetName)
            ? $metamodel->getCubeByDatasetName($referencedDatasetName)
            : NULL;

        $selectedCube = isset($referencedCube) ? $referencedCube : $cube;
        $selectedRequest = isset($referencedCube) ? $request->registerReferencedRequest($referencedCube->name) : $request;

        // detecting type of the parameter: dimension or measure
        $isDimension = $isMeasure = FALSE;
        if (isset($leafName)) {
            // if dimension column exists - dimension exists too :)
            $isDimension = TRUE;
        }
        else {
            // trying to find a measure
            $measure = $selectedCube->findMeasure($referencedRootName);
            if (isset($measure)) {
                $isMeasure = TRUE;
            }
            else {
                $formula = $request->findFormula($referencedRootName);
                if (isset($formula)) {
                    if (isset($formula->isMeasure) && $formula->isMeasure) {
                        $isMeasure = TRUE;
                    }
                    else {
                        $isDimension = TRUE;
                    }
                }
            }
            // trying to find a dimension
            $dimension = $selectedCube->findDimension($referencedRootName);
            if (isset($dimension)) {
                $isDimension = TRUE;
            }
        }
        if ($isDimension && $isMeasure) {
            throw new IllegalArgumentException(t(
                'The parameter refers to both a dimension and a measure: %parameterName',
                array('%parameterName' => $parameterName)));
        }

        if ($isDimension) {
            if (isset($referencedCube)) {
                throw new IllegalArgumentException(t('Referenced dimensions are not supported yet'));
            }
        }

        return array($selectedRequest, $isDimension, $isMeasure, $referencedRootName, $leafName);
    }
    public static function getExportColumnName ( $uiMetaDataName, MetaModel $metamodel ) {

        if ( trim($uiMetaDataName) == '' ) {
            $message = t('Empty columnName discovered');
            drupal_set_message($message, 'warning');
            LogHelper::log_warn($message);

            return $uiMetaDataName;
        }


        list($elementNameSpace, $name) = AbstractDatasetUIMetaDataGenerator::splitElementUIMetaDataName($uiMetaDataName);
        switch ( $elementNameSpace ) {

            case AbstractAttributeUIMetaData::NAME_SPACE:
                list($referencedDimensionName, $dimensionColumnName) = ParameterNameHelper::split($name);
                list($datasetName, $dimensionName) = ReferencePathHelper::splitReference($referencedDimensionName);
                if (isset($datasetName)) {
                    $adjustedReferencedDimensionName = ReferencePathHelper::assembleReference(self::getExportDatasetName($datasetName,$metamodel), $dimensionName);
                    $name = ParameterNameHelper::assemble($adjustedReferencedDimensionName, $dimensionColumnName);
                }
                break;

            case AbstractMeasureUIMetaData::NAME_SPACE:
                list($datasetName, $measureName) = ReferencePathHelper::splitReference($name);
                if (isset($datasetName)) {
                    $name = ReferencePathHelper::assembleReference(self::getExportDatasetName($datasetName,$metamodel), $measureName);
                }
                break;

            case FormulaUIMetaData::NAME_SPACE:
                list($datasetName, $formulaName) = ReferencePathHelper::splitReference($name);
                if (isset($datasetName)) {
                    $name = ReferencePathHelper::assembleReference(self::getExportDatasetName($datasetName,$metamodel), $formulaName);
                }
                break;

            default:
                $message = t('Unsupported UI Meta Data name space: @uiMetaDataName', array('@uiMetaDataName' => $uiMetaDataName));
                LogHelper::log_error($message);
                throw new UnsupportedOperationException($message);
        }

        return AbstractDatasetUIMetaDataGenerator::prepareElementUIMetaDataName($elementNameSpace, $name);
    }
    public function initiateSortingConfiguration($columnName, $isSortAscending = TRUE) {
        list($rootName, $leafName) = ParameterNameHelper::split($columnName);

        $isFormula = $this->findFormula($rootName) != NULL;
        if (!$isFormula) {
            StringDataTypeHandler::checkValueAsWord($rootName);
            ReferencePathHelper::checkReference($leafName);
        }

        return new __AbstractCubeQueryRequest_SortingConfiguration($rootName, $leafName, $isSortAscending);
    }
    public static function parseUIMetaDataName($defaultDatasetName, $uiMetaDataName, array $options = NULL) {
        $parsedUIMetaDataName = NULL;

        list($elementNameSpace, $name) = AbstractDatasetUIMetaDataGenerator::splitElementUIMetaDataName($uiMetaDataName);
        switch ($elementNameSpace) {
            case AbstractAttributeUIMetaData::NAME_SPACE:
                $parsedUIMetaDataName = new AttributeParsedUIMetaDataName();
                list($parsedUIMetaDataName->name, $parsedUIMetaDataName->columnName) = ParameterNameHelper::split($name);
                list($parsedUIMetaDataName->datasetName) = ReferencePathHelper::splitReference($parsedUIMetaDataName->name);
                break;
            case AbstractMeasureUIMetaData::NAME_SPACE:
                $parsedUIMetaDataName = new MeasureParsedUIMetaDataName();
                $parsedUIMetaDataName->name = $name;
                list($parsedUIMetaDataName->datasetName) = ReferencePathHelper::splitReference($parsedUIMetaDataName->name);
                break;
            case FormulaUIMetaData::NAME_SPACE:
                list($datasetName, $formulaName) = ReferencePathHelper::splitReference($name);

                // looking for formula configuration
                $selectedFormula = NULL;
                if (isset($options[AbstractQueryRequest::OPTION__FORMULA_DEF])) {
                    $formulas = $options[AbstractQueryRequest::OPTION__FORMULA_DEF];
                    foreach ($formulas as $formula) {
                        if ($formula->name == $formulaName) {
                            $selectedFormula = $formula;
                            break;
                        }
                    }
                }
                if (!isset($selectedFormula)) {
                    throw new IllegalStateException(t(
                        'Undefined formula configuration: %formulaName',
                        array('%formulaName' => $name)));
                }

                $parsedUIMetaDataName = isset($selectedFormula->isMeasure) && $selectedFormula->isMeasure
                    ? new FormulaMeasureParsedUIMetaDataName()
                    : new FormulaAttributeParsedUIMetaDataName();
                $parsedUIMetaDataName->name = $name;
                $parsedUIMetaDataName->datasetName = $datasetName;

                break;
            default:
                throw new UnsupportedOperationException(t('Unsupported UI Meta Data name space: %uiMetaDataName', array('%uiMetaDataName' => $uiMetaDataName)));
        }

        if (!isset($parsedUIMetaDataName->datasetName)) {
            $parsedUIMetaDataName->datasetName = $defaultDatasetName;
        }

        return $parsedUIMetaDataName;
    }
    protected function adjustCubeCountRequestImpl(DataControllerCallContext $callcontext, CubeCountRequest $request) {
        list($dimensionName) = ParameterNameHelper::split($this->enumerationColumnName);

        // we have to find corresponding dimension in this request
        $isDirectionFound = FALSE;
        if (isset($request->dimensions)) {
            foreach ($request->dimensions as $index => $dimension) {
                if ($dimension->name == $dimensionName) {
                    $isDirectionFound = TRUE;
                    unset($request->dimensions[$index]);

                    break;
                }
            }
        }
        if (!$isDirectionFound) {
            throw new IllegalStateException(t(
            	'Could not find configuration for %dimensionName dimension in the request',
                array('%dimensionName' => $dimensionName)));
        }
    }