public static function containsCategory(ColumnMetaData $column, $category)
 {
     if (!isset($column->type->applicationType)) {
         return FALSE;
     }
     $type = $column->type->applicationType;
     if ($type == NumberDataTypeHandler::DATA_TYPE || $type == CurrencyDataTypeHandler::DATA_TYPE || $type == PercentDataTypeHandler::DATA_TYPE) {
         return $category == self::FACT;
     } elseif ($type == IntegerDataTypeHandler::DATA_TYPE) {
         $calculatedCategory = $column->isKey() ? self::ATTRIBUTE : self::FACT;
         // if logical application type is a reference this column is an attribute
         if ($calculatedCategory != self::ATTRIBUTE && isset($column->type->logicalApplicationType)) {
             list($referencedDatasetName) = ReferencePathHelper::splitReference($column->type->logicalApplicationType);
             if (isset($referencedDatasetName)) {
                 $calculatedCategory = self::ATTRIBUTE;
             }
         }
         return $category == $calculatedCategory;
     } else {
         return $category == self::ATTRIBUTE;
     }
 }
    protected function prepareAttributeColumnUIMetaData(array $datasetStack, $referencePath, CubeMetaData $cube, $dimensionName, $dimensionReferencePath, DatasetMetaData $dataset = NULL, ColumnMetaData $column) {
        $dimensionColumnName = isset($dimensionReferencePath)
            ? self::prepareReferencedElementName($dimensionReferencePath, $dataset->name, $column->name)
            : $column->name;

        $attributeUIMetaData = new AttributeColumnUIMetaData();
        $attributeUIMetaData->name = self::prepareAttributeUIMetaDataName($referencePath, $cube->factsDatasetName, $dimensionName, $dimensionColumnName);
        $attributeUIMetaData->publicName = $column->publicName;
        $attributeUIMetaData->description = $column->description;
        $attributeUIMetaData->columnIndex = $column->columnIndex;
        $attributeUIMetaData->type = clone $column->type;
        $attributeUIMetaData->datasetName = $cube->factsDatasetName;

        if ($column->isKey()) {
            $attributeUIMetaData->isSelectable = FALSE;
        }

        if (!$column->isUsed()) {
            $attributeUIMetaData->isSelectable = FALSE;
        }

        if (!$column->isKey()) {
            $this->prepareAttributeColumnUIMetaData4ColumnBranch($datasetStack, $attributeUIMetaData, $referencePath, $cube, $dimensionName, $dimensionReferencePath, $dataset, $column);
        }

        list($referencedDatasetName) = ReferencePathHelper::splitReference($column->type->getLogicalApplicationType());
        if (isset($referencedDatasetName)) {
            $branchReferencePath = NULL;
            if (isset($dataset)) {
                $branchReferencePath = isset($dimensionReferencePath)
                    ? self::prepareReferencedElementName($dimensionReferencePath, $dataset->name, $column->name)
                    : ReferencePathHelper::assembleReference($dataset->name, $column->name);
            }
            $this->generateColumnUIMetaData4DimensionDataset(
                $datasetStack, $attributeUIMetaData, $referencePath, $cube, $dimensionName, $branchReferencePath, $referencedDatasetName);
        }

        return $attributeUIMetaData;
    }