What's New
Features
- HTTP server transport — Optional
bsl servecommand exposes BSL models over REST via FastAPI (pip install boring-semantic-layer[server]) (#214) - Per-dimension time grains —
time_grainsparameter lets each time dimension use a different grain (e.g.,{"order_date": "month", "ship_date": "quarter"}) (#214) - Short grain names — Core
query()now accepts"month","quarter", etc. alongside"TIME_GRAIN_MONTH"(#214) - Derived time dimensions — Auto-generate year/month/day parts from time dimensions via
derived_dimensions(#215, closes #213) - Plain ibis backend support — BSL works with any ibis backend (Databricks, ClickHouse, MySQL, etc.) without xorq wrapping (#217)
- Self-joins with aliases — Join the same model multiple times in YAML with different aliases (#205, addresses #114)
- YAML calculated_measures — Support
calculated_measuresand.all()in YAML definitions (#211)
Fixes
- Fix content hashing so models with different measures/dimensions produce different hashes (#209)
- Fix 15 broken links across documentation (#208)
- Fix model prefix behavior in
with_dimensions/with_measuresafter joins (#211)
Internal
- Convert
to_untagged()to return xorq-vendored ibis types consistently (#203)