@@ -101,6 +101,27 @@ async def _link_events_to_users_without_role() -> Response:
101101 return _link_events_to_users_without_role
102102
103103
104+ @pytest .fixture
105+ def reference_link_users_date (
106+ dimensions_link_client : AsyncClient , # pylint: disable=redefined-outer-name
107+ ):
108+ """
109+ Create a reference link between users and date
110+ """
111+
112+ async def _reference_link_users_date () -> Response :
113+ response = await dimensions_link_client .post (
114+ "/nodes/default.users/columns/snapshot_date/link" ,
115+ params = {
116+ "dimension_node" : "default.date" ,
117+ "dimension_column" : "dateint" ,
118+ },
119+ )
120+ return response
121+
122+ return _reference_link_users_date
123+
124+
104125@pytest .fixture
105126def link_events_to_users_with_role_direct (
106127 dimensions_link_client : AsyncClient , # pylint: disable=redefined-outer-name
@@ -964,6 +985,59 @@ async def test_measures_sql_with_reference_dimension_links(
964985 assert response_data [0 ]["errors" ] == []
965986
966987
988+ @pytest .mark .asyncio
989+ async def test_measures_sql_with_ref_link_on_dim_node (
990+ dimensions_link_client : AsyncClient , # pylint: disable=redefined-outer-name
991+ link_events_to_users_without_role , # pylint: disable=redefined-outer-name
992+ reference_link_users_date , # pylint: disable=redefined-outer-name
993+ ):
994+ """
995+ Verify that measures SQL can be retrieved for dimension attributes that come from a
996+ reference dimension link from one dim node to another dim node.
997+ """
998+ await link_events_to_users_without_role ()
999+ await reference_link_users_date ()
1000+
1001+ response = await dimensions_link_client .get (
1002+ "/sql/measures/v2" ,
1003+ params = {
1004+ "metrics" : ["default.elapsed_secs" ],
1005+ "dimensions" : [
1006+ "default.date.dateint" ,
1007+ ],
1008+ },
1009+ )
1010+ response_data = response .json ()
1011+ expected_sql = """
1012+ WITH default_DOT_events AS (
1013+ SELECT
1014+ default_DOT_events_table.user_id,
1015+ default_DOT_events_table.event_start_date,
1016+ default_DOT_events_table.event_end_date,
1017+ default_DOT_events_table.elapsed_secs,
1018+ default_DOT_events_table.user_registration_country
1019+ FROM examples.events AS default_DOT_events_table
1020+ ),
1021+ default_DOT_users AS (
1022+ SELECT
1023+ default_DOT_users_table.user_id,
1024+ default_DOT_users_table.snapshot_date,
1025+ default_DOT_users_table.registration_country,
1026+ default_DOT_users_table.residence_country,
1027+ default_DOT_users_table.account_type
1028+ FROM examples.users AS default_DOT_users_table
1029+ )
1030+ SELECT
1031+ default_DOT_events.elapsed_secs default_DOT_events_DOT_elapsed_secs,
1032+ default_DOT_users.snapshot_date default_DOT_date_DOT_dateint
1033+ FROM default_DOT_events
1034+ LEFT JOIN default_DOT_users
1035+ ON default_DOT_events.user_id = default_DOT_users.user_id
1036+ AND default_DOT_events.event_start_date = default_DOT_users.snapshot_date
1037+ """
1038+ assert str (parse (response_data [0 ]["sql" ])) == str (parse (expected_sql ))
1039+
1040+
9671041@pytest .mark .asyncio
9681042async def test_dimension_link_cross_join (
9691043 dimensions_link_client : AsyncClient , # pylint: disable=redefined-outer-name
0 commit comments