Skip to content

Commit

Permalink
Add tests for join_to_timespine metrics with custom grain in the grou…
Browse files Browse the repository at this point in the history
…p by
  • Loading branch information
courtneyholcomb committed Nov 4, 2024
1 parent aaad04c commit 3d862c3
Show file tree
Hide file tree
Showing 4 changed files with 324 additions and 0 deletions.
21 changes: 21 additions & 0 deletions tests_metricflow/integration/test_cases/itest_granularity.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -934,3 +934,24 @@ integration_test:
ON subq_11.user = subq_14.user AND subq_11.ds__day <= subq_14.ds__day
) subq_15
) subq_18
---
integration_test:
name: test_join_to_time_spine_metric_grouped_by_custom_grain
description: Test a join to time spine metric with custom grain in group by
model: SIMPLE_MODEL
metrics: ["bookings_join_to_time_spine"]
group_bys: ["metric_time__martian_day"]
check_query: |
SELECT
subq_7.martian_day AS metric_time__martian_day
, subq_5.bookings AS bookings_join_to_time_spine
FROM {{ source_schema }}.mf_time_spine subq_7
LEFT OUTER JOIN (
SELECT
subq_2.martian_day AS metric_time__martian_day
, SUM(1) AS bookings
FROM {{ source_schema }}.fct_bookings b
LEFT OUTER JOIN {{ source_schema }}.mf_time_spine subq_2 ON DATE_TRUNC('day', b.ds) = subq_2.ds
GROUP BY subq_2.martian_day
) subq_5
ON subq_7.martian_day = subq_5.metric_time__martian_day
24 changes: 24 additions & 0 deletions tests_metricflow/query_rendering/test_custom_granularity.py
Original file line number Diff line number Diff line change
Expand Up @@ -532,3 +532,27 @@ def test_conversion_metric_with_custom_granularity_filter_not_in_group_by( # no
dataflow_plan_builder=dataflow_plan_builder,
query_spec=query_spec,
)


@pytest.mark.sql_engine_snapshot
def test_join_to_time_spine_metric_grouped_by_custom_grain( # noqa: D103
request: FixtureRequest,
mf_test_configuration: MetricFlowTestConfiguration,
dataflow_plan_builder: DataflowPlanBuilder,
dataflow_to_sql_converter: DataflowToSqlQueryPlanConverter,
sql_client: SqlClient,
query_parser: MetricFlowQueryParser,
) -> None:
query_spec = query_parser.parse_and_validate_query(
metric_names=("bookings_join_to_time_spine",),
group_by_names=("metric_time__martian_day",),
).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,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
-- Compute Metrics via Expressions
SELECT
subq_8.metric_time__martian_day
, subq_8.bookings AS bookings_join_to_time_spine
FROM (
-- Join to Time Spine Dataset
SELECT
subq_6.metric_time__martian_day AS metric_time__martian_day
, subq_5.bookings AS bookings
FROM (
-- Time Spine
SELECT
subq_7.martian_day AS metric_time__martian_day
FROM ***************************.mf_time_spine subq_7
GROUP BY
subq_7.martian_day
) subq_6
LEFT OUTER JOIN (
-- Aggregate Measures
SELECT
subq_4.metric_time__martian_day
, SUM(subq_4.bookings) AS bookings
FROM (
-- Pass Only Elements: ['bookings', 'metric_time__martian_day']
SELECT
subq_3.metric_time__martian_day
, subq_3.bookings
FROM (
-- Pass Only Elements: ['bookings', 'metric_time__day']
-- Join to Custom Granularity Dataset
SELECT
subq_1.metric_time__day AS metric_time__day
, subq_1.bookings AS bookings
, subq_2.martian_day AS metric_time__martian_day
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
LEFT OUTER JOIN
***************************.mf_time_spine subq_2
ON
subq_1.metric_time__day = subq_2.ds
) subq_3
) subq_4
GROUP BY
subq_4.metric_time__martian_day
) subq_5
ON
subq_6.metric_time__martian_day = subq_5.metric_time__martian_day
) subq_8
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
-- Join to Time Spine Dataset
-- Compute Metrics via Expressions
SELECT
subq_15.metric_time__martian_day AS metric_time__martian_day
, subq_14.bookings AS bookings_join_to_time_spine
FROM (
-- Time Spine
SELECT
martian_day AS metric_time__martian_day
FROM ***************************.mf_time_spine subq_16
GROUP BY
martian_day
) subq_15
LEFT OUTER JOIN (
-- Pass Only Elements: ['bookings', 'metric_time__day']
-- Join to Custom Granularity Dataset
-- Pass Only Elements: ['bookings', 'metric_time__martian_day']
-- Aggregate Measures
SELECT
subq_11.martian_day AS metric_time__martian_day
, SUM(subq_10.bookings) AS bookings
FROM (
-- Read Elements From Semantic Model 'bookings_source'
-- Metric Time Dimension 'ds'
SELECT
DATE_TRUNC('day', ds) AS metric_time__day
, 1 AS bookings
FROM ***************************.fct_bookings bookings_source_src_28000
) subq_10
LEFT OUTER JOIN
***************************.mf_time_spine subq_11
ON
subq_10.metric_time__day = subq_11.ds
GROUP BY
subq_11.martian_day
) subq_14
ON
subq_15.metric_time__martian_day = subq_14.metric_time__martian_day

0 comments on commit 3d862c3

Please sign in to comment.