Skip to content

Commit 09f1686

Browse files
committed
Add test and fix issues with handling reference dim links
1 parent aac97e0 commit 09f1686

File tree

6 files changed

+98
-6
lines changed

6 files changed

+98
-6
lines changed

datajunction-server/datajunction_server/api/helpers.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
build_metric_nodes,
2323
get_default_criteria,
2424
rename_columns,
25-
validate_shared_dimensions,
2625
)
2726
from datajunction_server.construction.dj_query import build_dj_query
2827
from datajunction_server.database.attributetype import AttributeType

datajunction-server/datajunction_server/api/nodes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,7 @@ async def add_reference_dimension_link(
971971
),
972972
)
973973
await session.commit()
974+
await session.refresh(target_column)
974975
return JSONResponse(
975976
status_code=201,
976977
content={

datajunction-server/datajunction_server/construction/build_v2.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,7 +1349,19 @@ def build_dimension_attribute(
13491349
if dimension_attr.name in link.foreign_keys_reversed
13501350
else None
13511351
)
1352+
reference_links = {
1353+
col.name: f"{col.dimension.name}.{col.dimension_column}"
1354+
for col in link.dimension.current.columns
1355+
if col.dimension
1356+
}
13521357
for col in node_query.select.projection:
1358+
if reference_links.get(col.alias_or_name.name) == full_column_name: # type: ignore
1359+
return ast.Column(
1360+
name=ast.Name(col.alias_or_name.name), # type: ignore
1361+
alias=ast.Name(alias) if alias else None,
1362+
_table=node_query,
1363+
_type=col.type, # type: ignore
1364+
)
13531365
if col.alias_or_name.name == dimension_attr.column_name or ( # type: ignore
13541366
foreign_key_column_name
13551367
and col.alias_or_name.identifier() == foreign_key_column_name # type: ignore

datajunction-server/datajunction_server/database/queryrequest.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,7 @@
2323
from datajunction_server.database.node import Node, NodeRevision
2424
from datajunction_server.enum import StrEnum
2525
from datajunction_server.errors import DJInvalidInputException
26-
from datajunction_server.sql.dag import (
27-
get_dimensions,
28-
get_shared_dimensions,
29-
get_upstream_nodes,
30-
)
26+
from datajunction_server.sql.dag import get_upstream_nodes
3127
from datajunction_server.sql.parsing import ast
3228
from datajunction_server.sql.parsing.backends.antlr4 import parse
3329
from datajunction_server.typing import UTCDatetime

datajunction-server/tests/api/dimension_links_test.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
105126
def 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
9681042
async def test_dimension_link_cross_join(
9691043
dimensions_link_client: AsyncClient, # pylint: disable=redefined-outer-name

datajunction-server/tests/examples.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2258,6 +2258,16 @@
22582258
"primary_key": ["country_code"],
22592259
},
22602260
),
2261+
(
2262+
"/nodes/dimension/",
2263+
{
2264+
"description": "Date dimension",
2265+
"query": """SELECT 1 AS dateint""",
2266+
"mode": "published",
2267+
"name": "default.date",
2268+
"primary_key": ["dateint"],
2269+
},
2270+
),
22612271
(
22622272
"/nodes/metric/",
22632273
{

0 commit comments

Comments
 (0)