Breaking Changes
- Changes MetricFlowQueryRequest.where_constraint to where_constraints and now accepts a list ([1431](https://github.com/dbt-labs/metricflow/issues/1431))
- Require Python `>=3.9` ([1470](https://github.com/dbt-labs/metricflow/issues/1470))
Features
- Enable predicate pushdown for categorical dimensions ([1011](https://github.com/dbt-labs/metricflow/issues/1011))
- Support sub-daily granularity options in SQL rendering for all supported SQL engines. ([1258](https://github.com/dbt-labs/metricflow/issues/1258))
- Adds a new dataflow plan node to re-aggregate metrics using window functions. Needed to calculate cumulative metrics at non-default granularities. ([1274](https://github.com/dbt-labs/metricflow/issues/1274))
- Build dataflow plan for cumulative metrics queried with non-default granularity. ([1281](https://github.com/dbt-labs/metricflow/issues/1281))
- Remove restriction on querying non-default granularities with cumulative metrics. ([1282](https://github.com/dbt-labs/metricflow/issues/1282))
- Enable predicate pushdown optimization by default for all callers ([1011](https://github.com/dbt-labs/metricflow/issues/1011))
- Use Metric.time_granularity to resolve metric_time. ([1310](https://github.com/dbt-labs/metricflow/issues/1310))
- Support multiple time spines with different granularities. ([1348](https://github.com/dbt-labs/metricflow/issues/1348))
- Enable sub-daily queries without metrics. ([1359](https://github.com/dbt-labs/metricflow/issues/1359))
- Enable sub-daily time constraints. ([1367](https://github.com/dbt-labs/metricflow/issues/1367))
- Support combining AggregateMeasuresNodes where metric input measures have aliases, so long as there are no duplicates. ([1375](https://github.com/dbt-labs/metricflow/issues/1375))
- Handle custom granularities in DataflowPlan. ([1382](https://github.com/dbt-labs/metricflow/issues/1382))
- Support custom granularities in query parsing. ([1413](https://github.com/dbt-labs/metricflow/issues/1413))
- Support conversion metrics queried with custom granularities. ([1475](https://github.com/dbt-labs/metricflow/issues/1475))
- Basic support for join_to_timespine metrics with custom grain in the group by. ([1505](https://github.com/dbt-labs/metricflow/issues/1505))
- Use CTEs instead of sub-queries in generated SQL. ([1040](https://github.com/dbt-labs/metricflow/issues/1040))
- Add meta to dimensions, entities, and measures
- Adds tags to SavedQueries
- Allow setting aliases for queried metrics ([1573](https://github.com/dbt-labs/metricflow/issues/1573))
Fixes
- When querying multiple agg time or metric time dimensions with a cumulative metric, select all of them from the time spine table. ([1271](https://github.com/dbt-labs/metricflow/issues/1271))
- Remove extraneous where filter subqueries added by predicate pushdown ([1011](https://github.com/dbt-labs/metricflow/issues/1011))
- Add Column header to the exported CSV from query command
- Allow metrics with matching input measures where one is cumulative and one is not. ([1374](https://github.com/dbt-labs/metricflow/issues/1374))
- Fixes bug where conversion metric query fails when filter with base semantic model's dimension is provided ([1210](https://github.com/dbt-labs/metricflow/issues/1210))
- Bug fix: ensure that granularity requested for non-additive dimension is respected. ([1383](https://github.com/dbt-labs/metricflow/issues/1383))
- Bug fix: when querying a join_to_timespine metric with a metric_time filter that is not included in the group by, unexpected output rows were included. ([1450](https://github.com/dbt-labs/metricflow/issues/1450))
- Remove unnecessary group bys that make queries less efficient. ([1453](https://github.com/dbt-labs/metricflow/issues/1453))
- Add new validation that checks for SCDs in the join path to make grouping by `metric_time` required in this case. ([1451](https://github.com/dbt-labs/metricflow/issues/1451))
- Make ID generation thread-safe ([1473](https://github.com/dbt-labs/metricflow/issues/1473))
- Prevent SourceScanOptimizer from combining nodes that use the same input metric alias in different derived metrics ([1494](https://github.com/dbt-labs/metricflow/issues/1494))
- Always treat metric_time and the agg_time_dimension the same in the JoinToTimeSpineNode. ([1541](https://github.com/dbt-labs/metricflow/issues/1541))
- Apply time constraints after time offsets to avoid filtering out values that will change later in the query. ([1544](https://github.com/dbt-labs/metricflow/issues/1544))
Under the Hood
- Add test coverage for more filter + join interactions ([1240](https://github.com/dbt-labs/metricflow/issues/1240))
- Add dataflow plan optimizer to replace build-time predicate pushdown ([1011](https://github.com/dbt-labs/metricflow/issues/1011))
- Added filtering for DWH validation tasks and saved query support ([1271](https://github.com/dbt-labs/metricflow/issues/1271))
- Refine subquery ID generation. This may result in changing subquery ids for rendered SQL. ([1280](https://github.com/dbt-labs/metricflow/issues/1280))
- Move categorical dimension predicate pushdown to DataflowPlanOptimizer ([1011](https://github.com/dbt-labs/metricflow/issues/1011))
- Consume cumulative-specific metric type params from new cumulative_type_params field. ([1293](https://github.com/dbt-labs/metricflow/issues/1293))
Dependencies
- Allow pydantic 2.x installations ([1299](https://github.com/dbt-labs/metricflow/issues/1299))
Contributors
- [DevonFulcher](https://github.com/DevonFulcher)
- [WilliamDee](https://github.com/WilliamDee) ([#1210](https://github.com/dbt-labs/metricflow/issues/1210), [#1271](https://github.com/dbt-labs/metricflow/issues/1271))
- [WilliamDee,courtneyholcomb](https://github.com/WilliamDee,courtneyholcomb) ([#1431](https://github.com/dbt-labs/metricflow/issues/1431))
- [courtneyholcomb](https://github.com/courtneyholcomb) ([#1258](https://github.com/dbt-labs/metricflow/issues/1258), [#1274](https://github.com/dbt-labs/metricflow/issues/1274), [#1281](https://github.com/dbt-labs/metricflow/issues/1281), [#1282](https://github.com/dbt-labs/metricflow/issues/1282), [#1310](https://github.com/dbt-labs/metricflow/issues/1310), [#1348](https://github.com/dbt-labs/metricflow/issues/1348), [#1359](https://github.com/dbt-labs/metricflow/issues/1359), [#1367](https://github.com/dbt-labs/metricflow/issues/1367), [#1375](https://github.com/dbt-labs/metricflow/issues/1375), [#1382](https://github.com/dbt-labs/metricflow/issues/1382), [#1413](https://github.com/dbt-labs/metricflow/issues/1413), [#1475](https://github.com/dbt-labs/metricflow/issues/1475), [#1505](https://github.com/dbt-labs/metricflow/issues/1505), [#1271](https://github.com/dbt-labs/metricflow/issues/1271), [#1374](https://github.com/dbt-labs/metricflow/issues/1374), [#1383](https://github.com/dbt-labs/metricflow/issues/1383), [#1450](https://github.com/dbt-labs/metricflow/issues/1450), [#1453](https://github.com/dbt-labs/metricflow/issues/1453), [#1541](https://github.com/dbt-labs/metricflow/issues/1541), [#1544](https://github.com/dbt-labs/metricflow/issues/1544), [#1293](https://github.com/dbt-labs/metricflow/issues/1293))
- [plypaul](https://github.com/plypaul) ([#1470](https://github.com/dbt-labs/metricflow/issues/1470), [#1040](https://github.com/dbt-labs/metricflow/issues/1040), [#1473](https://github.com/dbt-labs/metricflow/issues/1473))
- [saurabh0402](https://github.com/saurabh0402)
- [serramatutu](https://github.com/serramatutu) ([#1573](https://github.com/dbt-labs/metricflow/issues/1573), [#1451](https://github.com/dbt-labs/metricflow/issues/1451), [#1494](https://github.com/dbt-labs/metricflow/issues/1494))
- [theyostalservice](https://github.com/theyostalservice)
- [tlento](https://github.com/tlento) ([#1011](https://github.com/dbt-labs/metricflow/issues/1011), [#1011](https://github.com/dbt-labs/metricflow/issues/1011), [#1011](https://github.com/dbt-labs/metricflow/issues/1011), [#1240](https://github.com/dbt-labs/metricflow/issues/1240), [#1011](https://github.com/dbt-labs/metricflow/issues/1011), [#1280](https://github.com/dbt-labs/metricflow/issues/1280), [#1011](https://github.com/dbt-labs/metricflow/issues/1011), [#1299](https://github.com/dbt-labs/metricflow/issues/1299))