From cac1d5935f09b142e69553cdb369ec563727da57 Mon Sep 17 00:00:00 2001 From: serramatutu Date: Wed, 30 Oct 2024 19:36:09 +0100 Subject: [PATCH] Add tests for derived metrics with shared aliases This commit adds dataflow and SQL snapshot tests that verify we're not generating duplicated aliases when combining branches. I created 3 new dummy metrics for these tests: `derived_sharedalias_1a`, `derived_sharedalias_1b` and `derived_sharedalias_2`. The `1a` and `1b` variant both make `shared_alias` refer to `bookings`, while the `2` variant makes it refer to `instant_bookings`. This way we can test the 2 cases: - If the alias refers to the same thing (`1a` vs `1b`), we can merge branches safely - If the alias refers to different things (`1a` vs `2`), we cannot merge branches safely --- .../simple_manifest/metrics.yaml | 33 ++ ...linkable_element_set_as_spec_set__set0.txt | 9 + ...linkable_elements_for_measure__result0.txt | 9 + ...elements_for_no_metrics_query__result0.txt | 27 ++ .../source_scan/test_source_scan_optimizer.py | 54 +++ .../test_derived_metric_rendering.py | 26 + ...e_alias_in_different_components__plan0.sql | 459 ++++++++++++++++++ ..._different_components__plan0_optimized.sql | 59 +++ ..._same_alias_components_combined__dfp_0.xml | 84 ++++ ...same_alias_components_combined__dfpo_0.xml | 43 ++ ...e_alias_components_not_combined__dfp_0.xml | 88 ++++ ..._alias_components_not_combined__dfpo_0.xml | 88 ++++ 12 files changed, 979 insertions(+) create mode 100644 tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql create mode 100644 tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql create mode 100644 tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfp_0.xml create mode 100644 tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfpo_0.xml create mode 100644 tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfp_0.xml create mode 100644 tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfpo_0.xml diff --git a/metricflow-semantics/metricflow_semantics/test_helpers/semantic_manifest_yamls/simple_manifest/metrics.yaml b/metricflow-semantics/metricflow_semantics/test_helpers/semantic_manifest_yamls/simple_manifest/metrics.yaml index e3ddb2998a..e6428aac59 100644 --- a/metricflow-semantics/metricflow_semantics/test_helpers/semantic_manifest_yamls/simple_manifest/metrics.yaml +++ b/metricflow-semantics/metricflow_semantics/test_helpers/semantic_manifest_yamls/simple_manifest/metrics.yaml @@ -805,3 +805,36 @@ metric: name: listings filter: "{{ Metric('views', ['listing']) }} > 10" time_granularity: week +--- +# note that in both 1a and 1b "shared_alias" refer to "bookinks", whereas +# in 2 it refers to "instant_bookings", hence the naming difference +metric: + name: derived_sharedalias_1a + description: "Minimal repro case for derived metrics which give the same alias for different underlying metrics" + type: derived + type_params: + expr: shared_alias - 10 + metrics: + - name: bookings + alias: shared_alias +--- +metric: + name: derived_sharedalias_1b + description: "Minimal repro case for derived metrics which give the same alias for different underlying metrics" + type: derived + type_params: + expr: shared_alias - 100 + metrics: + - name: bookings + alias: shared_alias +--- +metric: + name: derived_sharedalias_2 + description: "Minimal repro case for derived metrics which give the same alias for different underlying metrics" + type: derived + type_params: + expr: shared_alias + 10 + metrics: + - name: instant_bookings + alias: shared_alias +--- diff --git a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_linkable_spec_resolver.py/list/test_linkable_element_set_as_spec_set__set0.txt b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_linkable_spec_resolver.py/list/test_linkable_element_set_as_spec_set__set0.txt index d7a8338d31..a4bf4f4d9e 100644 --- a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_linkable_spec_resolver.py/list/test_linkable_element_set_as_spec_set__set0.txt +++ b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_linkable_spec_resolver.py/list/test_linkable_element_set_as_spec_set__set0.txt @@ -28,6 +28,9 @@ 'listing__booking__listing__bookings_per_dollar', 'listing__booking__listing__derived_bookings_0', 'listing__booking__listing__derived_bookings_1', + 'listing__booking__listing__derived_sharedalias_1a', + 'listing__booking__listing__derived_sharedalias_1b', + 'listing__booking__listing__derived_sharedalias_2', 'listing__booking__listing__discrete_booking_value_p99', 'listing__booking__listing__double_counted_delayed_bookings', 'listing__booking__listing__instant_booking_fraction_of_max_value', @@ -90,6 +93,9 @@ 'listing__created_at__year', 'listing__derived_bookings_0', 'listing__derived_bookings_1', + 'listing__derived_sharedalias_1a', + 'listing__derived_sharedalias_1b', + 'listing__derived_sharedalias_2', 'listing__discrete_booking_value_p99', 'listing__double_counted_delayed_bookings', 'listing__ds__day', @@ -441,6 +447,9 @@ 'user__listing__user__bookings_per_view', 'user__listing__user__derived_bookings_0', 'user__listing__user__derived_bookings_1', + 'user__listing__user__derived_sharedalias_1a', + 'user__listing__user__derived_sharedalias_1b', + 'user__listing__user__derived_sharedalias_2', 'user__listing__user__discrete_booking_value_p99', 'user__listing__user__double_counted_delayed_bookings', 'user__listing__user__instant_booking_fraction_of_max_value', diff --git a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/str/test_linkable_elements_for_measure__result0.txt b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/str/test_linkable_elements_for_measure__result0.txt index cabf3eb546..4982aceea2 100644 --- a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/str/test_linkable_elements_for_measure__result0.txt +++ b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/str/test_linkable_elements_for_measure__result0.txt @@ -45,6 +45,9 @@ Model Join-Path Entity Links ('listings_latest',) ("('listing',)", "('booking', 'listing')") bookings_per_dollar ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_bookings_0 ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_bookings_1 ['JOINED', 'METRIC'] +('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_sharedalias_1a ['JOINED', 'METRIC'] +('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_sharedalias_1b ['JOINED', 'METRIC'] +('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_sharedalias_2 ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('booking', 'listing')") discrete_booking_value_p99 ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('booking', 'listing')") double_counted_delayed_bookings ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('booking', 'listing')") instant_booking_fraction_of_max_value ['JOINED', 'METRIC'] @@ -94,6 +97,9 @@ Model Join-Path Entity Links ('listings_latest',) ("('listing',)", "('listing',)") bookings_per_view ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('listing',)") derived_bookings_0 ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('listing',)") derived_bookings_1 ['JOINED', 'METRIC'] +('listings_latest',) ("('listing',)", "('listing',)") derived_sharedalias_1a ['JOINED', 'METRIC'] +('listings_latest',) ("('listing',)", "('listing',)") derived_sharedalias_1b ['JOINED', 'METRIC'] +('listings_latest',) ("('listing',)", "('listing',)") derived_sharedalias_2 ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('listing',)") discrete_booking_value_p99 ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('listing',)") double_counted_delayed_bookings ['JOINED', 'METRIC'] ('listings_latest',) ("('listing',)", "('listing',)") instant_booking_fraction_of_max_value ['JOINED', 'METRIC'] @@ -156,6 +162,9 @@ Model Join-Path Entity Links ('listings_latest',) ("('user',)", "('listing', 'user')") bookings_per_view ['JOINED', 'METRIC'] ('listings_latest',) ("('user',)", "('listing', 'user')") derived_bookings_0 ['JOINED', 'METRIC'] ('listings_latest',) ("('user',)", "('listing', 'user')") derived_bookings_1 ['JOINED', 'METRIC'] +('listings_latest',) ("('user',)", "('listing', 'user')") derived_sharedalias_1a ['JOINED', 'METRIC'] +('listings_latest',) ("('user',)", "('listing', 'user')") derived_sharedalias_1b ['JOINED', 'METRIC'] +('listings_latest',) ("('user',)", "('listing', 'user')") derived_sharedalias_2 ['JOINED', 'METRIC'] ('listings_latest',) ("('user',)", "('listing', 'user')") discrete_booking_value_p99 ['JOINED', 'METRIC'] ('listings_latest',) ("('user',)", "('listing', 'user')") double_counted_delayed_bookings ['JOINED', 'METRIC'] ('listings_latest',) ("('user',)", "('listing', 'user')") instant_booking_fraction_of_max_value ['JOINED', 'METRIC'] diff --git a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/tuple/test_linkable_elements_for_no_metrics_query__result0.txt b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/tuple/test_linkable_elements_for_no_metrics_query__result0.txt index a298668743..91a5dc4101 100644 --- a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/tuple/test_linkable_elements_for_no_metrics_query__result0.txt +++ b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/tuple/test_linkable_elements_for_no_metrics_query__result0.txt @@ -72,6 +72,9 @@ 'company__listing__user__company__bookings_per_view', 'company__listing__user__company__derived_bookings_0', 'company__listing__user__company__derived_bookings_1', + 'company__listing__user__company__derived_sharedalias_1a', + 'company__listing__user__company__derived_sharedalias_1b', + 'company__listing__user__company__derived_sharedalias_2', 'company__listing__user__company__discrete_booking_value_p99', 'company__listing__user__company__double_counted_delayed_bookings', 'company__listing__user__company__instant_booking_fraction_of_max_value', @@ -146,6 +149,9 @@ 'guest__booking__guest__bookings_per_dollar', 'guest__booking__guest__derived_bookings_0', 'guest__booking__guest__derived_bookings_1', + 'guest__booking__guest__derived_sharedalias_1a', + 'guest__booking__guest__derived_sharedalias_1b', + 'guest__booking__guest__derived_sharedalias_2', 'guest__booking__guest__discrete_booking_value_p99', 'guest__booking__guest__double_counted_delayed_bookings', 'guest__booking__guest__instant_booking_fraction_of_max_value', @@ -181,6 +187,9 @@ 'guest__bookings_per_dollar', 'guest__derived_bookings_0', 'guest__derived_bookings_1', + 'guest__derived_sharedalias_1a', + 'guest__derived_sharedalias_1b', + 'guest__derived_sharedalias_2', 'guest__discrete_booking_value_p99', 'guest__double_counted_delayed_bookings', 'guest__instant_booking_fraction_of_max_value', @@ -227,6 +236,9 @@ 'host__booking__host__bookings_per_dollar', 'host__booking__host__derived_bookings_0', 'host__booking__host__derived_bookings_1', + 'host__booking__host__derived_sharedalias_1a', + 'host__booking__host__derived_sharedalias_1b', + 'host__booking__host__derived_sharedalias_2', 'host__booking__host__discrete_booking_value_p99', 'host__booking__host__double_counted_delayed_bookings', 'host__booking__host__instant_booking_fraction_of_max_value', @@ -262,6 +274,9 @@ 'host__bookings_per_dollar', 'host__derived_bookings_0', 'host__derived_bookings_1', + 'host__derived_sharedalias_1a', + 'host__derived_sharedalias_1b', + 'host__derived_sharedalias_2', 'host__discrete_booking_value_p99', 'host__double_counted_delayed_bookings', 'host__instant_booking_fraction_of_max_value', @@ -309,6 +324,9 @@ 'listing__booking__listing__bookings_per_dollar', 'listing__booking__listing__derived_bookings_0', 'listing__booking__listing__derived_bookings_1', + 'listing__booking__listing__derived_sharedalias_1a', + 'listing__booking__listing__derived_sharedalias_1b', + 'listing__booking__listing__derived_sharedalias_2', 'listing__booking__listing__discrete_booking_value_p99', 'listing__booking__listing__double_counted_delayed_bookings', 'listing__booking__listing__instant_booking_fraction_of_max_value', @@ -357,6 +375,9 @@ 'listing__created_at__extract_year', 'listing__derived_bookings_0', 'listing__derived_bookings_1', + 'listing__derived_sharedalias_1a', + 'listing__derived_sharedalias_1b', + 'listing__derived_sharedalias_2', 'listing__discrete_booking_value_p99', 'listing__double_counted_delayed_bookings', 'listing__ds__day', @@ -421,6 +442,9 @@ 'lux_listing__listing__lux_listing__bookings_per_view', 'lux_listing__listing__lux_listing__derived_bookings_0', 'lux_listing__listing__lux_listing__derived_bookings_1', + 'lux_listing__listing__lux_listing__derived_sharedalias_1a', + 'lux_listing__listing__lux_listing__derived_sharedalias_1b', + 'lux_listing__listing__lux_listing__derived_sharedalias_2', 'lux_listing__listing__lux_listing__discrete_booking_value_p99', 'lux_listing__listing__lux_listing__double_counted_delayed_bookings', 'lux_listing__listing__lux_listing__instant_booking_fraction_of_max_value', @@ -564,6 +588,9 @@ 'user__listing__user__bookings_per_view', 'user__listing__user__derived_bookings_0', 'user__listing__user__derived_bookings_1', + 'user__listing__user__derived_sharedalias_1a', + 'user__listing__user__derived_sharedalias_1b', + 'user__listing__user__derived_sharedalias_2', 'user__listing__user__discrete_booking_value_p99', 'user__listing__user__double_counted_delayed_bookings', 'user__listing__user__instant_booking_fraction_of_max_value', diff --git a/tests_metricflow/dataflow/optimizer/source_scan/test_source_scan_optimizer.py b/tests_metricflow/dataflow/optimizer/source_scan/test_source_scan_optimizer.py index 0f45668c5f..43b1645ede 100644 --- a/tests_metricflow/dataflow/optimizer/source_scan/test_source_scan_optimizer.py +++ b/tests_metricflow/dataflow/optimizer/source_scan/test_source_scan_optimizer.py @@ -333,6 +333,60 @@ def test_derived_metric_with_non_derived_metric( ) +@pytest.mark.sql_engine_snapshot +def test_derived_metric_same_alias_components_combined( + request: FixtureRequest, + mf_test_configuration: MetricFlowTestConfiguration, + dataflow_plan_builder: DataflowPlanBuilder, +) -> None: + """Tests optimization of querying 2 metrics which give the same alias to the same thing in their components. + + In this case we DO combine source nodes, since the components are the same exact thing so we don't need to + scan over it twice + """ + check_optimization( + request=request, + mf_test_configuration=mf_test_configuration, + dataflow_plan_builder=dataflow_plan_builder, + query_spec=MetricFlowQuerySpec( + metric_specs=( + MetricSpec(element_name="derived_sharedalias_1a"), + MetricSpec(element_name="derived_sharedalias_1b"), + ), + dimension_specs=(DimensionSpec(element_name="is_instant", entity_links=(EntityReference("booking"),)),), + ), + expected_num_sources_in_unoptimized=2, + expected_num_sources_in_optimized=1, + ) + + +@pytest.mark.sql_engine_snapshot +def test_derived_metric_same_alias_components_not_combined( + request: FixtureRequest, + mf_test_configuration: MetricFlowTestConfiguration, + dataflow_plan_builder: DataflowPlanBuilder, +) -> None: + """Tests optimization of querying 2 metrics which give the same alias different things in their components. + + In this case we should NOT combine source nodes, since this would generate two columns with + the same alias. + """ + check_optimization( + request=request, + mf_test_configuration=mf_test_configuration, + dataflow_plan_builder=dataflow_plan_builder, + query_spec=MetricFlowQuerySpec( + metric_specs=( + MetricSpec(element_name="derived_sharedalias_1a"), + MetricSpec(element_name="derived_sharedalias_2"), + ), + dimension_specs=(DimensionSpec(element_name="is_instant", entity_links=(EntityReference("booking"),)),), + ), + expected_num_sources_in_unoptimized=2, + expected_num_sources_in_optimized=2, + ) + + @pytest.mark.sql_engine_snapshot def test_2_ratio_metrics_from_1_semantic_model( request: FixtureRequest, diff --git a/tests_metricflow/query_rendering/test_derived_metric_rendering.py b/tests_metricflow/query_rendering/test_derived_metric_rendering.py index 0ba001c0c2..2ded0faf00 100644 --- a/tests_metricflow/query_rendering/test_derived_metric_rendering.py +++ b/tests_metricflow/query_rendering/test_derived_metric_rendering.py @@ -795,3 +795,29 @@ def test_offset_to_grain_metric_filter_and_query_have_different_granularities( dataflow_plan_builder=dataflow_plan_builder, query_spec=query_spec, ) + + +@pytest.mark.sql_engine_snapshot +def test_derived_metric_that_defines_the_same_alias_in_different_components( + request: FixtureRequest, + mf_test_configuration: MetricFlowTestConfiguration, + dataflow_plan_builder: DataflowPlanBuilder, + query_parser: MetricFlowQueryParser, + sql_client: SqlClient, + dataflow_to_sql_converter: DataflowToSqlQueryPlanConverter, +) -> None: + """Tests querying a cumulative metric which give the same alias to its components.""" + query_spec = query_parser.parse_and_validate_query( + metric_names=("derived_sharedalias_1a", "derived_sharedalias_2"), + group_by_names=("booking__is_instant",), + limit=1, + ).query_spec + + render_and_check( + request=request, + mf_test_configuration=mf_test_configuration, + dataflow_to_sql_converter=dataflow_to_sql_converter, + sql_client=sql_client, + dataflow_plan_builder=dataflow_plan_builder, + query_spec=query_spec, + ) diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql new file mode 100644 index 0000000000..f38690d402 --- /dev/null +++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql @@ -0,0 +1,459 @@ +-- Order By [] Limit 1 +SELECT + subq_12.booking__is_instant + , subq_12.derived_sharedalias_1a + , subq_12.derived_sharedalias_2 +FROM ( + -- Combine Aggregated Outputs + SELECT + COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) AS booking__is_instant + , MAX(subq_5.derived_sharedalias_1a) AS derived_sharedalias_1a + , MAX(subq_11.derived_sharedalias_2) AS derived_sharedalias_2 + FROM ( + -- Compute Metrics via Expressions + SELECT + subq_4.booking__is_instant + , shared_alias - 10 AS derived_sharedalias_1a + FROM ( + -- Compute Metrics via Expressions + SELECT + subq_3.booking__is_instant + , subq_3.bookings AS shared_alias + FROM ( + -- Aggregate Measures + SELECT + subq_2.booking__is_instant + , SUM(subq_2.bookings) AS bookings + FROM ( + -- Pass Only Elements: ['bookings', 'booking__is_instant'] + SELECT + subq_1.booking__is_instant + , subq_1.bookings + FROM ( + -- Metric Time Dimension 'ds' + SELECT + subq_0.ds__day + , subq_0.ds__week + , subq_0.ds__month + , subq_0.ds__quarter + , subq_0.ds__year + , subq_0.ds__extract_year + , subq_0.ds__extract_quarter + , subq_0.ds__extract_month + , subq_0.ds__extract_day + , subq_0.ds__extract_dow + , subq_0.ds__extract_doy + , subq_0.ds_partitioned__day + , subq_0.ds_partitioned__week + , subq_0.ds_partitioned__month + , subq_0.ds_partitioned__quarter + , subq_0.ds_partitioned__year + , subq_0.ds_partitioned__extract_year + , subq_0.ds_partitioned__extract_quarter + , subq_0.ds_partitioned__extract_month + , subq_0.ds_partitioned__extract_day + , subq_0.ds_partitioned__extract_dow + , subq_0.ds_partitioned__extract_doy + , subq_0.paid_at__day + , subq_0.paid_at__week + , subq_0.paid_at__month + , subq_0.paid_at__quarter + , subq_0.paid_at__year + , subq_0.paid_at__extract_year + , subq_0.paid_at__extract_quarter + , subq_0.paid_at__extract_month + , subq_0.paid_at__extract_day + , subq_0.paid_at__extract_dow + , subq_0.paid_at__extract_doy + , subq_0.booking__ds__day + , subq_0.booking__ds__week + , subq_0.booking__ds__month + , subq_0.booking__ds__quarter + , subq_0.booking__ds__year + , subq_0.booking__ds__extract_year + , subq_0.booking__ds__extract_quarter + , subq_0.booking__ds__extract_month + , subq_0.booking__ds__extract_day + , subq_0.booking__ds__extract_dow + , subq_0.booking__ds__extract_doy + , subq_0.booking__ds_partitioned__day + , subq_0.booking__ds_partitioned__week + , subq_0.booking__ds_partitioned__month + , subq_0.booking__ds_partitioned__quarter + , subq_0.booking__ds_partitioned__year + , subq_0.booking__ds_partitioned__extract_year + , subq_0.booking__ds_partitioned__extract_quarter + , subq_0.booking__ds_partitioned__extract_month + , subq_0.booking__ds_partitioned__extract_day + , subq_0.booking__ds_partitioned__extract_dow + , subq_0.booking__ds_partitioned__extract_doy + , subq_0.booking__paid_at__day + , subq_0.booking__paid_at__week + , subq_0.booking__paid_at__month + , subq_0.booking__paid_at__quarter + , subq_0.booking__paid_at__year + , subq_0.booking__paid_at__extract_year + , subq_0.booking__paid_at__extract_quarter + , subq_0.booking__paid_at__extract_month + , subq_0.booking__paid_at__extract_day + , subq_0.booking__paid_at__extract_dow + , subq_0.booking__paid_at__extract_doy + , subq_0.ds__day AS metric_time__day + , subq_0.ds__week AS metric_time__week + , subq_0.ds__month AS metric_time__month + , subq_0.ds__quarter AS metric_time__quarter + , subq_0.ds__year AS metric_time__year + , subq_0.ds__extract_year AS metric_time__extract_year + , subq_0.ds__extract_quarter AS metric_time__extract_quarter + , subq_0.ds__extract_month AS metric_time__extract_month + , subq_0.ds__extract_day AS metric_time__extract_day + , subq_0.ds__extract_dow AS metric_time__extract_dow + , subq_0.ds__extract_doy AS metric_time__extract_doy + , subq_0.listing + , subq_0.guest + , subq_0.host + , subq_0.booking__listing + , subq_0.booking__guest + , subq_0.booking__host + , subq_0.is_instant + , subq_0.booking__is_instant + , subq_0.bookings + , subq_0.instant_bookings + , subq_0.booking_value + , subq_0.max_booking_value + , subq_0.min_booking_value + , subq_0.bookers + , subq_0.average_booking_value + , subq_0.referred_bookings + , subq_0.median_booking_value + , subq_0.booking_value_p99 + , subq_0.discrete_booking_value_p99 + , subq_0.approximate_continuous_booking_value_p99 + , subq_0.approximate_discrete_booking_value_p99 + FROM ( + -- Read Elements From Semantic Model 'bookings_source' + SELECT + 1 AS bookings + , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings + , bookings_source_src_28000.booking_value + , bookings_source_src_28000.booking_value AS max_booking_value + , bookings_source_src_28000.booking_value AS min_booking_value + , bookings_source_src_28000.guest_id AS bookers + , bookings_source_src_28000.booking_value AS average_booking_value + , bookings_source_src_28000.booking_value AS booking_payments + , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings + , bookings_source_src_28000.booking_value AS median_booking_value + , bookings_source_src_28000.booking_value AS booking_value_p99 + , bookings_source_src_28000.booking_value AS discrete_booking_value_p99 + , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99 + , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99 + , bookings_source_src_28000.is_instant + , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day + , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week + , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month + , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter + , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year + , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month + , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS ds__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy + , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day + , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week + , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month + , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter + , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year + , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month + , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy + , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day + , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week + , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month + , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter + , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year + , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month + , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy + , bookings_source_src_28000.is_instant AS booking__is_instant + , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day + , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week + , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month + , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter + , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year + , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month + , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy + , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day + , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week + , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month + , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter + , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year + , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month + , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy + , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day + , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week + , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month + , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter + , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year + , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month + , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy + , bookings_source_src_28000.listing_id AS listing + , bookings_source_src_28000.guest_id AS guest + , bookings_source_src_28000.host_id AS host + , bookings_source_src_28000.listing_id AS booking__listing + , bookings_source_src_28000.guest_id AS booking__guest + , bookings_source_src_28000.host_id AS booking__host + FROM ***************************.fct_bookings bookings_source_src_28000 + ) subq_0 + ) subq_1 + ) subq_2 + GROUP BY + subq_2.booking__is_instant + ) subq_3 + ) subq_4 + ) subq_5 + FULL OUTER JOIN ( + -- Compute Metrics via Expressions + SELECT + subq_10.booking__is_instant + , shared_alias + 10 AS derived_sharedalias_2 + FROM ( + -- Compute Metrics via Expressions + SELECT + subq_9.booking__is_instant + , subq_9.instant_bookings AS shared_alias + FROM ( + -- Aggregate Measures + SELECT + subq_8.booking__is_instant + , SUM(subq_8.instant_bookings) AS instant_bookings + FROM ( + -- Pass Only Elements: ['instant_bookings', 'booking__is_instant'] + SELECT + subq_7.booking__is_instant + , subq_7.instant_bookings + FROM ( + -- Metric Time Dimension 'ds' + SELECT + subq_6.ds__day + , subq_6.ds__week + , subq_6.ds__month + , subq_6.ds__quarter + , subq_6.ds__year + , subq_6.ds__extract_year + , subq_6.ds__extract_quarter + , subq_6.ds__extract_month + , subq_6.ds__extract_day + , subq_6.ds__extract_dow + , subq_6.ds__extract_doy + , subq_6.ds_partitioned__day + , subq_6.ds_partitioned__week + , subq_6.ds_partitioned__month + , subq_6.ds_partitioned__quarter + , subq_6.ds_partitioned__year + , subq_6.ds_partitioned__extract_year + , subq_6.ds_partitioned__extract_quarter + , subq_6.ds_partitioned__extract_month + , subq_6.ds_partitioned__extract_day + , subq_6.ds_partitioned__extract_dow + , subq_6.ds_partitioned__extract_doy + , subq_6.paid_at__day + , subq_6.paid_at__week + , subq_6.paid_at__month + , subq_6.paid_at__quarter + , subq_6.paid_at__year + , subq_6.paid_at__extract_year + , subq_6.paid_at__extract_quarter + , subq_6.paid_at__extract_month + , subq_6.paid_at__extract_day + , subq_6.paid_at__extract_dow + , subq_6.paid_at__extract_doy + , subq_6.booking__ds__day + , subq_6.booking__ds__week + , subq_6.booking__ds__month + , subq_6.booking__ds__quarter + , subq_6.booking__ds__year + , subq_6.booking__ds__extract_year + , subq_6.booking__ds__extract_quarter + , subq_6.booking__ds__extract_month + , subq_6.booking__ds__extract_day + , subq_6.booking__ds__extract_dow + , subq_6.booking__ds__extract_doy + , subq_6.booking__ds_partitioned__day + , subq_6.booking__ds_partitioned__week + , subq_6.booking__ds_partitioned__month + , subq_6.booking__ds_partitioned__quarter + , subq_6.booking__ds_partitioned__year + , subq_6.booking__ds_partitioned__extract_year + , subq_6.booking__ds_partitioned__extract_quarter + , subq_6.booking__ds_partitioned__extract_month + , subq_6.booking__ds_partitioned__extract_day + , subq_6.booking__ds_partitioned__extract_dow + , subq_6.booking__ds_partitioned__extract_doy + , subq_6.booking__paid_at__day + , subq_6.booking__paid_at__week + , subq_6.booking__paid_at__month + , subq_6.booking__paid_at__quarter + , subq_6.booking__paid_at__year + , subq_6.booking__paid_at__extract_year + , subq_6.booking__paid_at__extract_quarter + , subq_6.booking__paid_at__extract_month + , subq_6.booking__paid_at__extract_day + , subq_6.booking__paid_at__extract_dow + , subq_6.booking__paid_at__extract_doy + , subq_6.ds__day AS metric_time__day + , subq_6.ds__week AS metric_time__week + , subq_6.ds__month AS metric_time__month + , subq_6.ds__quarter AS metric_time__quarter + , subq_6.ds__year AS metric_time__year + , subq_6.ds__extract_year AS metric_time__extract_year + , subq_6.ds__extract_quarter AS metric_time__extract_quarter + , subq_6.ds__extract_month AS metric_time__extract_month + , subq_6.ds__extract_day AS metric_time__extract_day + , subq_6.ds__extract_dow AS metric_time__extract_dow + , subq_6.ds__extract_doy AS metric_time__extract_doy + , subq_6.listing + , subq_6.guest + , subq_6.host + , subq_6.booking__listing + , subq_6.booking__guest + , subq_6.booking__host + , subq_6.is_instant + , subq_6.booking__is_instant + , subq_6.bookings + , subq_6.instant_bookings + , subq_6.booking_value + , subq_6.max_booking_value + , subq_6.min_booking_value + , subq_6.bookers + , subq_6.average_booking_value + , subq_6.referred_bookings + , subq_6.median_booking_value + , subq_6.booking_value_p99 + , subq_6.discrete_booking_value_p99 + , subq_6.approximate_continuous_booking_value_p99 + , subq_6.approximate_discrete_booking_value_p99 + FROM ( + -- Read Elements From Semantic Model 'bookings_source' + SELECT + 1 AS bookings + , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings + , bookings_source_src_28000.booking_value + , bookings_source_src_28000.booking_value AS max_booking_value + , bookings_source_src_28000.booking_value AS min_booking_value + , bookings_source_src_28000.guest_id AS bookers + , bookings_source_src_28000.booking_value AS average_booking_value + , bookings_source_src_28000.booking_value AS booking_payments + , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings + , bookings_source_src_28000.booking_value AS median_booking_value + , bookings_source_src_28000.booking_value AS booking_value_p99 + , bookings_source_src_28000.booking_value AS discrete_booking_value_p99 + , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99 + , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99 + , bookings_source_src_28000.is_instant + , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day + , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week + , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month + , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter + , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year + , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month + , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS ds__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy + , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day + , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week + , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month + , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter + , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year + , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month + , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy + , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day + , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week + , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month + , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter + , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year + , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month + , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy + , bookings_source_src_28000.is_instant AS booking__is_instant + , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day + , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week + , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month + , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter + , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year + , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month + , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy + , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day + , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week + , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month + , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter + , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year + , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month + , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy + , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day + , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week + , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month + , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter + , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year + , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year + , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter + , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month + , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day + , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow + , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy + , bookings_source_src_28000.listing_id AS listing + , bookings_source_src_28000.guest_id AS guest + , bookings_source_src_28000.host_id AS host + , bookings_source_src_28000.listing_id AS booking__listing + , bookings_source_src_28000.guest_id AS booking__guest + , bookings_source_src_28000.host_id AS booking__host + FROM ***************************.fct_bookings bookings_source_src_28000 + ) subq_6 + ) subq_7 + ) subq_8 + GROUP BY + subq_8.booking__is_instant + ) subq_9 + ) subq_10 + ) subq_11 + ON + subq_5.booking__is_instant = subq_11.booking__is_instant + GROUP BY + COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) +) subq_12 +LIMIT 1 diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql new file mode 100644 index 0000000000..3bd096986b --- /dev/null +++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql @@ -0,0 +1,59 @@ +-- Combine Aggregated Outputs +-- Order By [] Limit 1 +SELECT + COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) AS booking__is_instant + , MAX(subq_18.derived_sharedalias_1a) AS derived_sharedalias_1a + , MAX(subq_24.derived_sharedalias_2) AS derived_sharedalias_2 +FROM ( + -- Compute Metrics via Expressions + SELECT + booking__is_instant + , shared_alias - 10 AS derived_sharedalias_1a + FROM ( + -- Aggregate Measures + -- Compute Metrics via Expressions + SELECT + booking__is_instant + , SUM(bookings) AS shared_alias + FROM ( + -- Read Elements From Semantic Model 'bookings_source' + -- Metric Time Dimension 'ds' + -- Pass Only Elements: ['bookings', 'booking__is_instant'] + SELECT + is_instant AS booking__is_instant + , 1 AS bookings + FROM ***************************.fct_bookings bookings_source_src_28000 + ) subq_15 + GROUP BY + booking__is_instant + ) subq_17 +) subq_18 +FULL OUTER JOIN ( + -- Compute Metrics via Expressions + SELECT + booking__is_instant + , shared_alias + 10 AS derived_sharedalias_2 + FROM ( + -- Aggregate Measures + -- Compute Metrics via Expressions + SELECT + booking__is_instant + , SUM(instant_bookings) AS shared_alias + FROM ( + -- Read Elements From Semantic Model 'bookings_source' + -- Metric Time Dimension 'ds' + -- Pass Only Elements: ['instant_bookings', 'booking__is_instant'] + SELECT + is_instant AS booking__is_instant + , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings + FROM ***************************.fct_bookings bookings_source_src_28000 + ) subq_21 + GROUP BY + booking__is_instant + ) subq_23 +) subq_24 +ON + subq_18.booking__is_instant = subq_24.booking__is_instant +GROUP BY + COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) +LIMIT 1 diff --git a/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfp_0.xml b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfp_0.xml new file mode 100644 index 0000000000..66e5312299 --- /dev/null +++ b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfp_0.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfpo_0.xml b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfpo_0.xml new file mode 100644 index 0000000000..bf55ae07e5 --- /dev/null +++ b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfpo_0.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfp_0.xml b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfp_0.xml new file mode 100644 index 0000000000..5a76aedf01 --- /dev/null +++ b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfp_0.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfpo_0.xml b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfpo_0.xml new file mode 100644 index 0000000000..91fd741a37 --- /dev/null +++ b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfpo_0.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +