Работа с источником данных для базы данных временных рядов

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

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

Описание

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

Исходный код

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

-(void)executeExample {
    // Получаем массив измерений базы данных временных рядов, находящихся в левом заголовке
    SNArray leftDimensions = m_olapReport->leftDimensions();
    // Получаем первое измерение базы данных временных рядов в массиве
    SPPLDimension dimension = leftDimensions->objectAtIndex<PPLDimension>(0);
    // Получаем описание объекта, на основе которого создано текущее измерение
    SPPLMetabaseRepositoryObjectDescriptor dimensionObjectDescriptor = dimension->relatedObjectDescriptor();
    // Создаем источник данных на основе описания объекта репозитория
    SPPLDataSource createdDataSource = PPLDataSource::dataSource(dimensionObjectDescriptor);
    // Получаем массив измерений источника данных
    SNArray baseDimensions = createdDataSource->dimensions();
    // Создаем источник данных базы данных временных рядов на основе полученного описания объекта репозитория
    SPPLRubricatorDataSource rubricatorDataSourse = PPLRubricatorDataSource::rubricatorDataSource(dimensionObjectDescriptor);
    // Выводим в консоль среды разработки количество пар «ключ-значение» в матрице данных
    [self getMatrixInfoForRubricatorDataSource: rubricatorDataSourse];
    // Получаем текстовое описание объекта базы данных временных рядов
    SNString rubricatorDescription = rubricatorDataSourse->description();
    // Выводим в консоль среды разработки текстовое описание объекта базы данных временных рядов
    printf("Описание базы данных временных рядов:\n\n%s", rubricatorDescription->UTF8String());
    // Получаем описание объекта репозитория, на основе которого создан источник данных
    SPPLMetabaseRepositoryObjectDescriptor rubricatorDescriptor = rubricatorDataSourse->descriptor();
    // Получаем наименование объекта базы данных временных рядов
    SNString rubricatorDescriptorName = rubricatorDescriptor->name();
    /* Выводим в консоль среды разработки наименование объекта репозитория,
    на основе которого создан источник данных для базы данных временных рядов */
    printf("Наименование объекта репозитория, на основе которого создан источник данных для базы данных временных рядов: %s\n",
    rubricatorDescriptorName->UTF8String());
    // Получаем описание таблицы данных для базы данных временных рядов
    SPPLRubricatorDataTableInfo rubricatorDataTableInfo = PPLRubricatorDataTableInfo::dataTableInfo([self getDescriptionForRubricatorDataTableInfo: (rubricatorDataSourse->dataTableInfo())]);
    // Получаем наименование таблицы данных для базы данных временных рядов
    SNString rubricatorDataTableName = rubricatorDataTableInfo->name();
    // Выводим в консоль среды разработки наименование таблицы данных для базы данных временных рядов
    printf("Наименование таблицы данных для базы данных временных рядов: %s\n", rubricatorDataTableName->UTF8String());
    // Получаем первичный ключ таблицы данных для базы данных временных рядов
    SNString rubricatorDataTablePrimaryKey = rubricatorDataTableInfo->primaryKey();
    // Выводим в консоль среды разработки первичный ключ таблицы данных для базы данных временных рядов
    printf("Первичный ключ таблицы данных для базы данных временных рядов: %s\n", rubricatorDataTablePrimaryKey->UTF8String());
    // Получаем ключ фактов таблицы данных для базы данных временных рядов
    SNString rubricatorDataTableFactsKey = rubricatorDataTableInfo->factsKey();
    // Выводим в консоль среды разработки ключ фактов таблицы данных для базы данных временных рядов
    printf("Ключ фактов таблицы данных для базы данных временных рядов: %s\n", rubricatorDataTableFactsKey->UTF8String());
    // Получаем ключ даты таблицы данных для базы данных временных рядов
    SNString rubricatorDataTableDateKey = rubricatorDataTableInfo->dateKey();
    if (rubricatorDataTableDateKey != NULL) {
        // Выводим в консоль среды разработки ключ даты таблицы данных для базы данных временных рядов
        printf("Ключ даты таблицы данных для базы данных временных рядов: %s\n", rubricatorDataTableDateKey->UTF8String());
        } else {
        printf("Ключ даты таблицы даннных для базы данных временных рядов не доступен");
    }
    // Получаем ключ значений таблицы данных для базы данных временных рядов
    SNString rubricatorDataTableValueKey = rubricatorDataTableInfo->valueKey();
    // Выводим в консоль среды разработки ключ значений таблицы данных для базы данных временных рядов
    printf("Ключ значений таблицы данных для базы данных временных рядов: %s\n", rubricatorDataTableValueKey->UTF8String());
    // Получаем массив всех полей таблицы данных для базы данных временных рядов
    SNArray rubricatorDataTableFields = rubricatorDataTableInfo->fields();
    // Получаем объект последнего поля таблицы данных
    SPPLRubricatorTableField rubricatorDataTableField = rubricatorDataTableFields->objectAtIndex<PPLRubricatorTableField>(rubricatorDataTableFields->count() - 1);
    // Получаем наименование поля
    SNString rubricatorDataTableFieldName = rubricatorDataTableField->name();
    // Получаем тип поля
    SNString rubricatorDataTableFieldType = rubricatorDataTableField->type();
    // Выводим в консоль среды разработки наименование и тип поля
    printf("Поле таблицы данных:\"%s\", тип %s\n", rubricatorDataTableFieldName->UTF8String(), rubricatorDataTableFieldType->UTF8String());
    // Получаем идентификатор связанного с полем измерения
    SNString rubricatorDataTableFieldRelatedDimensionsID = rubricatorDataTableField->relatedDimensionsId();
    // Выводим в консоль среды разработки информацию об идентификаторе связанного с полем измерения
    if(rubricatorDataTableFieldRelatedDimensionsID != NULL) {
        printf("Идентификатор измерения, связанного с полем \"%s\": %s\n",
        rubricatorDataTableFieldName->UTF8String(),
        rubricatorDataTableFieldRelatedDimensionsID->UTF8String());
        } else {
        printf("Идентификатор измерения, связанного с полем \"%s\", отсутствует\n",
        rubricatorDataTableFieldName->UTF8String());
    }
    // Получаем описание таблицы фактов базы данных временных рядов
    SPPLRubricatorFactsTableInfo rubricatorFactsTableInfo = PPLRubricatorFactsTableInfo::factsTableInfo([self getDescriptionForRubricatorFactsTableInfo:(rubricatorDataSourse->factsTableInfo())]);
    // Получаем наименование таблицы фактов базы данных временных рядов
    SNString rubricatorFactsTableName = rubricatorFactsTableInfo->name();
    // Выводим в консоль среды разработки наименование таблицы фактов базы данных временных рядов
    printf("Наименование таблицы фактов базы данных временных рядов: %s\n", rubricatorFactsTableName->UTF8String());
    // Получаем наименование первичного ключа таблицы фактов базы данных временных рядов
    SNString rubricatorFactsTablePrimaryKey = rubricatorFactsTableInfo->primaryKey();
    // Выводим в консоль среды разработки первичный ключ таблицы фактов базы данных временных рядов
    printf("Первичный ключ таблицы фактов базы данных временных рядов: %s\n", rubricatorFactsTablePrimaryKey->UTF8String());
    // Получаем ключ уровня данных таблицы фактов базы данных временных рядов
    SNString rubricatorFactsTableDataLevelKey = rubricatorFactsTableInfo->dataLevelKey();
    // Выводим в консоль среды разработки ключ уровня данных таблицы фактов базы данных временных рядов
    printf("Ключ уровня данных таблицы фактов базы данных временных рядов: %s\n", rubricatorFactsTableDataLevelKey->UTF8String());
    // Получаем ключ фактора таблицы фактов базы данных временных рядов
    SNString rubricatorFactsTableFactorKey = rubricatorFactsTableInfo->factorKey();
    // Выводим в консоль среды разработки ключ фактора таблицы фактов базы данных временных рядов
    printf("Ключ фактора таблицы фактов базы данных временных рядов: %s\n", rubricatorFactsTableFactorKey->UTF8String());
    // Получаем ключ мнемоники таблицы фактов базы данных временных рядов
    SNString rubricatorFactsTableMnemoKey = rubricatorFactsTableInfo->mnemo();
    // Выводим в консоль среды разработки ключ мнемоники таблицы фактов базы данных временных рядов
    printf("Ключ мнемоники таблицы фактов базы данных временных рядов: %s\n", rubricatorFactsTableMnemoKey->UTF8String());
    // Получаем массив всех полей таблицы фактов базы данных временных рядов
    SNArray rubricatorFactsTableFields = rubricatorFactsTableInfo->fields();
    // Получаем объект последнего поля таблицы фактов
    SPPLRubricatorTableField rubricatorFactsTableField = rubricatorFactsTableFields->objectAtIndex<PPLRubricatorTableField>(rubricatorFactsTableFields->count() - 1);
    // Получаем наименование поля
    SNString rubricatorFactsTableFieldName = rubricatorFactsTableField->name();
    // Получаем тип поля
    SNString rubricatorFactsTableFieldType = rubricatorFactsTableField->type();
    // Выводим в консоль среды разработки наименование и тип поля
    printf("Поле таблицы фактов:\"%s\", тип %s\n", rubricatorFactsTableFieldName->UTF8String(), rubricatorFactsTableFieldType->UTF8String());
    // Получаем идентификатор связанного с полем измерения
    SNString rubricatorFactsTableFieldRelatedDimensionsID = rubricatorFactsTableField->relatedDimensionsId();
    // Выводим в консоль среды разработки информацию об идентификаторе связанного с полем измерения
    if(rubricatorFactsTableFieldRelatedDimensionsID != NULL) {
        printf("Идентификатор измерения, связанного с полем \"%s\": %s\n", rubricatorFactsTableFieldName->UTF8String(),
        rubricatorFactsTableFieldRelatedDimensionsID->UTF8String());
        } else {
        printf("Идентификатор измерения, связанного с полем \"%s\", отсутствует\n", rubricatorFactsTableFieldName->UTF8String());
    }
    // Создаем справочник, в котором содержится описание нового поля таблицы базы данных временных рядов
    SNMutableDictionary fieldDescription = NMutableDictionary::mutableDictionary();
    // Добавляем в справочник название поля
    fieldDescription->setObjectForKey(NStr("Комментарии"), NStr("name"));
    // Добавляем в справочник тип поля
    fieldDescription->setObjectForKey(NStr("INTEGER"), NStr("type"));
    // Создаем новое поле таблицы базы данных временных рядов
    SPPLRubricatorTableField field = PPLRubricatorTableField::tableField(fieldDescription);
    // Получаем наименование нового поля
    SNString tableName = field->name();
    // Выводим в консоль среды разработки наименование нового поля
    printf("Наименование нового поля таблицы базы данных временных рядов: %s\n", tableName->UTF8String());
}
// Возвращает справочник с настройками таблицы данных для базы данных временных рядов
-(SNDictionary)getDescriptionForRubricatorDataTableInfo: (SPPLRubricatorDataTableInfo) rubricatorInfo {
    SNMutableDictionary description = NMutableDictionary::mutableDictionary();
    description->setObjectForKey(rubricatorInfo->name(), NStr("name"));
    description->setObjectForKey(rubricatorInfo->primaryKey(), NStr("primarykey"));
    description->setObjectForKey(rubricatorInfo->factsKey(), NStr("facts"));
    description->setObjectForKey(rubricatorInfo->dateKey(), NStr("data"));
    description->setObjectForKey(rubricatorInfo->valueKey(), NStr("value"));
    SNMutableArray fieldDescriptions = NMutableArray::mutableArray();
    for (int i = 0; i < rubricatorInfo->fields()->count(); i++) {
        SPPLRubricatorTableField field = rubricatorInfo->fields()->objectAtIndex<PPLRubricatorTableField>(i);
        fieldDescriptions->addObject([self getDescriptionForRubricatorTableField: field]);
    }
    description->setObjectForKey(fieldDescriptions, NStr("Fields"));
    return description;
}
// Возвращает справочник с настройками таблицы фактов базы данных временных рядов
-(SNDictionary)getDescriptionForRubricatorFactsTableInfo: (SPPLRubricatorFactsTableInfo) rubricatorInfo {
    SNMutableDictionary description = NMutableDictionary::mutableDictionary();
    description->setObjectForKey(rubricatorInfo->name(), NStr("name"));
    description->setObjectForKey(rubricatorInfo->primaryKey(), NStr("primarykey"));
    description->setObjectForKey(rubricatorInfo->dataLevelKey(), NStr("datalevel"));
    description->setObjectForKey(rubricatorInfo->factorKey(), NStr("factor"));
    description->setObjectForKey(rubricatorInfo->mnemo(), NStr("mnemo"));
    SNMutableArray fieldDescriptions = NMutableArray::mutableArray();
    for (int i = 0; i < rubricatorInfo->fields()->count(); i++) {
        SPPLRubricatorTableField field = rubricatorInfo->fields()->objectAtIndex<PPLRubricatorTableField>(i);
        fieldDescriptions->addObject([self getDescriptionForRubricatorTableField: field]);
    }
    description->setObjectForKey(fieldDescriptions, NStr("Fields"));
    return description;
}
// Возвращает справочник с настройками поля таблицы
-(SNDictionary)getDescriptionForRubricatorTableField: (SPPLRubricatorTableField) rubricatorField {
    SNMutableDictionary description = NMutableDictionary::mutableDictionary();
    description->setObjectForKey(rubricatorField->name(), NStr("name"));
    description->setObjectForKey(rubricatorField->type(), NStr("type"));
    description->setObjectForKey(rubricatorField->relatedDimensionsId(), NStr("dim"));
    return description;
}
-(void)getMatrixInfoForRubricatorDataSource: (SPPLRubricatorDataSource) rubricatorDataSource {
    // Получаем матрицу данных по отметке и измерениям
    SPPLDataSourceMatrix matrix = rubricatorDataSource->obtainMatrix(m_olapReport->selectionSet(), [self allDimensions]);
    printf("Количество пар «ключ-значение» в матрице данных: %d\n", matrix->dataCount());
}

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

