Portable Compiler Matrix¶
This matrix records the portable transformation claims shipped in ETLantic 0.21.0. It is narrower than each backend's native capabilities.
Compiler claims¶
| Package | Engine | Claimed profiles | Execution mode | Join collision policy |
|---|---|---|---|---|
etlantic-polars==0.21.0 |
Polars | kernel /1, relational /1, portable-string-advanced/1, portable-conversion/1, portable-statistics/1, portable-window/1, portable-complex-values/1, portable-complex-types/1, portable-reshape/1 |
Eager and lazy | fail only |
etlantic-pyspark==0.21.0 |
PySpark | kernel /1, relational /1, portable-string-advanced/1, portable-conversion/1, portable-statistics/1, portable-window/1, portable-complex-values/1, portable-complex-types/1, portable-reshape/1 |
Eager and lazy | fail only |
etlantic-pandas==0.21.0 |
Pandas | kernel /1, relational /1 |
Eager only (lazy=False) |
fail only |
etlantic-sql==0.21.0 |
SQL | kernel /1, relational /1 |
Eager (relation/SQL) | fail only |
Full profile identifiers use the dtcs:profile/ prefix (for example
dtcs:profile/portable-window/1). Compilers read dtcs.transform-plan/2 and
readable v1 plans. Candidate /2 kernel/relational metadata is treated as an
alias of the corresponding /1 claim.
Graduated 0.17 families (Polars + PySpark)¶
| Profile | Representative claims |
|---|---|
portable-string-advanced/1 |
trim, ltrim, rtrim, regex_extract, regex_replace, split |
portable-conversion/1 |
to_string, try_cast, cast, to_integer |
portable-statistics/1 |
variance, stddev, corr (sample semantics) |
portable-window/1 |
row_number, rank, dense_rank, lag, lead, first_value, last_value |
portable-complex-values/1 |
array, object, size (map on PySpark; Polars rejects map) |
portable-complex-types/1 |
field, index, element_at |
portable-reshape/1 |
explode |
Pandas and SQL remain baseline-only in 0.17 (kernel + relational /1). Plans
that require graduated families under portable_transform_policy=require fail
closed during planning on those engines.
Claimed baseline operations¶
All four compilers advertise the same baseline action surface:
| Profile group | Actions |
|---|---|
| Kernel | filter, project, with_fields, drop_fields, rename_fields |
| Relational | join, union, aggregate, sort, distinct, deduplicate, limit |
Exact claims are available at runtime from compiler.info.capabilities and via
etlantic plugin list --kind transform_compiler --format json.
Supported join types are inner, left, right, full, outer, semi,
anti, and cross. For portable plans, collisionPolicy must be fail.
Boundaries¶
- Pandas portable execution is eager. A plan requiring lazy execution is rejected.
- Polars and PySpark preserve backend-visible lazy operations where supported.
- SQL portable lowering targets typed
etlantic.sql/1with bound parameters only. Trusted SQL fragments are forbidden in portable definitions. - Distinct
missing/invalidthree-state literals fail closed unless a compiler advertisessemantic_mode:three_state_distinct(not claimed in 0.17). - Explicit window frames fail closed until frame lowering ships; omit
rowsBetween/rangeBetweenin portable Window V1 plans. - Continuation families remain unclaimed:
portable-relational-extended/1,portable-temporal-iana/1,portable-nondeterministic/1,portable-window/2. - Unsupported actions, functions, modes, and profiles must fail closed during support analysis. Compilers do not silently fall back to UDFs or raw SQL.
Verify claims¶
from etlantic.testing import run_portable_transform_conformance_suite
from etlantic_polars import create_transform_compiler
run_portable_transform_conformance_suite(create_transform_compiler())
Official Polars, PySpark, Pandas, and SQL compilers run this suite in CI, along with cross-engine differential tests. Third-party compilers must run it for every advertised profile and operation.
See Portable Transformation Compiler Protocol, Third-Party Compiler Tutorial, and Compatibility.