Skip to content

Commit

Permalink
added new test and snapshot
Browse files Browse the repository at this point in the history
  • Loading branch information
WilliamDee committed Nov 16, 2023
1 parent 9edee45 commit 743cab1
Show file tree
Hide file tree
Showing 4 changed files with 1,176 additions and 0 deletions.
59 changes: 59 additions & 0 deletions metricflow/test/plan_conversion/test_dataflow_to_sql_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from metricflow.dataflow.dataflow_plan import (
AggregateMeasuresNode,
BaseOutput,
CombineAggregatedOutputsNode,
ComputeMetricsNode,
ConstrainTimeRangeNode,
DataflowPlan,
Expand Down Expand Up @@ -1011,6 +1012,64 @@ def test_compute_metrics_node_ratio_from_multiple_semantic_models(
)


@pytest.mark.sql_engine_snapshot
def test_combine_output_node( # noqa: D
request: FixtureRequest,
mf_test_session_state: MetricFlowTestSessionState,
dataflow_to_sql_converter: DataflowToSqlQueryPlanConverter,
consistent_id_object_repository: ConsistentIdObjectRepository,
sql_client: SqlClient,
) -> None:
"""Tests combining AggregateMeasuresNode."""
sum_spec = MeasureSpec(
element_name="bookings",
)
sum_boolean_spec = MeasureSpec(
element_name="instant_bookings",
)
count_distinct_spec = MeasureSpec(
element_name="bookers",
)
dimension_spec = DimensionSpec(
element_name="is_instant",
entity_links=(),
)
measure_source_node = consistent_id_object_repository.simple_model_read_nodes["bookings_source"]

# Build compute measures node
measure_specs: List[MeasureSpec] = [sum_spec]
filtered_measure_node = FilterElementsNode(
parent_node=measure_source_node,
include_specs=InstanceSpecSet(measure_specs=tuple(measure_specs), dimension_specs=(dimension_spec,)),
)
aggregated_measure_node = AggregateMeasuresNode(
parent_node=filtered_measure_node,
metric_input_measure_specs=tuple(MetricInputMeasureSpec(measure_spec=x) for x in measure_specs),
)

# Build agg measures node
measure_specs_2 = [sum_boolean_spec, count_distinct_spec]
filtered_measure_node_2 = FilterElementsNode(
parent_node=measure_source_node,
include_specs=InstanceSpecSet(measure_specs=tuple(measure_specs_2), dimension_specs=(dimension_spec,)),
)
aggregated_measure_node_2 = AggregateMeasuresNode(
parent_node=filtered_measure_node_2,
metric_input_measure_specs=tuple(
MetricInputMeasureSpec(measure_spec=x, fill_nulls_with=1) for x in measure_specs_2
),
)

combine_output_node = CombineAggregatedOutputsNode([aggregated_measure_node, aggregated_measure_node_2])
convert_and_check(
request=request,
mf_test_session_state=mf_test_session_state,
dataflow_to_sql_converter=dataflow_to_sql_converter,
sql_client=sql_client,
node=combine_output_node,
)


@pytest.mark.sql_engine_snapshot
def test_dimensions_requiring_join(
request: FixtureRequest,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
-- Combine Aggregated Outputs
SELECT
COALESCE(subq_2.is_instant, subq_5.is_instant) AS is_instant
, MAX(subq_2.bookings) AS bookings
, COALESCE(MAX(subq_5.instant_bookings), 1) AS instant_bookings
, COALESCE(MAX(subq_5.bookers), 1) AS bookers
FROM (
-- Aggregate Measures
SELECT
subq_1.is_instant
, SUM(subq_1.bookings) AS bookings
FROM (
-- Pass Only Elements:
-- ['bookings', 'is_instant']
SELECT
subq_0.is_instant
, subq_0.bookings
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_10001.booking_value
, bookings_source_src_10001.booking_value AS max_booking_value
, bookings_source_src_10001.booking_value AS min_booking_value
, bookings_source_src_10001.guest_id AS bookers
, bookings_source_src_10001.booking_value AS average_booking_value
, bookings_source_src_10001.booking_value AS booking_payments
, CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
, bookings_source_src_10001.booking_value AS median_booking_value
, bookings_source_src_10001.booking_value AS booking_value_p99
, bookings_source_src_10001.booking_value AS discrete_booking_value_p99
, bookings_source_src_10001.booking_value AS approximate_continuous_booking_value_p99
, bookings_source_src_10001.booking_value AS approximate_discrete_booking_value_p99
, bookings_source_src_10001.is_instant
, DATE_TRUNC('day', bookings_source_src_10001.ds) AS ds__day
, DATE_TRUNC('week', bookings_source_src_10001.ds) AS ds__week
, DATE_TRUNC('month', bookings_source_src_10001.ds) AS ds__month
, DATE_TRUNC('quarter', bookings_source_src_10001.ds) AS ds__quarter
, DATE_TRUNC('year', bookings_source_src_10001.ds) AS ds__year
, EXTRACT(year FROM bookings_source_src_10001.ds) AS ds__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.ds) AS ds__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.ds) AS ds__extract_month
, EXTRACT(day FROM bookings_source_src_10001.ds) AS ds__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.ds) AS ds__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.ds) AS ds__extract_doy
, DATE_TRUNC('day', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__day
, DATE_TRUNC('week', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__week
, DATE_TRUNC('month', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__month
, DATE_TRUNC('quarter', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__quarter
, DATE_TRUNC('year', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__year
, EXTRACT(year FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_month
, EXTRACT(day FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_doy
, DATE_TRUNC('day', bookings_source_src_10001.paid_at) AS paid_at__day
, DATE_TRUNC('week', bookings_source_src_10001.paid_at) AS paid_at__week
, DATE_TRUNC('month', bookings_source_src_10001.paid_at) AS paid_at__month
, DATE_TRUNC('quarter', bookings_source_src_10001.paid_at) AS paid_at__quarter
, DATE_TRUNC('year', bookings_source_src_10001.paid_at) AS paid_at__year
, EXTRACT(year FROM bookings_source_src_10001.paid_at) AS paid_at__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.paid_at) AS paid_at__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.paid_at) AS paid_at__extract_month
, EXTRACT(day FROM bookings_source_src_10001.paid_at) AS paid_at__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.paid_at) AS paid_at__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.paid_at) AS paid_at__extract_doy
, bookings_source_src_10001.is_instant AS booking__is_instant
, DATE_TRUNC('day', bookings_source_src_10001.ds) AS booking__ds__day
, DATE_TRUNC('week', bookings_source_src_10001.ds) AS booking__ds__week
, DATE_TRUNC('month', bookings_source_src_10001.ds) AS booking__ds__month
, DATE_TRUNC('quarter', bookings_source_src_10001.ds) AS booking__ds__quarter
, DATE_TRUNC('year', bookings_source_src_10001.ds) AS booking__ds__year
, EXTRACT(year FROM bookings_source_src_10001.ds) AS booking__ds__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.ds) AS booking__ds__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.ds) AS booking__ds__extract_month
, EXTRACT(day FROM bookings_source_src_10001.ds) AS booking__ds__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.ds) AS booking__ds__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.ds) AS booking__ds__extract_doy
, DATE_TRUNC('day', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__day
, DATE_TRUNC('week', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__week
, DATE_TRUNC('month', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__month
, DATE_TRUNC('quarter', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__quarter
, DATE_TRUNC('year', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__year
, EXTRACT(year FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_month
, EXTRACT(day FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_doy
, DATE_TRUNC('day', bookings_source_src_10001.paid_at) AS booking__paid_at__day
, DATE_TRUNC('week', bookings_source_src_10001.paid_at) AS booking__paid_at__week
, DATE_TRUNC('month', bookings_source_src_10001.paid_at) AS booking__paid_at__month
, DATE_TRUNC('quarter', bookings_source_src_10001.paid_at) AS booking__paid_at__quarter
, DATE_TRUNC('year', bookings_source_src_10001.paid_at) AS booking__paid_at__year
, EXTRACT(year FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_month
, EXTRACT(day FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_doy
, bookings_source_src_10001.listing_id AS listing
, bookings_source_src_10001.guest_id AS guest
, bookings_source_src_10001.host_id AS host
, bookings_source_src_10001.listing_id AS booking__listing
, bookings_source_src_10001.guest_id AS booking__guest
, bookings_source_src_10001.host_id AS booking__host
FROM ***************************.fct_bookings bookings_source_src_10001
) subq_0
) subq_1
GROUP BY
subq_1.is_instant
) subq_2
FULL OUTER JOIN (
-- Aggregate Measures
SELECT
subq_4.is_instant
, SUM(subq_4.instant_bookings) AS instant_bookings
, COUNT(DISTINCT subq_4.bookers) AS bookers
FROM (
-- Pass Only Elements:
-- ['instant_bookings', 'bookers', 'is_instant']
SELECT
subq_3.is_instant
, subq_3.instant_bookings
, subq_3.bookers
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_10001.booking_value
, bookings_source_src_10001.booking_value AS max_booking_value
, bookings_source_src_10001.booking_value AS min_booking_value
, bookings_source_src_10001.guest_id AS bookers
, bookings_source_src_10001.booking_value AS average_booking_value
, bookings_source_src_10001.booking_value AS booking_payments
, CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
, bookings_source_src_10001.booking_value AS median_booking_value
, bookings_source_src_10001.booking_value AS booking_value_p99
, bookings_source_src_10001.booking_value AS discrete_booking_value_p99
, bookings_source_src_10001.booking_value AS approximate_continuous_booking_value_p99
, bookings_source_src_10001.booking_value AS approximate_discrete_booking_value_p99
, bookings_source_src_10001.is_instant
, DATE_TRUNC('day', bookings_source_src_10001.ds) AS ds__day
, DATE_TRUNC('week', bookings_source_src_10001.ds) AS ds__week
, DATE_TRUNC('month', bookings_source_src_10001.ds) AS ds__month
, DATE_TRUNC('quarter', bookings_source_src_10001.ds) AS ds__quarter
, DATE_TRUNC('year', bookings_source_src_10001.ds) AS ds__year
, EXTRACT(year FROM bookings_source_src_10001.ds) AS ds__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.ds) AS ds__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.ds) AS ds__extract_month
, EXTRACT(day FROM bookings_source_src_10001.ds) AS ds__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.ds) AS ds__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.ds) AS ds__extract_doy
, DATE_TRUNC('day', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__day
, DATE_TRUNC('week', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__week
, DATE_TRUNC('month', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__month
, DATE_TRUNC('quarter', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__quarter
, DATE_TRUNC('year', bookings_source_src_10001.ds_partitioned) AS ds_partitioned__year
, EXTRACT(year FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_month
, EXTRACT(day FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.ds_partitioned) AS ds_partitioned__extract_doy
, DATE_TRUNC('day', bookings_source_src_10001.paid_at) AS paid_at__day
, DATE_TRUNC('week', bookings_source_src_10001.paid_at) AS paid_at__week
, DATE_TRUNC('month', bookings_source_src_10001.paid_at) AS paid_at__month
, DATE_TRUNC('quarter', bookings_source_src_10001.paid_at) AS paid_at__quarter
, DATE_TRUNC('year', bookings_source_src_10001.paid_at) AS paid_at__year
, EXTRACT(year FROM bookings_source_src_10001.paid_at) AS paid_at__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.paid_at) AS paid_at__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.paid_at) AS paid_at__extract_month
, EXTRACT(day FROM bookings_source_src_10001.paid_at) AS paid_at__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.paid_at) AS paid_at__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.paid_at) AS paid_at__extract_doy
, bookings_source_src_10001.is_instant AS booking__is_instant
, DATE_TRUNC('day', bookings_source_src_10001.ds) AS booking__ds__day
, DATE_TRUNC('week', bookings_source_src_10001.ds) AS booking__ds__week
, DATE_TRUNC('month', bookings_source_src_10001.ds) AS booking__ds__month
, DATE_TRUNC('quarter', bookings_source_src_10001.ds) AS booking__ds__quarter
, DATE_TRUNC('year', bookings_source_src_10001.ds) AS booking__ds__year
, EXTRACT(year FROM bookings_source_src_10001.ds) AS booking__ds__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.ds) AS booking__ds__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.ds) AS booking__ds__extract_month
, EXTRACT(day FROM bookings_source_src_10001.ds) AS booking__ds__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.ds) AS booking__ds__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.ds) AS booking__ds__extract_doy
, DATE_TRUNC('day', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__day
, DATE_TRUNC('week', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__week
, DATE_TRUNC('month', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__month
, DATE_TRUNC('quarter', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__quarter
, DATE_TRUNC('year', bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__year
, EXTRACT(year FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_month
, EXTRACT(day FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.ds_partitioned) AS booking__ds_partitioned__extract_doy
, DATE_TRUNC('day', bookings_source_src_10001.paid_at) AS booking__paid_at__day
, DATE_TRUNC('week', bookings_source_src_10001.paid_at) AS booking__paid_at__week
, DATE_TRUNC('month', bookings_source_src_10001.paid_at) AS booking__paid_at__month
, DATE_TRUNC('quarter', bookings_source_src_10001.paid_at) AS booking__paid_at__quarter
, DATE_TRUNC('year', bookings_source_src_10001.paid_at) AS booking__paid_at__year
, EXTRACT(year FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_year
, EXTRACT(quarter FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_quarter
, EXTRACT(month FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_month
, EXTRACT(day FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_day
, EXTRACT(isodow FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_dow
, EXTRACT(doy FROM bookings_source_src_10001.paid_at) AS booking__paid_at__extract_doy
, bookings_source_src_10001.listing_id AS listing
, bookings_source_src_10001.guest_id AS guest
, bookings_source_src_10001.host_id AS host
, bookings_source_src_10001.listing_id AS booking__listing
, bookings_source_src_10001.guest_id AS booking__guest
, bookings_source_src_10001.host_id AS booking__host
FROM ***************************.fct_bookings bookings_source_src_10001
) subq_3
) subq_4
GROUP BY
subq_4.is_instant
) subq_5
ON
subq_2.is_instant = subq_5.is_instant
GROUP BY
COALESCE(subq_2.is_instant, subq_5.is_instant)
Loading

0 comments on commit 743cab1

Please sign in to comment.