SLayer 0.9.13
A feature release focused on getting your data in: import from Cube, richer variables in raw SQL, row-level security, and smarter ingestion.
Import from Cube
slayer import-cube now reads Cube .js files as well as .yml/.yaml. Cube FILTER_PARAMS become SLayer {variable} placeholders automatically, and their optional-pushdown form maps to optional {? ... ?} blocks.
Variables in raw SQL
You can now use {variable} placeholders in your model SQL and filters, filled from query.variables. Lists expand to a quoted IN body (region IN ({regions})), string values are escaped per-dialect, and optional {? ... ?} blocks drop out cleanly when their variables aren't supplied.
Row-level security
Define session policies that transparently filter every query by the current user's context, so each user only sees their own rows.
Smarter ingestion
Ingestion now brings in views, auto-hides ELT and migration housekeeping tables, sanitizes names that can't be modelled instead of failing silently, and detects join cardinality when you run slayer validate-models. Column and table comments in your database are imported as descriptions (and the dataset description on BigQuery), filling only where you haven't written one yourself.
BigQuery
Support for user-scoped OAuth credentials and dataset-scoped introspection.
Long identifiers
Generated column and alias names are now capped to each database's identifier-length limit, so wide models no longer break on Postgres and other stricter dialects.
Fixes
- A formula measure that references a sibling measure now generates valid SQL regardless of declaration order.
- Dotted dimension join paths are validated and rejected when they don't resolve.
- Filters accept SQL-cased boolean literals (
TRUE/FALSE). - Reference errors now name the right model when a measure or column doesn't resolve.
- Fresh installs pin a working MCP server version.