Skip to content

Commit

Permalink
commit to show snapshots (to revert this commit after renaming node a…
Browse files Browse the repository at this point in the history
…fter PR review)
  • Loading branch information
WilliamDee committed Nov 15, 2023
1 parent 04cd29d commit c117e8e
Show file tree
Hide file tree
Showing 4 changed files with 1,177 additions and 0 deletions.
60 changes: 60 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,
CombineMetricsNode,
ComputeMetricsNode,
ConstrainTimeRangeNode,
DataflowPlan,
Expand Down Expand Up @@ -1003,3 +1004,62 @@ def test_compute_metrics_node_ratio_from_multiple_semantic_models(
sql_client=sql_client,
node=dataflow_plan.sink_output_nodes[0].parent_node,
)


@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 = CombineMetricsNode([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,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
-- Combine Metrics
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 c117e8e

Please sign in to comment.