8. Маппинг данных (Endpoint – generateMapping)
В данном разделе описывается генерация файла маппинга. Endpoint предназначен для первичной настройки, а также перенастройки сервиса в случае изменения модели данных Витрины.
Файл маппинга генерируется источником данных в формате Kotlin-script. В файле описана модель данных Витрины данных в виде
структуры объектов Kotlin (table, column). Объекты table описывают таблицы, каждый из них содержит имя таблицы и
список колонок в том порядке, в котором они созданы в Витрине. Объекты column описывают колонки, каждый из них содержит имя
колонки, тип данных, признак обязательности (nullable), признак первичного ключа.
Файл используется сервисом для описания модели данных и валидации входящих данных. Выполняются следующие проверки:
проверяется соответствие состава полей входящей avro-структуры составу полей, описанных в файле маппинга;
проверяется соответствие порядка полей входящей avro-структуры порядку полей, описанных в файле маппинга;
проверяется соответствие типов данных полей входящей avro-структуры типам полей, описанных в файле маппинга. Для полей с установленным признаком обязательности (nullable = false) выполняется проверка на null.
При вызове Endpoint’а /generateMapping сервис генерирует файл на основе информации о модели, полученной из развернутой Витрины
данных. Файл складывается сервисом на диск, а также возвращается в ответе на вызов.
Пример запроса на генерацию маппинга представлен ниже:
curl -X GET "http://<ip-studio>:8088/api/v1/secure/<organization_ogrn>/<datamart_mnemonic>/<installation_name>/<installation_id>/generateMapping/aef2f195-0001-4aaa-b171-f2746511e889" -H "Authorization: Bearer <access_token>"
Результат Витрина данных вернёт в формате Kotlin-script:
import ru.supercode.mapping.common.ColumnType.*
import ru.supercode.mapping.mapper.dsl.mappingAvro
mappingAvro {
table("product") {
column("id", INTEGER) { nullable = false; primary = true; }
column("name", STRING) { nullable = false; }
}
table("stock") {
column("product_id", INTEGER) { nullable = false; primary = true; }
column("count_pieces", INTEGER) { nullable = false; }
}
}