Skip to content

Commit

Permalink
Write tests for no-metric queries
Browse files Browse the repository at this point in the history
  • Loading branch information
courtneyholcomb committed Sep 18, 2024
1 parent 1864254 commit a418422
Show file tree
Hide file tree
Showing 7 changed files with 723 additions and 0 deletions.
76 changes: 76 additions & 0 deletions tests_metricflow/query_rendering/test_custom_granularity.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,79 @@ def test_metric_custom_granularity_joined_to_non_default_grain( # noqa: D103
dataflow_plan_builder=dataflow_plan_builder,
query_spec=query_spec,
)


@pytest.mark.sql_engine_snapshot
def test_no_metric_custom_granularity_non_metric_time( # noqa: D103
request: FixtureRequest,
mf_test_configuration: MetricFlowTestConfiguration,
dataflow_plan_builder: DataflowPlanBuilder,
dataflow_to_sql_converter: DataflowToSqlQueryPlanConverter,
sql_client: SqlClient,
) -> None:
query_spec = MetricFlowQuerySpec(
time_dimension_specs=(normal_time_dim_with_custom_grain1,),
)

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,
)


@pytest.mark.sql_engine_snapshot
def test_no_metric_custom_granularity_joined_to_non_default_grain( # noqa: D103
request: FixtureRequest,
mf_test_configuration: MetricFlowTestConfiguration,
dataflow_plan_builder: DataflowPlanBuilder,
dataflow_to_sql_converter: DataflowToSqlQueryPlanConverter,
sql_client: SqlClient,
) -> None:
query_spec = MetricFlowQuerySpec(
time_dimension_specs=(
MTD_SPEC_DAY,
metric_time_with_custom_grain,
normal_time_dim_with_custom_grain2,
TimeDimensionSpec(
element_name="bio_added_ts",
time_granularity=ExpandedTimeGranularity.from_time_granularity(TimeGranularity.MONTH),
entity_links=(EntityReference("user"),),
),
),
)

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,
)


# TODO: Fix bug in this scenario. In optimized SQL, subq_3 alias is used but never defined.
@pytest.mark.sql_engine_snapshot
def test_no_metric_custom_granularity_metric_time( # noqa: D103
request: FixtureRequest,
mf_test_configuration: MetricFlowTestConfiguration,
dataflow_plan_builder: DataflowPlanBuilder,
dataflow_to_sql_converter: DataflowToSqlQueryPlanConverter,
sql_client: SqlClient,
) -> None:
query_spec = MetricFlowQuerySpec(
time_dimension_specs=(metric_time_with_custom_grain,),
)

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,
)

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
-- Join to Custom Granularity Dataset
-- Join to Custom Granularity Dataset
-- Join Standard Outputs
-- Pass Only Elements: ['metric_time__day', 'metric_time__martian_day', 'user__bio_added_ts__martian_day', 'user__bio_added_ts__month']
SELECT
subq_12.martian_day AS user__bio_added_ts__martian_day
, subq_11.martian_day AS metric_time__martian_day
, DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__month
, DATE_TRUNC('day', time_spine_src_28006.ds) AS metric_time__day
FROM ***************************.dim_users users_ds_source_src_28000
CROSS JOIN
***************************.mf_time_spine time_spine_src_28006
LEFT OUTER JOIN
***************************.mf_time_spine subq_11
ON
subq_7.metric_time__day = subq_11.ds
LEFT OUTER JOIN
***************************.mf_time_spine subq_12
ON
DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) = subq_12.ds
GROUP BY
subq_12.martian_day
, subq_11.martian_day
, DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts)
, DATE_TRUNC('day', time_spine_src_28006.ds)
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
-- Pass Only Elements: ['metric_time__martian_day',]
SELECT
subq_2.metric_time__martian_day
FROM (
-- Join to Custom Granularity Dataset
-- Metric Time Dimension 'ds'
SELECT
subq_0.ds__day AS ds__day
, subq_0.ds__week AS ds__week
, subq_0.ds__month AS ds__month
, subq_0.ds__quarter AS ds__quarter
, subq_0.ds__year AS ds__year
, subq_0.ds__extract_year AS ds__extract_year
, subq_0.ds__extract_quarter AS ds__extract_quarter
, subq_0.ds__extract_month AS ds__extract_month
, subq_0.ds__extract_day AS ds__extract_day
, subq_0.ds__extract_dow AS ds__extract_dow
, subq_0.ds__extract_doy AS ds__extract_doy
, subq_0.ds__martian_day AS ds__martian_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.ds__martian_day AS metric_time__martian_day
, subq_1.martian_day AS metric_time__martian_day
FROM (
-- Time Spine
SELECT
DATE_TRUNC('day', time_spine_src_28006.ds) AS ds__day
, DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week
, DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month
, DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter
, DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year
, EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year
, EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter
, EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month
, EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day
, EXTRACT(isodow FROM time_spine_src_28006.ds) AS ds__extract_dow
, EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy
, time_spine_src_28006.martian_day AS ds__martian_day
FROM ***************************.mf_time_spine time_spine_src_28006
) subq_0
LEFT OUTER JOIN
***************************.mf_time_spine subq_1
ON
subq_0.metric_time__day = subq_1.ds
) subq_2
GROUP BY
subq_2.metric_time__martian_day
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- Join to Custom Granularity Dataset
-- Metric Time Dimension 'ds'
-- Pass Only Elements: ['metric_time__martian_day',]
SELECT
subq_4.martian_day AS metric_time__martian_day
FROM ***************************.mf_time_spine time_spine_src_28006
LEFT OUTER JOIN
***************************.mf_time_spine subq_4
ON
subq_3.metric_time__day = subq_4.ds
GROUP BY
subq_4.martian_day
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
-- Pass Only Elements: ['booking__ds__martian_day',]
SELECT
subq_1.booking__ds__martian_day
FROM (
-- Join to Custom Granularity Dataset
-- 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 AS 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 AS 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('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
, subq_0.martian_day AS booking__ds__martian_day
FROM ***************************.fct_bookings bookings_source_src_28000
LEFT OUTER JOIN
***************************.mf_time_spine subq_0
ON
bookings_source_src_28000.booking__ds__day = subq_0.ds
) subq_1
GROUP BY
subq_1.booking__ds__martian_day
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- Join to Custom Granularity Dataset
-- Read Elements From Semantic Model 'bookings_source'
-- Pass Only Elements: ['booking__ds__martian_day',]
SELECT
subq_2.martian_day AS booking__ds__martian_day
FROM ***************************.fct_bookings bookings_source_src_28000
LEFT OUTER JOIN
***************************.mf_time_spine subq_2
ON
bookings_source_src_28000.booking__ds__day = subq_2.ds
GROUP BY
subq_2.martian_day

0 comments on commit a418422

Please sign in to comment.