Skip to content

Release notes

Unreleased

New features

  • dosi lineage. dump prints the metric lineage graph as JSON; view renders it into one self-contained page and opens it — the same graph Engine.lineage() has returned since 0.1.8, now reachable from the command line. See Lineage.
  • The ontology layer on the lineage graph. With an Apache Ossie ontology loaded, the graph gains its concepts: which dataset grounds each entity, which joins realize each relationship, and — for metrics the ontology derives — the path that gives two same-SQL metrics their different meanings. Engine(...) accepts ontology_path, ontology_text and mapping.

Changes

  • A metric's dimensions are now what Dosi recommends, not every field it can reach. The lineage graph lists what dosi list dimensions --metric recommends, in the same order: primary keys, foreign keys and the columns some metric aggregates are left out. A name it leaves out is still groupable — the judgement withholds a recommendation, it never blocks an explicit --group-by.
  • Every field in the graph carries a label — the field's label in the model, or its name when the model gives none.
  • Engine(...)'s ontology options are keyword-only and come after the existing parameters, so a positional call written for 0.1.10 keeps its meaning. An ontology that cannot be parsed or lowered raises ModelError with the new code ontology; file paths are back in load errors.

0.1.10

New features

  • Detail queries. dosi select returns rows instead of aggregated metrics — "the 100 largest orders from Enterprise customers". Name the fields you want; Dosi works out the joins, and refuses rather than hand you duplicated rows. See Detail queries.
  • Time columns stored as text or numbers. A time column no longer has to be a real DATE. Declare what it holds — 20240131, 2024-01, 2024年01月31日 — and Dosi groups and filters it correctly, without losing partition pruning. Queries are unchanged: you always write 2024-01-31. See D-FORMAT.
  • A composed metric can build on another composed metric. A formula is written once and reused, instead of restated in every metric that uses it — and a restatement that had drifted used to compile silently.

Enhancements

  • Models using the standard OSI datatype property now load, Apache Ossie's TPC-DS reference model included.
  • An --order key names a metric or a field you grouped by, never a column name the engine generated.

Bug fixes

  • A parameter whose values were Chinese, or any non-ASCII text, produced the same column name for every value; binding several at once failed the query.
  • Time columns stored as integers failed on MySQL, TiDB and ClickHouse when rolled up to month or year.

0.1.9

Dosi is now under the Elastic License 2.0: free to use and redistribute, with no hosted-service resale. It replaces the proprietary licence 0.1.5 introduced, which granted no rights at all without a separate agreement.

New features

  • BigQuery runs queries. It was compile-only — Dosi generated the SQL and refused to execute it. It now passes the full test corpus against a live project. See BigQuery.
  • Metric lineage (Python only) — Engine.lineage() returns the graph behind your metrics: table → dataset → metric → derived metric. Pass redact_sql=True if the graph leaves your trust boundary.
  • Model authoring contract (Python only) — render_datus_authoring_spec() returns the rules this engine enforces, with a digest, so a tool that generates models can check it is authoring against the same version.
  • Installing from a mirror. install.sh takes DOSI_SOURCE=github|oss|cloudflare. Use DOSI_SOURCE=oss from mainland China, where the GitHub download runs at tens of KB/s and often stalls. Archives are checksum-verified either way. The Cloudflare mirror is not populated in this release.

Enhancements

  • install.sh works on macOS, where it used to refuse any non-Linux host.
  • Validation returns what each metric actually compiled to, and Python connection settings can be passed in memory without the plaintext-secret warning — which only ever made sense for a file on disk.
  • A new BigQuery docs page, plus a 200k-row example database at https://dosi.datus.ai/orders-200k.duckdb.

Bug fixes

  • A rolling window of 1 period, or a preceding bound of 0, generated SQL that Doris and StarRocks reject outright, so an ordinary --param n=1,3,6 failed on those two engines.

0.1.8

No wheel was published for this version, so dosi-engine users go from 0.1.7 straight to 0.1.9, which includes everything here. The binaries shipped for Linux x86_64, Linux aarch64 and Apple Silicon only — on an Intel Mac, install 0.1.9.

New features

  • Attribution: why did this metric change? Give Dosi a metric, the dimensions to look at and two time windows; it runs the queries itself and returns a ranked breakdown of where the change came from, each segment with a ready-made filter for the next drill-down. The method comes from the metric's own algebra, and a metric it cannot decompose returns a structured "unsupported" with the reason rather than a wrong number. See Explain metric changes.
  • Parameterized metrics. A metric's window width, offset, rank bucket or filter value can be a query-time parameter: one moving_avg(n) replaces r7 / r30 / r90, and one query can ask for several values at once, a column each. See Parameterized metrics.

Enhancements

  • dosi list metrics says whether a metric can be attributed, and how, so you can check before running an analysis.
  • A query can carry several named time windows and get them all back from a single statement.

Behaviour change

  • If you call Engine.attribute() from the 0.1.7 wheel: the share fields can now be absent for a segment whose denominator is not positive, so code that reads them unconditionally needs to handle that.

0.1.7

This release is split: the binaries and the wheel were built three days apart, from different commits, so the wheel contains more.

New features

  • A second, smaller downloaddosi-<version>-<target>-lean.tar.gz is the executables alone. It compiles queries and reaches every warehouse; local DuckDB execution uses a duckdb CLI on your PATH.
  • Derived metrics (D-DERIVE) M2 — windows over derived metrics, and composing over window members.
  • SQLite files are readable through DuckDB.
  • An error-code reference, with a catalog of what each rejection means.
  • Attribution, first version (wheel only) — Engine.attribute(). 0.1.8 extends it; read its behaviour change above before upgrading.

Enhancements

  • DuckDB starts about 200 ms faster per process — a one-shot dosi query --execute went from 249 ms to 41 ms of CPU. Query speed itself is unchanged; the cost was start-up.

Bug fixes

  • Redshift now renders as Redshift. It had been falling through to the generic generator and emitting Postgres SQL.
  • The wheel builds under cargo 1.93 and later.

0.1.6

Wheel onlydosi and dosi-server users go from 0.1.5 to 0.1.7.

New features

  • A Linux aarch64 wheel, so Graviton and arm64 containers no longer need a source build.
  • SQLite files are readable through DuckDB, which makes a local .sqlite file a usable connection for tests and small models.
  • CONNECTION_TYPES is exported, so a caller can list which warehouses a given wheel was built with.

0.1.5

The first public release of Dosi. From here the project ships as binaries and wheels only; no source archive is published. Install with curl -fsSL https://dosi.datus.ai/install.sh | sh for the dosi and dosi-server executables, or pip install dosi-engine for the Python bindings.

It loads an OSI semantic model, validates it, compiles a metric query to SQL for your warehouse, and runs it. Fifteen warehouses — DuckDB · StarRocks · ClickHouse · Doris · TiDB · Trino · Postgres · MySQL · Snowflake · BigQuery · Databricks · Redshift · Hologres · GaussDB · Oracle. Four ways in: the dosi CLI, REST, MCP, and the Python wheel. Two modes: --osi-datus honours the Datus extensions, --osi-basic is strict standard OSI.


Nothing before 0.1.5 was published.