Работа с источником данных куба

Требования к операционной системе: iOS 5.0 и выше.

Мобильное устройство: iPad.

Описание

В данном примере описываются некоторые приемы работы с источником данных куба. После запуска примера выполняются следующие операции:

Исходный код

Для выполнения примера необходимо разместить взамен метода executeExample класса ViewController (см. раздел «Анализ данных») следующий код:

-(void)executeExample {
    // Получаем массив измерений куба
    SNArray allDimensions = [self allDimensions];
    // Получаем первое измерение куба в массиве
    SPPLDimension dimension = allDimensions->objectAtIndex<PPLDimension>(0);
    // Получаем описание объекта, на основе которого создано текущее измерение
    SPPLMetabaseRepositoryObjectDescriptor dimensionObjectDescriptor = dimension->relatedObjectDescriptor();
    // Создаем источник данных на основе описания объекта репозитория
    SPPLDataSource createdDataSource = PPLDataSource::dataSource(dimensionObjectDescriptor);
    // Получаем массив измерений источника данных
    SNArray baseDimensions = createdDataSource->dimensions();
    // Создаем источник данных куба на основе полученного описания объекта репозитория
    SPPLCubeDataSource cubeDataSourse = PPLCubeDataSource::cubeDataSource(dimensionObjectDescriptor);
    
    // Получаем текстовое описание объекта куба
    SNString cubeDescription = cubeDataSourse->description();
    printf("Описание куба:\n\n%s", cubeDescription->UTF8String());
    // Получаем описание объекта репозитория, на основе которого создан источник данных куба
    SPPLMetabaseRepositoryObjectDescriptor cubeDescriptor = cubeDataSourse->descriptor();
    // Получаем наименование объекта репозитория, на основе которого создан источник данных куба
    SNString cubeDescriptorName = cubeDescriptor->name();
    printf("Наименование объекта репозитория, на основе которого создан источник данных куба: %s\n", cubeDescriptorName->UTF8String());
    
    if (cubeDataSourse->dataTableInfo()) {
        // Получаем справочник с описанием таблицы данных куба
        SNMutableDictionary dataTableInfoDescription = cubeDataTableInfoDescription(cubeDataSourse->dataTableInfo());
        // Создаём описание таблицы данных куба
        SPPLCubeDataTableInfo cubeDataTableInfo = PPLCubeDataTableInfo::dataTableInfo(dataTableInfoDescription);
        
        // Получаем наименование таблицы данных куба
        SNString cubeDataTableName = cubeDataTableInfo->name();
        printf("Наименование таблицы данных куба: %s\n", cubeDataTableName->UTF8String());
        // Получаем первичный ключ таблицы данных куба
        SNString cubeDataTablePrimaryKey = cubeDataTableInfo->primaryKey();
        printf("Первичный ключ таблицы данных куба: %s\n", cubeDataTablePrimaryKey->UTF8String());
        // Получаем ключ фактов таблицы данных куба
        SNString cubeDataTableFactsKey = cubeDataTableInfo->factsKey();
        printf("Ключ фактов таблицы данных куба: %s\n", cubeDataTableFactsKey->UTF8String());
        // Получаем ключ даты таблицы данных куба
        SNString cubeDataTableDateKey = cubeDataTableInfo->dateKey();
        printf("Ключ даты таблицы данных куба: %s\n", cubeDataTableDateKey->UTF8String());
        // Получаем ключ значений таблицы данных куба
        SNString cubeDataTableValueKey = cubeDataTableInfo->valueKey();
        printf("Ключ значений таблицы данных куба: %s\n", cubeDataTableValueKey->UTF8String());
        // Получаем массив всех полей таблицы данных куба
        SNArray cubeDataTableFields = cubeDataTableInfo->fields();
        // Получаем объект последнего поля таблицы данных
        SPPLCubeTableField cubeDataTableField = cubeDataTableFields->objectAtIndex<PPLCubeTableField>(cubeDataTableFields->count() - 1);
        // Получаем наименование поля
        SNString cubeDataTableFieldName = cubeDataTableField->name();
        // Получаем тип поля
        SNString cubeDataTableFieldType = cubeDataTableField->type();
        printf("Поле таблицы данных:\"%s\", тип %s\n", cubeDataTableFieldName->UTF8String(), cubeDataTableFieldType->UTF8String());
        // Получаем идентификатор связанного с полем измерения
        SNString cubeDataTableFieldRelatedDimensionsID = cubeDataTableField->relatedDimensionsId();
        // Выводим в консоль среды разработки информацию об идентификаторе связанного с полем измерения
        if(cubeDataTableFieldRelatedDimensionsID != NULL) {
            printf("Идентификатор измерения, связанного с полем \"%s\": %s\n", cubeDataTableFieldName->UTF8String(),
            cubeDataTableFieldRelatedDimensionsID->UTF8String());
            } else {
            printf("Идентификатор измерения, связанного с полем \"%s\", отсутствует\n", cubeDataTableFieldName->UTF8String());
        }
        } else {
        printf("Справочник с описанием таблицы данных куба не определён \n");
    }
    
    if (cubeDataSourse->factsTableInfo()) {
        // Получаем справочник с описанием таблицы фактов куба
        SNMutableDictionary facsTableInfoDescription = cubeFactsTableInfoDescription(cubeDataSourse->factsTableInfo());
        // Создаём описание таблицы фактов куба
        SPPLCubeFactsTableInfo cubeFactsTableInfo = PPLCubeFactsTableInfo::factsTableInfo(facsTableInfoDescription);
        
        // Получаем наименование таблицы фактов куба
        SNString cubeFactsTableName = cubeFactsTableInfo->name();
        printf("Наименование таблицы фактов куба: %s\n", cubeFactsTableName->UTF8String());
        // Получаем наименование первичного ключа таблицы фактов куба
        SNString cubeFactsTablePrimaryKey = cubeFactsTableInfo->primaryKey();
        printf("Первичный ключ таблицы фактов куба: %s\n", cubeFactsTablePrimaryKey->UTF8String());
        // Получаем ключ уровня данных таблицы фактов куба
        SNString cubeFactsTableDataLevelKey = cubeFactsTableInfo->dataLevelKey();
        printf("Ключ уровня данных таблицы фактов куба: %s\n", cubeFactsTableDataLevelKey->UTF8String());
        // Получаем массив всех полей таблицы фактов куба
        SNArray cubeFactsTableFields = cubeFactsTableInfo->fields();
        // Получаем объект последнего поля таблицы фактов
        SPPLCubeTableField cubeFactsTableField = cubeFactsTableFields->objectAtIndex<PPLCubeTableField>(cubeFactsTableFields->count() - 1);
        // Получаем наименование поля
        SNString cubeFactsTableFieldName = cubeFactsTableField->name();
        // Получаем тип поля
        SNString cubeFactsTableFieldType = cubeFactsTableField->type();
        printf("Поле таблицы фактов:\"%s\", тип %s\n", cubeFactsTableFieldName->UTF8String(), cubeFactsTableFieldType->UTF8String());
        // Получаем идентификатор связанного с полем измерения
        SNString cubeFactsTableFieldRelatedDimensionsID = cubeFactsTableField->relatedDimensionsId();
        // Выводим в консоль среды разработки информацию об идентификаторе связанного с полем измерения
        if(cubeFactsTableFieldRelatedDimensionsID != NULL) {
            printf("Идентификатор измерения, связанного с полем \"%s\": %s\n", cubeFactsTableFieldName->UTF8String(),
            cubeFactsTableFieldRelatedDimensionsID->UTF8String());
            } else {
            printf("Идентификатор измерения, связанного с полем \"%s\", отсутствует\n", cubeFactsTableFieldName->UTF8String());
        }
        } else {
        printf("Справочник с описанием таблицы фактов куба не определён \n");
    }
    
    if (cubeDataSourse->dataTableInfo() != NULL && cubeDataSourse->dataTableInfo() != NULL) {
        // Получаем отметку для измерений источника данных объекта
        SPPLDimensionSelectionSet pivotSet = m_gridPivot->selectionSet();
        // Получаем матрицу данных куба
        SPPLDataSourceMatrix cubeMatrix = cubeDataSourse->obtainMatrix(pivotSet, baseDimensions);
        if(cubeMatrix != NULL) printf("Матрица куба создана успешно\n");
        else printf("Матрица куба не создана\n");
    } else {
        printf("Матрица куба не создана \n");
    }
    
    // Создаем справочник, в котором содержится описание нового поля таблицы куба
    SNMutableDictionary fieldDescription = NMutableDictionary::mutableDictionary();
    // Добавляем в справочник название поля
    fieldDescription->setObjectForKey(NStr("Комментарии"), NStr("name"));
    // Добавляем в справочник тип поля
    fieldDescription->setObjectForKey(NStr("INTEGER"), NStr("type"));
    // Создаем новое поле таблицы куба
    SPPLCubeTableField field = PPLCubeTableField::tableField(fieldDescription);
    // Получаем наименование нового поля
    SNString tableName = field->name();
    printf("Наименование нового поля таблицы куба: %s\n", tableName->UTF8String());
}
// Возвращает справочник с описанием таблицы данных куба
SNMutableDictionary cubeDataTableInfoDescription (SPPLCubeDataTableInfo dataTableInfo) {
    SNMutableDictionary tableInfoDictionary = NMutableDictionary::mutableDictionary();
    tableInfoDictionary->setObjectForKey(dataTableInfo->name(), NStr("name"));
    tableInfoDictionary->setObjectForKey(dataTableInfo->primaryKey(), NStr("primarykey"));
    tableInfoDictionary->setObjectForKey(dataTableInfo->factsKey(), NStr("facts"));
    tableInfoDictionary->setObjectForKey(dataTableInfo->dateKey(), NStr("date"));
    tableInfoDictionary->setObjectForKey(dataTableInfo->valueKey(), NStr("value"));
    
    if (dataTableInfo->fields() != NULL) {
        SNMutableArray fieldDictionaries = NMutableArray::mutableArray();
        for (int i = 0; i < dataTableInfo->fields()->count(); i++) {
            SPPLCubeTableField field = dataTableInfo->fields()->objectAtIndex<PPLCubeTableField>(i);
            // Получаем справочник с описанием поля таблицы куба
            SNMutableDictionary fieldDictionary = cubeTableFieldDescription(field);
            fieldDictionaries->addObject(fieldDictionary);
        }
        tableInfoDictionary->setObjectForKey(fieldDictionaries, NStr("Fields"));
    }
    return tableInfoDictionary;
}
// Возвращает справочник с описанием таблицы фактов куба
SNMutableDictionary cubeFactsTableInfoDescription (SPPLCubeFactsTableInfo cubeFactsTableInfo) {
    SNMutableDictionary tableInfoDictionary = NMutableDictionary::mutableDictionary();
    tableInfoDictionary->setObjectForKey(cubeFactsTableInfo->name(), NStr("name"));
    tableInfoDictionary->setObjectForKey(cubeFactsTableInfo->primaryKey(), NStr("primarykey"));
    tableInfoDictionary->setObjectForKey(cubeFactsTableInfo->dataLevelKey(), NStr("datalevel"));
    
    if (cubeFactsTableInfo->fields() != NULL) {
        SNMutableArray fieldDictionaries = NMutableArray::mutableArray();
        for (int i = 0; i < cubeFactsTableInfo->fields()->count(); i++) {
            SPPLCubeTableField field = cubeFactsTableInfo->fields()->objectAtIndex<PPLCubeTableField>(i);
            // Получаем справочник с описанием поля таблицы куба
            SNMutableDictionary fieldDictionary = cubeTableFieldDescription(field);
            fieldDictionaries->addObject(fieldDictionary);
        }
        tableInfoDictionary->setObjectForKey(fieldDictionaries, NStr("Fields"));
    }
    return tableInfoDictionary;
}
// Возвращает справочник с описанием поля таблицы куба
SNMutableDictionary cubeTableFieldDescription (SPPLCubeTableField field) {
    SNMutableDictionary fieldDictionary = NMutableDictionary::mutableDictionary();
    fieldDictionary->setObjectForKey(field->name(), NStr("name"));
    fieldDictionary->setObjectForKey(field->type(), NStr("type"));
    fieldDictionary->setObjectForKey(field->relatedDimensionsId(), NStr("dim"));
    return fieldDictionary;
}

