Referenz: Ausdruckssprache¶
Expectos Ausdruckssprache ist, wie Sie Validierungsregeln an einer Entity und — in DuckDB-Form — Mappings an einem Transformer schreiben. Ausdrücke werden in einen typisierten AST geparst (über SQLGlot), gegen eine Funktions-Allowlist geprüft und zu DuckDB-SQL kompiliert — niemals als String interpoliert. Alles außerhalb der Allowlist wird beim Speichern abgelehnt, nicht zur Laufzeit.
Feldreferenzen¶
| Referenz | Bedeutung |
|---|---|
d.field_name |
Ein Feld der geprüften Datenzeile. |
c.context_field |
Ein Wert aus dem Session-Kontext (je Lieferung injiziert). |
In Transformer-Mappings werden Quellspalten als gequotete Identifier
geschrieben, die exakt der Überschrift des Lieferanten entsprechen, z. B.
"Konto", "Betrag".
Operatoren¶
| Gruppe | Operatoren |
|---|---|
| Vergleich | ==, !=, >, <, >=, <= |
| Logisch | and, or, not |
Funktionen¶
Die Allowlist gruppiert nach Zweck. Dateisystem- und Umgebungsfunktionen sind per Design blockiert.
| Gruppe | Funktionen (repräsentativ) |
|---|---|
| String | TRIM, LPAD, RPAD, REPLACE, len() |
| Matching | matches() (Regex), in() |
| Null-Handling | is_empty(), nz(), COALESCE, NULLIF |
| Mathe | abs(), round() |
| Typ | CAST, TRY_CAST |
| Datum | STRFTIME, STRPTIME |
Regel-Beispiele¶
Eine Regel besteht, wenn ihr Ausdruck für eine Zeile wahr ist. Der Compiler
macht daraus eine Verletzungsabfrage der Form SELECT ... WHERE NOT (expression).
# Konto muss exakt 6 Ziffern haben
len(d.konto) == 6 and matches(d.konto, '^[0-9]+$')
# Betrag darf nicht null sein
abs(d.amount) > 0
# Kostenstelle ist erforderlich
not is_empty(d.cost_center)
Jede Regel trägt außerdem einen Schweregrad (ERROR, WARNING, INFO),
optionale Vorbedingungen und lokalisierte Meldungen. Siehe
Geschäftsregeln dazu, wie der Schweregrad das
Blockieren steuert und wann eine Regel zu not_applicable auflöst.
Mapping-Beispiele (DuckDB-Form)¶
Transformer-Mappings sind DuckDB-Ausdrücke über die Quellspalten:
LPAD(TRIM("Konto"), 6, '0') -- Kontonummer normalisieren
CAST(REPLACE("Betrag", ',', '.') AS DECIMAL(18,4)) -- dt. Dezimal → DECIMAL
STRPTIME("Belegdatum", '%d.%m.%Y') -- Datum parsen
(SELECT "name" FROM dict_kontenplan WHERE "code" = "Konto") -- Katalog-Lookup
Sicherheitsmodell¶
- In einen typisierten AST geparst; kein Benutzereingabe-String wird in SQL konkateniert.
- Gegen die Funktions-Allowlist geprüft; DDL/DML wird beim Parsen abgelehnt.
- Gequotete Identifier werden vor der Verwendung als DuckDB-Identifier escaped.