Release notes¶
Unreleased¶
New features
dosi lineage.dumpprints the metric lineage graph as JSON;viewrenders it into one self-contained page and opens it — the same graphEngine.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(...)acceptsontology_path,ontology_textandmapping.
Changes
- A metric's dimensions are now what Dosi recommends, not every field it
can reach. The lineage graph lists what
dosi list dimensions --metricrecommends, 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'slabelin 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 raisesModelErrorwith the new codeontology; file paths are back in load errors.
0.1.10¶
New features
- Detail queries.
dosi selectreturns 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 write2024-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
datatypeproperty now load, Apache Ossie's TPC-DS reference model included. - An
--orderkey 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. Passredact_sql=Trueif 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.shtakesDOSI_SOURCE=github|oss|cloudflare. UseDOSI_SOURCE=ossfrom 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.shworks 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
precedingbound of 0, generated SQL that Doris and StarRocks reject outright, so an ordinary--param n=1,3,6failed 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)replacesr7/r30/r90, and one query can ask for several values at once, a column each. See Parameterized metrics.
Enhancements
dosi list metricssays 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 download —
dosi-<version>-<target>-lean.tar.gzis the executables alone. It compiles queries and reaches every warehouse; local DuckDB execution uses aduckdbCLI 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 --executewent 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 only — dosi 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
.sqlitefile a usable connection for tests and small models. CONNECTION_TYPESis 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.