Transformer¶
Transformer — чистый мост-маппинг от Sources DataContract к целевой схеме Entity. Каждая целевая колонка получает один выражение-маппинг, читающий из исходных колонок.
Маппинги — это DuckDB-выражения¶
Маппинг — это DuckDB-SQL-выражение, скомпилированное через AST SQLGlot. Примеры:
| Тип | Пример |
|---|---|
| Passthrough | "Konto" |
| Трансформация | LPAD(TRIM("Konto"), 6, '0') |
| Приведение типа | CAST(REPLACE("Betrag", ',', '.') AS DECIMAL(18,4)) |
| Lookup по словарю | (SELECT "name" FROM dict_kontenplan WHERE "code" = ...) |
| Инъекция контекста | CAST("Betrag" AS DECIMAL) * (SELECT rate FROM session_context) |
| Lookup по таблице контекста | (SELECT "name" FROM ctx_objektname WHERE "code" = "Objekt" LIMIT 1) — таблица из контекста сессии (например, подтянутая context source), под тем же ctx_<name>, что видят правила |
Кавыченные идентификаторы ("Konto") — это реальные заголовки колонок поставщика
из source контракта.
Редактирование в интерфейсе. У каждого поля маппинга и у каждого
построчного фильтра есть кнопка Open in SQL editor. Редактор показывает src
(колонки этой роли), src_<role> для остальных ролей ревизии, каталоги проекта
(cat_*) и контекст (session_context, ctx_<name>) и дополняет их имена;
клик по таблице или колонке вставляет её.
Безопасность по построению¶
Выражения никогда не склеиваются как строки. Они парсятся в типизированный AST, проверяются по списку допустимых функций (строковые, математические, приведение типов, обработка null, даты) и отклоняются на этапе написания, если используют что-то вне списка. Файловые и environment-функции заблокированы. То есть невалидный или небезопасный маппинг падает при сохранении трансформера — не во время выполнения на реальных данных.
Построчные фильтры — оставить только нужные строки¶
По умолчанию мапится каждая строка источника. Дополнительно трансформер может нести опциональный построчный фильтр на каждую роль-источник — булев предикат DuckDB. Строка остаётся, если предикат истинен; строки, для которых он ложен, отбрасываются до маппинга и не попадают ни в данные entity, ни в валидацию, сверку или экспортный пакет.
Типичное применение — исключить счета, которые осознанно не маппятся в SAP («явно не маппится»):
"Konto" NOT IN (SELECT "code" FROM cat_kontenplan__provider WHERE "mapping_type" = 'ignore')
Задаётся на вкладке Row Filter трансформера — по одному предикату на роль. Фильтр валидируется так же, как маппинг (AST + allowlist функций), поэтому некорректный предикат отклоняется при сохранении. При запуске сессии отброшенные строки отражаются на стадии Transformed — «N rows excluded by row filter», с количеством по каждой роли и текстом предиката — так что исключение аудируемо и никогда не молчаливо.
Чистые мапперы¶
Трансформеры мапят только один контракт на одну entity. Они не несут межфайловую логику — reconciliation между несколькими entity живёт на Project, благодаря чему трансформеры остаются простыми и переиспользуемыми между ревизиями.
Связанное¶
- DataContract и Revisions
- Catalog — словари, используемые в lookup'ах
- Quickstart Владельца проекта