Skip to content

Commit

Permalink
Add optimizer test case for derived metrics with the same measure.
Browse files Browse the repository at this point in the history
  • Loading branch information
plypaul committed Dec 15, 2023
1 parent 457deb8 commit f4691d7
Show file tree
Hide file tree
Showing 4 changed files with 242 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -351,3 +351,26 @@ def test_2_ratio_metrics_from_1_semantic_model( # noqa: D
expected_num_sources_in_unoptimized=4,
expected_num_sources_in_optimized=1,
)


@pytest.mark.sql_engine_snapshot
def test_duplicate_measures( # noqa: D
request: FixtureRequest,
mf_test_session_state: MetricFlowTestSessionState,
dataflow_plan_builder: DataflowPlanBuilder,
) -> None:
"""Tests a case where derived metrics in a query use the same measure (in the same form e.g. filters)."""
check_optimization(
request=request,
mf_test_session_state=mf_test_session_state,
dataflow_plan_builder=dataflow_plan_builder,
query_spec=MetricFlowQuerySpec(
metric_specs=(
MetricSpec(element_name="derived_bookings_0"),
MetricSpec(element_name="derived_bookings_1"),
),
dimension_specs=(DataSet.metric_time_dimension_spec(TimeGranularity.DAY),),
),
expected_num_sources_in_unoptimized=2,
expected_num_sources_in_optimized=1,
)
Original file line number Diff line number Diff line change
Expand Up @@ -610,3 +610,21 @@ metric:
offset_to_grain: month
alias: booking_fees_start_of_month
- name: booking_fees
---
metric:
name: "derived_bookings_0"
description: Derived metric for testing optimizations for duplicate measures in a query.
type: derived
type_params:
expr: bookings
metrics:
- name: bookings
---
metric:
name: "derived_bookings_1"
description: Derived metric for testing optimizations for duplicate measures in a query.
type: derived
type_params:
expr: bookings
metrics:
- name: bookings
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<DataflowPlan>
<WriteToResultDataframeNode>
<!-- description = Write to Dataframe -->
<!-- node_id = wrd_0 -->
<CombineAggregatedOutputsNode>
<!-- description = Combine Aggregated Outputs -->
<!-- node_id = cao_0 -->
<ComputeMetricsNode>
<!-- description = Compute Metrics via Expressions -->
<!-- node_id = cm_1 -->
<!-- metric_spec = -->
<!-- {'class': 'MetricSpec', -->
<!-- 'element_name': 'derived_bookings_0', -->
<!-- 'constraint': None, -->
<!-- 'alias': None, -->
<!-- 'offset_window': None, -->
<!-- 'offset_to_grain': None} -->
<ComputeMetricsNode>
<!-- description = Compute Metrics via Expressions -->
<!-- node_id = cm_0 -->
<!-- metric_spec = -->
<!-- {'class': 'MetricSpec', -->
<!-- 'element_name': 'bookings', -->
<!-- 'constraint': None, -->
<!-- 'alias': None, -->
<!-- 'offset_window': None, -->
<!-- 'offset_to_grain': None} -->
<AggregateMeasuresNode>
<!-- description = Aggregate Measures -->
<!-- node_id = am_0 -->
<FilterElementsNode>
<!-- description = -->
<!-- Pass Only Elements: -->
<!-- ['bookings', 'metric_time__day'] -->
<!-- node_id = pfe_0 -->
<!-- include_spec = -->
<!-- {'class': 'MeasureSpec', -->
<!-- 'element_name': 'bookings', -->
<!-- 'non_additive_dimension_spec': None, -->
<!-- 'fill_nulls_with': None} -->
<!-- include_spec = -->
<!-- {'class': 'TimeDimensionSpec', -->
<!-- 'element_name': 'metric_time', -->
<!-- 'entity_links': (), -->
<!-- 'time_granularity': TimeGranularity.DAY, -->
<!-- 'date_part': None, -->
<!-- 'aggregation_state': None} -->
<!-- distinct = False -->
<MetricTimeDimensionTransformNode>
<!-- description = Metric Time Dimension 'ds' -->
<!-- node_id = sma_10001 -->
<!-- aggregation_time_dimension = ds -->
<ReadSqlSourceNode>
<!-- description = -->
<!-- Read From SemanticModelDataSet(SemanticModelReference(semantic_model_name='bookings_source')) -->
<!-- node_id = rss_10011 -->
<!-- data_set = -->
<!-- SemanticModelDataSet(SemanticModelReference(semantic_model_name='bookings_source')) -->
</ReadSqlSourceNode>
</MetricTimeDimensionTransformNode>
</FilterElementsNode>
</AggregateMeasuresNode>
</ComputeMetricsNode>
</ComputeMetricsNode>
<ComputeMetricsNode>
<!-- description = Compute Metrics via Expressions -->
<!-- node_id = cm_3 -->
<!-- metric_spec = -->
<!-- {'class': 'MetricSpec', -->
<!-- 'element_name': 'derived_bookings_1', -->
<!-- 'constraint': None, -->
<!-- 'alias': None, -->
<!-- 'offset_window': None, -->
<!-- 'offset_to_grain': None} -->
<ComputeMetricsNode>
<!-- description = Compute Metrics via Expressions -->
<!-- node_id = cm_2 -->
<!-- metric_spec = -->
<!-- {'class': 'MetricSpec', -->
<!-- 'element_name': 'bookings', -->
<!-- 'constraint': None, -->
<!-- 'alias': None, -->
<!-- 'offset_window': None, -->
<!-- 'offset_to_grain': None} -->
<AggregateMeasuresNode>
<!-- description = Aggregate Measures -->
<!-- node_id = am_1 -->
<FilterElementsNode>
<!-- description = -->
<!-- Pass Only Elements: -->
<!-- ['bookings', 'metric_time__day'] -->
<!-- node_id = pfe_1 -->
<!-- include_spec = -->
<!-- {'class': 'MeasureSpec', -->
<!-- 'element_name': 'bookings', -->
<!-- 'non_additive_dimension_spec': None, -->
<!-- 'fill_nulls_with': None} -->
<!-- include_spec = -->
<!-- {'class': 'TimeDimensionSpec', -->
<!-- 'element_name': 'metric_time', -->
<!-- 'entity_links': (), -->
<!-- 'time_granularity': TimeGranularity.DAY, -->
<!-- 'date_part': None, -->
<!-- 'aggregation_state': None} -->
<!-- distinct = False -->
<MetricTimeDimensionTransformNode>
<!-- description = Metric Time Dimension 'ds' -->
<!-- node_id = sma_10001 -->
<!-- aggregation_time_dimension = ds -->
<ReadSqlSourceNode>
<!-- description = -->
<!-- Read From SemanticModelDataSet(SemanticModelReference(semantic_model_name='bookings_source')) -->
<!-- node_id = rss_10011 -->
<!-- data_set = -->
<!-- SemanticModelDataSet(SemanticModelReference(semantic_model_name='bookings_source')) -->
</ReadSqlSourceNode>
</MetricTimeDimensionTransformNode>
</FilterElementsNode>
</AggregateMeasuresNode>
</ComputeMetricsNode>
</ComputeMetricsNode>
</CombineAggregatedOutputsNode>
</WriteToResultDataframeNode>
</DataflowPlan>
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<DataflowPlan>
<WriteToResultDataframeNode>
<!-- description = Write to Dataframe -->
<!-- node_id = wrd_1 -->
<ComputeMetricsNode>
<!-- description = Compute Metrics via Expressions -->
<!-- node_id = cm_9 -->
<!-- metric_spec = -->
<!-- {'class': 'MetricSpec', -->
<!-- 'element_name': 'derived_bookings_0', -->
<!-- 'constraint': None, -->
<!-- 'alias': None, -->
<!-- 'offset_window': None, -->
<!-- 'offset_to_grain': None} -->
<!-- metric_spec = -->
<!-- {'class': 'MetricSpec', -->
<!-- 'element_name': 'derived_bookings_1', -->
<!-- 'constraint': None, -->
<!-- 'alias': None, -->
<!-- 'offset_window': None, -->
<!-- 'offset_to_grain': None} -->
<ComputeMetricsNode>
<!-- description = Compute Metrics via Expressions -->
<!-- node_id = cm_8 -->
<!-- metric_spec = -->
<!-- {'class': 'MetricSpec', -->
<!-- 'element_name': 'bookings', -->
<!-- 'constraint': None, -->
<!-- 'alias': None, -->
<!-- 'offset_window': None, -->
<!-- 'offset_to_grain': None} -->
<!-- metric_spec = -->
<!-- {'class': 'MetricSpec', -->
<!-- 'element_name': 'bookings', -->
<!-- 'constraint': None, -->
<!-- 'alias': None, -->
<!-- 'offset_window': None, -->
<!-- 'offset_to_grain': None} -->
<AggregateMeasuresNode>
<!-- description = Aggregate Measures -->
<!-- node_id = am_4 -->
<FilterElementsNode>
<!-- description = -->
<!-- Pass Only Elements: -->
<!-- ['bookings', 'metric_time__day'] -->
<!-- node_id = pfe_4 -->
<!-- include_spec = -->
<!-- {'class': 'MeasureSpec', -->
<!-- 'element_name': 'bookings', -->
<!-- 'non_additive_dimension_spec': None, -->
<!-- 'fill_nulls_with': None} -->
<!-- include_spec = -->
<!-- {'class': 'TimeDimensionSpec', -->
<!-- 'element_name': 'metric_time', -->
<!-- 'entity_links': (), -->
<!-- 'time_granularity': TimeGranularity.DAY, -->
<!-- 'date_part': None, -->
<!-- 'aggregation_state': None} -->
<!-- distinct = False -->
<MetricTimeDimensionTransformNode>
<!-- description = Metric Time Dimension 'ds' -->
<!-- node_id = sma_2 -->
<!-- aggregation_time_dimension = ds -->
<ReadSqlSourceNode>
<!-- description = -->
<!-- Read From SemanticModelDataSet(SemanticModelReference(semantic_model_name='bookings_source')) -->
<!-- node_id = rss_2 -->
<!-- data_set = -->
<!-- SemanticModelDataSet(SemanticModelReference(semantic_model_name='bookings_source')) -->
</ReadSqlSourceNode>
</MetricTimeDimensionTransformNode>
</FilterElementsNode>
</AggregateMeasuresNode>
</ComputeMetricsNode>
</ComputeMetricsNode>
</WriteToResultDataframeNode>
</DataflowPlan>

0 comments on commit f4691d7

Please sign in to comment.