Справочник: язык выражений¶
Язык выражений 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-идентификаторы.