protected static function prepareListColumnMappings(array $cubes = NULL, array $parsedUIMetaDataNames) {
        $columnMappings = NULL;

        foreach ($parsedUIMetaDataNames as $columnName => $parsedUIMetaDataName) {
            $datasetColumnName = NULL;
            if ($parsedUIMetaDataName instanceof AttributeParsedUIMetaDataName) {
                $cube = isset($cubes[$parsedUIMetaDataName->datasetName]) ? $cubes[$parsedUIMetaDataName->datasetName] : NULL;
                if (isset($cube)) {
                    $dimension = $cube->getDimension($parsedUIMetaDataName->name);

                    $references = NULL;
                    if (isset($parsedUIMetaDataName->columnName)) {
                        $column = $cube->factsDataset->getColumn($dimension->attributeColumnName);
                        $branch = $column->findBranch($parsedUIMetaDataName->columnName);
                        // the dimension column can be a branch, not a dimension dataset column
                        if (!isset($branch) && isset($dimension->datasetName)) {
                            list($adjustedDimensionDatasetName) = gd_data_controller_metamodel_adjust_dataset_name($dimension->datasetName);
                            $references[] = ReferencePathHelper::assembleReference($adjustedDimensionDatasetName, $parsedUIMetaDataName->columnName);
                        }
                    }

                    if (isset($references)) {
                        $references[] = ReferencePathHelper::assembleReference($cube->factsDatasetName, $dimension->attributeColumnName);
                        $datasetColumnName = ReferencePathHelper::assembleReferencePath($references);
                    }
                    else {
                        $datasetColumnName = isset($parsedUIMetaDataName->columnName)
                            ? $parsedUIMetaDataName->columnName
                            : $dimension->attributeColumnName;
                    }
                }
                else {
                    $datasetColumnName = $parsedUIMetaDataName->name;
                }
            }
            elseif ($parsedUIMetaDataName instanceof FormulaAttributeParsedUIMetaDataName) {
                $datasetColumnName = $parsedUIMetaDataName->name;
            }
            elseif ($parsedUIMetaDataName instanceof FormulaMeasureParsedUIMetaDataName) {
                $datasetColumnName = $parsedUIMetaDataName->name;
            }

            if (isset($datasetColumnName)) {
                $columnMappings[$columnName] = $datasetColumnName;
            }
        }

        return $columnMappings;
    }
    protected function prepareColumnUIMetaData4ExtensionDataset(array $datasetStack, AbstractAttributeUIMetaData $parentUIMetaData, $referencePath, CubeMetaData $cube, $dimensionName, $dimensionReferencePath, DatasetMetaData $dataset, ColumnMetaData $column) {
        $metamodel = data_controller_get_metamodel();

        $reference = $metamodel->findReference($dataset->name);
        if (!isset($reference)) {
            return;
        }

        // preparing list of the dataset extensions
        $extensionDatasets = NULL;
        foreach ($reference->points as $referencePoint) {
            foreach ($referencePoint->columns as $referencePointColumn) {
                if ($referencePointColumn->datasetName == $dataset->name) {
                    continue;
                }
                if (isset($extensionDatasets[$referencePointColumn->datasetName])) {
                    continue;
                }

                $referencedDataset = $metamodel->getDataset($referencePointColumn->datasetName);
                // FIXME excluding logical dataset. We should not have mix of logical and physical datasets in one reference
                if ($referencedDataset->sourceType == StarSchemaDatasetSourceTypeHandler::SOURCE_TYPE) {
                    continue;
                }
                // is it being processed?
                if (isset($datasetStack[$referencedDataset->name])) {
                    continue;
                }

                $referencedKeyColumn = $referencedDataset->findKeyColumn(FALSE);
                if (isset($referencedKeyColumn)
                        && (!isset($referencePointColumn->columnName) || ($referencePointColumn->columnName == $referencedKeyColumn->name))) {
                    $extensionDatasets[$referencePointColumn->datasetName] = $referencedDataset;
                }
            }
        }
        if (!isset($extensionDatasets)) {
            return;
        }

        // processing the extensions
        $adjustedExtensionDatasetNames = NULL;
        foreach ($extensionDatasets as $extensionDataset) {
            list($adjustedExtensionDatasetName) = gd_data_controller_metamodel_adjust_dataset_name($extensionDataset->name);
            $adjustedExtensionDatasetNames[$extensionDataset->name] = $metamodel->getDataset($adjustedExtensionDatasetName)->name;
        }

        foreach ($extensionDatasets as $extensionDataset) {
            $datasetUIMetaData = new AttributeColumnUIMetaData();
            $datasetUIMetaData->publicName = $extensionDataset->publicName;
            $datasetUIMetaData->description = $extensionDataset->description;
            $datasetUIMetaData->isSelectable = FALSE;

            $extensionReferencePath = isset($dimensionReferencePath)
                ? self::prepareReferencedElementName($dimensionReferencePath, $dataset->name, $column->name)
                : ReferencePathHelper::assembleReference($dataset->name, $column->name);

            $dimensionColumnName = self::prepareReferencedElementName($extensionReferencePath, $extensionDataset->name, $extensionDataset->getKeyColumn()->name);

            $datasetUIMetaData->name = self::prepareAttributeUIMetaDataName($referencePath, $cube->factsDatasetName, $dimensionName, $dimensionColumnName);

            $this->generateColumnUIMetaData4DimensionDataset($datasetStack, $datasetUIMetaData, $referencePath, $cube, $dimensionName, $extensionReferencePath, $extensionDataset->name);

            $parentUIMetaData->registerElement($datasetUIMetaData);
        }
    }
    protected function adjustDatasetName($datasetName) {
        list($adjustedDatasetName) = gd_data_controller_metamodel_adjust_dataset_name($datasetName);

        return $adjustedDatasetName;
    }