public function generate(DatasetUIMetaData $datasetUIMetaData, DatasetMetaData $dataset, $referencePath = NULL) {
        // to prevent recursive references
        $datasetStack = array($dataset->name => TRUE);

        $datasetUIMetaData->name = $dataset->name;
        $datasetUIMetaData->publicName = $dataset->publicName;
        $datasetUIMetaData->description = $dataset->description;

        foreach ($dataset->getColumns() as $column) {
            if (!$column->isVisible()) {
                continue;
            }

            $columnUIMetaData = $this->prepareColumnUIMetaData($datasetStack, $referencePath, $dataset, $column->name);
            $datasetUIMetaData->registerAttribute($columnUIMetaData);
        }
    }
    protected function generateAttributes(__CubeUIMetaDataGenerator_CallContext $callcontext, DatasetUIMetaData $datasetUIMetaData, CubeMetaData $cube, $referencePath) {
        $metamodel = data_controller_get_metamodel();

        $dimensions = $cube->getDimensions();
        if (!isset($dimensions)) {
            return;
        }

        $datasetStack = array($cube->factsDatasetName => TRUE);

        $keyColumn = $cube->factsDataset->findKeyColumn(FALSE);

        // preparing root element for 'distinct count' measures
        $distinctCountRootUIMetaData = new RootElementUIMetaData();
        $distinctCountRootUIMetaData->name = self::prepareReferencedElementName(
            $referencePath, $cube->factsDatasetName, StarSchemaNamingConvention::$MEASURE_NAME_SUFFIX__DISTINCT_COUNT);
        $distinctCountRootUIMetaData->publicName = t('Distinct Count');
        $distinctCountRootUIMetaData->description = t('List of columns for which count of distinct values could be calculated');
        $distinctCountRootUIMetaData->isSelectable = FALSE;

        foreach ($dimensions as $dimension) {
            $attributeColumn = $cube->factsDataset->getColumn($dimension->attributeColumnName);

            $dimensionUIMetaData = new AttributeUIMetaData();
            $dimensionUIMetaData->name = self::prepareAttributeUIMetaDataName($referencePath, $cube->factsDatasetName, $dimension->name, NULL);
            $dimensionUIMetaData->publicName = $dimension->publicName;
            $dimensionUIMetaData->description = $dimension->description;
            $dimensionUIMetaData->columnIndex = $attributeColumn->columnIndex;
            $dimensionUIMetaData->type = clone $attributeColumn->type;
            $dimensionUIMetaData->datasetName = $cube->factsDatasetName;

            // fixing public name (borrowing public name from corresponding facts column)
            if (($dimension->name == $dimensionUIMetaData->publicName) && ($attributeColumn->name != $attributeColumn->publicName)) {
                $dimensionUIMetaData->publicName = $attributeColumn->publicName;
            }

            // registering 'Distinct Count' measure for this dimension
            $this->prepareAttributeDistinctCountMeasure(
                $callcontext,
                $distinctCountRootUIMetaData,
                $referencePath, $cube,
                $attributeColumn, ParameterNameHelper::assemble($dimension->name));

            // registering the dimension-specific measures
            $this->prepareColumnMeasures($callcontext, $dimensionUIMetaData, $referencePath, $cube, $dimension->attributeColumnName);

            // supporting extension tables (PK - to - PK)
            if (isset($keyColumn) && ($keyColumn->name == $attributeColumn->name)) {
                $this->prepareColumnUIMetaData4ExtensionDataset($datasetStack, $dimensionUIMetaData, $referencePath, $cube, $dimension->name, NULL, $cube->factsDataset, $keyColumn);
            }

            if (isset($dimension->datasetName)) {
                $dimensionDataset = $metamodel->getDataset($dimension->datasetName);

                $dimensionDatasetUIMetaData = $dimensionUIMetaData;

                // creating additional root element if the attribute has branches
                if (count($attributeColumn->branches) > 0) {
                    $dimensionDatasetUIMetaData = new AttributeColumnUIMetaData();
                    $dimensionDatasetUIMetaData->name =
                        self::prepareAttributeUIMetaDataName($referencePath, $cube, $dimension->name, $dimensionDataset->getKeyColumn()->name) . '/*dimensionDataset*/';
                    $dimensionDatasetUIMetaData->publicName = $dimensionDataset->publicName;
                    $dimensionDatasetUIMetaData->description = $dimensionDataset->description;
                    $dimensionDatasetUIMetaData->isSelectable = FALSE;

                    $dimensionUIMetaData->registerElement($dimensionDatasetUIMetaData);
                }

                // supporting hierarchical dimension
                $this->generateColumnUIMetaData4DimensionDataset($datasetStack, $dimensionDatasetUIMetaData, $referencePath, $cube, $dimension->name, NULL, $dimension->datasetName);
            }

            // registering all column branches for the dimension
            $this->prepareAttributeColumnUIMetaData4ColumnBranch($datasetStack, $dimensionUIMetaData, $referencePath, $cube, $dimension->name, NULL, NULL, $attributeColumn);

            $datasetUIMetaData->registerAttribute($dimensionUIMetaData);

            $callcontext->usedColumnNames[$dimension->attributeColumnName] = TRUE;
        }

        if (count($distinctCountRootUIMetaData->elements) > 0) {
            $datasetUIMetaData->registerMeasure($distinctCountRootUIMetaData);
        }
    }