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

Test for offset metric with time constraint. #924

Closed
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,18 @@ metric:
type_params:
measure: approximate_discrete_booking_value_p99
---
metric:
name: "bookings_2_weeks_ago"
description: |
Same as bookings, but with the time offset to 2 weeks ago for comparison.
type: derived
type_params:
expr: bookings_2_weeks_ago
metrics:
- name: bookings
offset_window: 14 days
alias: bookings_2_weeks_ago
---
metric:
name: "bookings_growth_2_weeks"
description: |
Expand All @@ -456,9 +468,7 @@ metric:
expr: bookings - bookings_2_weeks_ago
metrics:
- name: bookings
- name: bookings
offset_window: 14 days
alias: bookings_2_weeks_ago
- name: bookings_2_weeks_ago
---
metric:
name: "bookings_growth_since_start_of_month"
Expand Down
43 changes: 43 additions & 0 deletions metricflow/test/query_rendering/test_offset_metrics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from __future__ import annotations

import pytest
from _pytest.fixtures import FixtureRequest
from dbt_semantic_interfaces.test_utils import as_datetime
from dbt_semantic_interfaces.type_enums import TimeGranularity

from metricflow.dataflow.builder.dataflow_plan_builder import DataflowPlanBuilder
from metricflow.dataset.dataset import DataSet
from metricflow.filters.time_constraint import TimeRangeConstraint
from metricflow.plan_conversion.dataflow_to_sql import DataflowToSqlQueryPlanConverter
from metricflow.protocols.sql_client import SqlClient
from metricflow.specs.specs import MetricFlowQuerySpec, MetricSpec
from metricflow.test.fixtures.setup_fixtures import MetricFlowTestSessionState
from metricflow.test.plan_conversion.test_dataflow_to_sql_plan import convert_and_check


@pytest.mark.sql_engine_snapshot
def test_offset_metric_with_time_constraint( # noqa: D
request: FixtureRequest,
mf_test_session_state: MetricFlowTestSessionState,
dataflow_plan_builder: DataflowPlanBuilder,
dataflow_to_sql_converter: DataflowToSqlQueryPlanConverter,
sql_client: SqlClient,
) -> None:
"""Tests converting a PlotTimeDimensionTransform node using the primary time dimension to SQL."""
dataflow_plan = dataflow_plan_builder.build_plan(
MetricFlowQuerySpec(
metric_specs=(MetricSpec(element_name="bookings_2_weeks_ago"),),
time_dimension_specs=(DataSet.metric_time_dimension_spec(time_granularity=TimeGranularity.DAY),),
time_range_constraint=TimeRangeConstraint(
start_time=as_datetime("2020-01-01"),
end_time=as_datetime("2020-01-01"),
)
)
)
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=dataflow_plan.sink_output_node.parent_node,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
-- Compute Metrics via Expressions
SELECT
metric_time__day
, bookings_2_weeks_ago AS bookings_2_weeks_ago
FROM (
-- Join to Time Spine Dataset
-- Pass Only Elements:
-- ['bookings', 'metric_time__day']
-- Aggregate Measures
-- Compute Metrics via Expressions
SELECT
subq_12.metric_time__day AS metric_time__day
, SUM(subq_11.bookings) AS bookings_2_weeks_ago
FROM (
-- Date Spine
SELECT
ds AS metric_time__day
FROM ***************************.mf_time_spine subq_13
WHERE ds BETWEEN '2020-01-01' AND '2020-01-01'
) subq_12
INNER JOIN (
-- Read Elements From Semantic Model 'bookings_source'
-- Metric Time Dimension 'ds'
-- Constrain Time Range to [2020-01-01T00:00:00, 2020-01-01T00:00:00]
SELECT
DATE_TRUNC('day', ds) AS metric_time__day
, 1 AS bookings
FROM ***************************.fct_bookings bookings_source_src_10001
WHERE DATE_TRUNC('day', ds) BETWEEN '2020-01-01' AND '2020-01-01'
) subq_11
ON
subq_12.metric_time__day - INTERVAL 14 day = subq_11.metric_time__day
GROUP BY
subq_12.metric_time__day
) subq_17
Loading