В результате выполнения примера в консоли среды разработки был выведен результат создания матрицы куба, информация  об источнике данных куба, а также наименование созданного поля куба:

Описание куба:

 

descriptor: Object:

Key: 528

Object Id: CUBE_WORLD

Name: World Development Indicators

Type: 3

Modified date: NDate: Thu 22 Dec 2011 18:21:01                                          

Data source ref id: NULL

Hidden NO

Size: 449612

Version: 1646670

Dependencies: NULL

 

dimensions: <NMutableArray:

id: CALENDAR_Y_ENG_533

name: Календарь

Elements tree:

Elements count: 11

id: CUT_REGIONS_68045

name: Regions

Elements tree:

Elements count: 173

id: FACTS_WDI_COPY_1557

name: Indicators

Elements tree:

Elements count: 3

>

Наименование объекта репозитория, на основе которого создан источник данных куба: World Development Indicators

Наименование таблицы данных куба: CUBE_DATA

Первичный ключ  таблицы данных куба: D_KEY

Ключ фактов таблицы данных куба: F_KEY

Ключ даты таблицы данных куба: DT

Ключ значений таблицы данных куба: VALUE

Поле таблицы данных:"VALUE", тип REAL

Идентификатор измерения, связанного с полем "VALUE", отсутствует

Наименование таблицы фактов куба: CUBE_FACTS

Первичный ключ таблицы фактов куба: F_KEY

Ключ уровня данных таблицы фактов куба: DL

Поле таблицы фактов:"DL", тип INTEGER

Идентификатор измерения, связанного с полем "DL", отсутствует

Матрица куба создана успешно

Наименование нового поля таблицы куба: Комментарии

См. также:

Примеры использования библиотеки pplib++