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

Справочник: язык выражений

Язык выражений Expecto — это то, как вы пишете правила валидации на Entity и, в DuckDB-форме, маппинги на Transformer. Выражения парсятся в типизированный AST (через SQLGlot), проверяются по списку допустимых функций и компилируются в DuckDB-SQL — никогда не интерполируются как строки. Всё вне этого списка отклоняется при сохранении, а не во время выполнения.

Ссылки на поля

Ссылка Значение
d.field_name Поле проверяемой строки данных.
c.context_field Значение из контекста сессии (инъектируется на поставку).

В маппингах трансформера исходные колонки пишутся как кавыченные идентификаторы, точно совпадающие с заголовком поставщика, например "Konto", "Betrag".

Операторы

Группа Операторы
Сравнение ==, !=, >, <, >=, <=
Логические and, or, not

Функции

Allowlist сгруппирован по назначению. Файловые и environment-функции заблокированы by design.

Группа Функции (представительно)
Строки TRIM, LPAD, RPAD, REPLACE, len()
Сопоставление matches() (regex), in()
Null is_empty(), nz(), COALESCE, NULLIF
Математика abs(), round()
Тип CAST, TRY_CAST
Дата STRFTIME, STRPTIME

Примеры правил

Правило проходит, когда его выражение истинно для строки. Компилятор превращает его в запрос поиска нарушений вида SELECT ... WHERE NOT (expression).

# Konto должен быть ровно из 6 цифр
len(d.konto) == 6 and matches(d.konto, '^[0-9]+$')

# Сумма не должна быть нулевой
abs(d.amount) > 0

# Кост-центр обязателен
not is_empty(d.cost_center)

Каждое правило также несёт severity (ERROR, WARNING, INFO), опциональные preconditions и локализованные сообщения. См. Бизнес-правила о том, как severity управляет блокировкой и когда правило разрешается в not_applicable.

Примеры маппингов (DuckDB-форма)

Маппинги трансформера — это DuckDB-выражения над исходными колонками:

LPAD(TRIM("Konto"), 6, '0')                         -- нормализовать номер счёта
CAST(REPLACE("Betrag", ',', '.') AS DECIMAL(18,4))  -- нем. десятичное → DECIMAL
STRPTIME("Belegdatum", '%d.%m.%Y')                  -- распарсить дату
(SELECT "name" FROM dict_kontenplan WHERE "code" = "Konto")  -- lookup по каталогу

Модель безопасности

  • Парсится в типизированный AST; ввод пользователя не склеивается в SQL.
  • Проверяется по списку допустимых функций; DDL/DML отклоняется на этапе парсинга.
  • Кавыченные идентификаторы экранируются перед использованием как DuckDB-идентификаторы.

Связанное