Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQL rendering tests for no-metric queries with custom granularity #1411

Merged
merged 2 commits into from
Sep 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions tests_metricflow/query_rendering/test_custom_granularity.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from metricflow_semantics.specs.query_spec import MetricFlowQuerySpec
from metricflow_semantics.specs.time_dimension_spec import TimeDimensionSpec
from metricflow_semantics.test_helpers.config_helpers import MetricFlowTestConfiguration
from metricflow_semantics.test_helpers.metric_time_dimension import MTD_SPEC_DAY
from metricflow_semantics.time.granularity import ExpandedTimeGranularity

from metricflow.dataflow.builder.dataflow_plan_builder import DataflowPlanBuilder
Expand Down Expand Up @@ -161,3 +162,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 Standard Outputs
-- Join to Custom Granularity Dataset
-- Join to Custom Granularity Dataset
-- 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
, DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, month) AS user__bio_added_ts__month
, DATETIME_TRUNC(time_spine_src_28006.ds, day) 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
DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, day) = subq_12.ds
GROUP BY
user__bio_added_ts__martian_day
, metric_time__martian_day
, user__bio_added_ts__month
, metric_time__day
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
-- Pass Only Elements: ['metric_time__martian_day',]
SELECT
subq_2.metric_time__martian_day
FROM (
-- Metric Time Dimension 'ds'
-- Join to Custom Granularity Dataset
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__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.ds__martian_day AS metric_time__martian_day
, subq_1.martian_day AS metric_time__martian_day
FROM (
-- Time Spine
SELECT
DATETIME_TRUNC(time_spine_src_28006.ds, day) AS ds__day
, DATETIME_TRUNC(time_spine_src_28006.ds, isoweek) AS ds__week
, DATETIME_TRUNC(time_spine_src_28006.ds, month) AS ds__month
, DATETIME_TRUNC(time_spine_src_28006.ds, quarter) AS ds__quarter
, DATETIME_TRUNC(time_spine_src_28006.ds, year) 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
, IF(EXTRACT(dayofweek FROM time_spine_src_28006.ds) = 1, 7, EXTRACT(dayofweek FROM time_spine_src_28006.ds) - 1) AS ds__extract_dow
, EXTRACT(dayofyear 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
metric_time__martian_day
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- Metric Time Dimension 'ds'
-- Join to Custom Granularity Dataset
-- 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
metric_time__martian_day
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
-- Pass Only Elements: ['booking__ds__martian_day',]
SELECT
subq_1.booking__ds__martian_day
FROM (
-- Read Elements From Semantic Model 'bookings_source'
-- Join to Custom Granularity Dataset
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
, DATETIME_TRUNC(bookings_source_src_28000.ds, day) AS ds__day
, DATETIME_TRUNC(bookings_source_src_28000.ds, isoweek) AS ds__week
, DATETIME_TRUNC(bookings_source_src_28000.ds, month) AS ds__month
, DATETIME_TRUNC(bookings_source_src_28000.ds, quarter) AS ds__quarter
, DATETIME_TRUNC(bookings_source_src_28000.ds, year) 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
, IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds) - 1) AS ds__extract_dow
, EXTRACT(dayofyear FROM bookings_source_src_28000.ds) AS ds__extract_doy
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, day) AS ds_partitioned__day
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, isoweek) AS ds_partitioned__week
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, month) AS ds_partitioned__month
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, quarter) AS ds_partitioned__quarter
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, year) 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
, IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) - 1) AS ds_partitioned__extract_dow
, EXTRACT(dayofyear FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, day) AS paid_at__day
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, isoweek) AS paid_at__week
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, month) AS paid_at__month
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, quarter) AS paid_at__quarter
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, year) 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
, IF(EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) - 1) AS paid_at__extract_dow
, EXTRACT(dayofyear FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
, bookings_source_src_28000.is_instant AS booking__is_instant
, DATETIME_TRUNC(bookings_source_src_28000.ds, day) AS booking__ds__day
, DATETIME_TRUNC(bookings_source_src_28000.ds, isoweek) AS booking__ds__week
, DATETIME_TRUNC(bookings_source_src_28000.ds, month) AS booking__ds__month
, DATETIME_TRUNC(bookings_source_src_28000.ds, quarter) AS booking__ds__quarter
, DATETIME_TRUNC(bookings_source_src_28000.ds, year) 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
, IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds) - 1) AS booking__ds__extract_dow
, EXTRACT(dayofyear FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, day) AS booking__ds_partitioned__day
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, isoweek) AS booking__ds_partitioned__week
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, month) AS booking__ds_partitioned__month
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, quarter) AS booking__ds_partitioned__quarter
, DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, year) 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
, IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) - 1) AS booking__ds_partitioned__extract_dow
, EXTRACT(dayofyear FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, day) AS booking__paid_at__day
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, isoweek) AS booking__paid_at__week
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, month) AS booking__paid_at__month
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, quarter) AS booking__paid_at__quarter
, DATETIME_TRUNC(bookings_source_src_28000.paid_at, year) 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
, IF(EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) - 1) AS booking__paid_at__extract_dow
, EXTRACT(dayofyear 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
booking__ds__martian_day
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- Read Elements From Semantic Model 'bookings_source'
-- Join to Custom Granularity Dataset
-- 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
booking__ds__martian_day
Loading
Loading