Количество пар «ключ-значение» в матрице данных: 545
Описание базы данных временных рядов:

 

descriptor: Object:

Key: 112

Object Id: TSDB_WORLD

Name: World Development Indicators

Type: 4

Modified date: NDate: Wed 28 Dec 2011 18:11:09                                          

Data source ref id: NULL

Hidden NO

Size: 427962

Version: 1688197

Dependencies: e9b5a4b9818bd9f9a4ebf63bb27405c3

 

dimensions: <NMutableArray:

id: CALENDAR_119

name: Calendar

Elements tree:

Elements count: 30

id: FACTS_WDI_COPY_1557

name: Indicators

Elements tree:

Elements count: 3

id: CUT_REGIONS_68045

name: Regions

Elements tree:

Elements count: 4

id: CDW_MEASURES_COPY_1559

name: Measures

Elements tree:

Elements count: 208

id: UNITS_123

name: Units

Elements tree:

Elements count: 478

>

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

Наименование таблицы данных для базы данных временных рядов: RUB_DATA

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

Ключ фактов таблицы данных для базы данных временных рядов: F_KEY

Ключ даты таблицы данных для базы данных временных рядов: DT

Ключ значений таблицы данных для базы данных временных рядов: VALUE

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

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

Наименование таблицы фактов базы данных временных рядов: RUB_FACTS

Первичный ключ таблицы фактов базы данных временных рядов: F_KEY

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

Ключ фактора таблицы фактов базы данных временных рядов: FACTOR

Ключ мнемоники таблицы фактов базы данных временных рядов: MNEMO

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

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

Наименование нового поля таблицы базы данных временных рядов: Комментарии

См. также:

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