MetricFlow 0.210.0 - April 24, 2026
Breaking Changes
- Remove
MetricFlowEngine.get_measures_for_metrics(#1881) - License Change - Version 0.209.0 and greater is covered by the Apache 2.0 license. (#1905)
Features
- Add new transformations to production from dsi that produce metrics from old-style measures. (#387)
- Generate nested CTEs to simplify SQL (#1992)
- Add initial implementation of OSI converters (#2017)
Fixes
- Don't error for lack of time dimensions in manfest (#1848)
- Pin to the latest non-dev release of dbt-semantic-interfaces. (#1854)
- Use node_relation to render time spine table with proper quoting. (#1875)
- Fixes a bug related to leaving out metric values in offset metrics, specifically if the queried grain is smaller than the offset grain. (#1910)
- Properly apply time constraints on agg time dimensions for cumulative metrics. (#1910)
- Fixes a bug causing errors for join_to_timespine metrics queried with date part. (#1919)
- Add dunder prefix to column aliases for simple-metric inputs (#1938)
- Render simple-metric inputs without a dunder prefix for the
WHEREfilter (#1941) - Improve handling of invalid metrics in metadata methods of
MetricFlowEngine(#1949) - Fixes an issue where metric-level YAML filters are not applied for cumulative & conversion metrics. (#1950)
- Fix logging setup in the CLI (#1932)
- Fixes a bug where time dimensions utilizing the default time grain raise an error. (#1955)
- Add memoization to
resolve_available_itemsto prevent repeated expensive DAG traversals during query resolution with invalid group-by items (#1964) - Fix optimization of queries containing metrics with
fill_nulls_withset (#1963) - Improve CTE generation via caching in
ComputeMetricsBranchCombiner(#1986) - Prevent base-grain time dimensions from leaking into time-offset metric output (#2004)
- Fix check for aggregation time dimensions in filters (#2012)
- Fix bug with filters applied before aggregation in time-offset metrics (#2016)
- Fix queries mixing aliased and non-aliased versions of the same dimension (#2025)
Docs
- Update help text for
mf queryoptions (#1815) - Improve OSS contribution standards in CONTRIBUTING.md (#1996)
Under the Hood
- Add tests for the filtering of
AnnotatedSpecLinkableElementSet(#1864) - Remove
LegacyLinkableSpecResolver(#1865) - Consolidate measure / metric methods of
GroupByItemSetResolver(#1871) - Add test for group-by items using the cyclic manifest (#1869)
- Add workflow to check changelog files (#1847)
- Remove
LinkableElementSet(#1866) - Rename classes for group-by items (#1870)
- Consolidate measure-related operations into
MeasureLookup(#1868) - Consolidate measure / metric methods of
MetricLookup(#1872) - Assorted fixes for
GroupByItemSetFilter(#1873) - Bump dependence on dbt-semantic-interfaces to 0.9.3.dev4 to get newest transformations code. (#387)
- Add
SemanticGraphNodeTypedCollection(#1880) - Update
metricflow_semanticsto migratemeasures -> simple metrics(#1882) - Update
metricflowto migratemeasures -> simple metrics(#1889) - Add a test for
MetricLookup. get_aggregation_time_dimension_specs()(#1890) - Update SQL engine snapshots for the
measures -> simple metricsmigration (#1891) - Remove measure-related functionality from
MetricLookup(#1892) - Remove deprecated measure-related classes (#1893)
- Update simple-metric generation in the synthetic manifest generator (#1894)
- Copy dbt-semantic-interfaces into the MetricFlow repo. (#1895)
- Mark tests from
test_dataflow_to_sql_plan.pyas DuckDB-Only (#1896) - Remove
SimpleMetricInputSpec.non_additive_dimension_spec(#1897) - Renames for the
measures -> simple metricsmigration - Part 1 (#1898) - Renames for the
measures -> simple metricsmigration - Part 2 (#1902) - Renames for the
measures -> simple metricsmigration - Part 3 (#1903) - Rename
Metricflow*->MetricFlow*(#1904) - Remove assorted unused code (#1908)
- Move helper / utility methods to
toolkitmodule (#1909) - Update Cursor rules file to include linting + loading of additional rules (#1920)
- Move semantic-graph modules out of
experimental(#1921) - Remove case to reproduce date-part bug (#1922)
- Consolidate alias SQL generation to
ComputeMetricsNode(#1936) - Remove
AggregateSimpleMetricInputsNode.alias_mapping(#1937) - Filter out unneeded specs in dataflow plan before applying where filter. (#1944)
- Move CLI tests to dbt-metricflow package. Developers will need to run
make test-include-slowto execute CLI tests locally, and will need to runhatch -v run dev-env:pre-commit cleanto pick up the relevant config changes for linting. (#1948) - Multiprocess explain-SQL test framework (#1951)
- Support explain-SQL tests using external manifests (#1952)
- Add explain-SQL test using all metric / group-by item pairs (#1953)
- Add a test for a query that includes a time-offset metric and
metric_time__alien_day(#1954) - Test optimization of queries containing metrics with
fill_nulls_withset (#1962) - Update
ComputeMetricsNodeto allow passthrough (#1972) - Rename
FilterElementsNodetoSelectorNode(#1973) - Assorted updates to
DataflowPlanBuilder(#1976) - Remove
WhereFilterSpecSet(#1977) - Replace
PydanticMetricTimeWindowfields with immutable equivalent (#1978) - Rename
WhereConstraintNodetoWhereFilterNodefor consistency (#1979) - Improve rendering of multiple
WHEREfilters (#1980) - Remove
LinklessEntitySpec(#1981) - Assorted updates to ordered set and graph classes (#1982)
- Add
.create()initializer to spec / request classes (#1983) - Use a graph to model metric evaluation for a query (#1984)
- Add DFS metric evaluation planner (#1985)
- Update
DataflowPlanBuilderto use DFS metric evaluation plan (#1989) - Update metric evaluation planner tests to include SQL (#1990)
- Add passthrough metric evaluation planner (#1991)
- Add
DataflowPlanOptionSetto group build options (#1995) - Add
PASSTHROUGH_METRIC_EVALUATIONas an optimizer option (#1994) - Add tests for nested offset metric queries with custom time grains (#1988)
- Fold metricflow-semantics into metricflow (#2000)
- Sync dbt-semantic-intefaces to metricflow-semantic-interfaces in metricflow (#2001)
- Begin depending on metricflow-semantic-interfaces instead of dbt-semantic-interfaces (#2002)
- Remove unused code in
dataflow_plan_builder.py(#2003) - Move directory anchor to
toolkitmodule (#2006) - Add a helper to consolidate operations for time-offset metrics (#2008)
- Add tests for bugs with filter application in time-offset metrics (#2007)
- Added copilot instructions to improve AI code review support. (#2011)
- Simplify
metricflowdependencies (#2015) - Add a test case for time-offset metric with non-queried item in the filter (#2009)
- Update
ruff.tomlandAGENTS.mdfor Python 3.10 (#2022) - Streamline alias node addition in
DataflowPlanBuilder(#2023) - Move alias rendering tests to a separate file (#2024)
- Allow order-by items to omit the alias (#2030)
Dependencies
- Update requirement for dependency
more-itertoolsto include newest version (#1879) - Update to
dbt-semantic-interfaces==0.9.4.dev0(#1889) - Bumping upperbound range for dbt-semantic-interfaces in metricflow-semantics
- Add SqlAlchemy based SqlClient for test execution. This alters the developer environment to include SqlAlchemy dependencies. (#1966)
- Remove dbt dependencies from Metricflow development packages. This will require an environment refresh across metricflow and dbt-metricflow. (#1967)
- Expand dbt-core support to <1.12
- Update supported Python versions to
>=3.10, <3.14(#2020)
Contributors
- @MatthijsKok (#1879)
- @QMalcolm (#2017, #2000, #2001, #2002)
- @TTMichaelA
- @WilliamDee
- @b-per (#1815)
- @courtneyholcomb (#1905, #1848, #1854, #1875, #1910, #1910, #1919, #1950, #1955, #387, #1895, #1944)
- @plypaul (#1881, #1992, #1938, #1941, #1949, #1932, #1963, #1986, #2004, #2012, #2016, #2025, #1864, #1865, #1871, #1869, #1847, #1866, #1870, #1868, #1872, #1873, #1880, #1882, #1889, #1890, #1891, #1892, #1893, #1894, #1896, #1897, #1898, #1902, #1903, #1904, #1908, #1909, #1920, #1921, #1922, #1936, #1937, #1951, #1952, #1953, #1954, #1962, #1972, #1973, #1976, #1977, #1978, #1979, #1980, #1981, #1982, #1983, #1984, #1985, #1989, #1990, #1991, #1995, #1994, #1988, #2003, #2006, #2008, #2007, #2015, #2009, #2022, #2023, #2024, #2030, #1889, #2020)
- @theyostalservice (#387, #1996, #387, #2011)
- @tlento (#1948, #1966, #1967)
- @wiggzz (#1964)