Перейти к содержанию

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, благодаря чему трансформеры остаются простыми и переиспользуемыми между ревизиями.

Связанное