From b87b17e98a1bbc3ba9fca3b4d5103c8cbcfa26bb Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Mon, 9 Dec 2024 20:15:09 -0800 Subject: [PATCH 1/9] support using reference links on dimension nodes in sql building --- .../datajunction_server/api/helpers.py | 10 +-- .../datajunction_server/api/sql.py | 73 ++++++++++--------- .../construction/build_v2.py | 11 +++ .../datajunction_server/models/node.py | 2 +- 4 files changed, 54 insertions(+), 42 deletions(-) diff --git a/datajunction-server/datajunction_server/api/helpers.py b/datajunction-server/datajunction_server/api/helpers.py index 55ce37eca..94fc9c207 100644 --- a/datajunction-server/datajunction_server/api/helpers.py +++ b/datajunction-server/datajunction_server/api/helpers.py @@ -498,11 +498,11 @@ async def validate_cube( # pylint: disable=too-many-locals message=("Metrics and dimensions must be part of a common catalog"), ) - await validate_shared_dimensions( - session, - metric_nodes, - dimension_names, - ) + # await validate_shared_dimensions( + # session, + # metric_nodes, + # dimension_names, + # ) return metrics, metric_nodes, list(dimension_nodes.values()), dimensions, catalog diff --git a/datajunction-server/datajunction_server/api/sql.py b/datajunction-server/datajunction_server/api/sql.py index e86cc0e73..d9df4e9f6 100644 --- a/datajunction-server/datajunction_server/api/sql.py +++ b/datajunction-server/datajunction_server/api/sql.py @@ -402,43 +402,44 @@ async def get_sql_for_metrics( # pylint: disable=too-many-locals http_status_code=HTTPStatus.UNPROCESSABLE_ENTITY, ) - if query_request := await QueryRequest.get_query_request( - session, - nodes=metrics, - dimensions=dimensions, - filters=filters, - orderby=orderby, - limit=limit, - engine_name=engine_name, - engine_version=engine_version, - query_type=QueryBuildType.METRICS, - ): - # Update the node SQL in a background task to keep it up-to-date - background_tasks.add_task( - build_and_save_sql_for_metrics, - session=session, - metrics=metrics, - dimensions=dimensions, - filters=filters, - orderby=orderby, - limit=limit, - engine_name=engine_name, - engine_version=engine_version, - access_control=access_control, - ignore_errors=ignore_errors, - use_materialized=use_materialized, - ) - engine = ( - await get_engine(session, engine_name, engine_version) # type: ignore - if engine_name - else None - ) - return TranslatedSQL( - sql=query_request.query, - columns=query_request.columns, - dialect=engine.dialect if engine else None, - ) + # if query_request := await QueryRequest.get_query_request( + # session, + # nodes=metrics, + # dimensions=dimensions, + # filters=filters, + # orderby=orderby, + # limit=limit, + # engine_name=engine_name, + # engine_version=engine_version, + # query_type=QueryBuildType.METRICS, + # ): + # # Update the node SQL in a background task to keep it up-to-date + # background_tasks.add_task( + # build_and_save_sql_for_metrics, + # session=session, + # metrics=metrics, + # dimensions=dimensions, + # filters=filters, + # orderby=orderby, + # limit=limit, + # engine_name=engine_name, + # engine_version=engine_version, + # access_control=access_control, + # ignore_errors=ignore_errors, + # use_materialized=use_materialized, + # ) + # engine = ( + # await get_engine(session, engine_name, engine_version) # type: ignore + # if engine_name + # else None + # ) + # return TranslatedSQL( + # sql=query_request.query, + # columns=query_request.columns, + # dialect=engine.dialect if engine else None, + # ) + print("build", metrics) return await build_and_save_sql_for_metrics( session, metrics, diff --git a/datajunction-server/datajunction_server/construction/build_v2.py b/datajunction-server/datajunction_server/construction/build_v2.py index 2f140c2d1..4e55c3f9b 100644 --- a/datajunction-server/datajunction_server/construction/build_v2.py +++ b/datajunction-server/datajunction_server/construction/build_v2.py @@ -1275,6 +1275,17 @@ async def dimension_join_path( return join_path await refresh_if_needed(session, current_link.dimension, ["current"]) + + # Check the reference links on this dimension node + await refresh_if_needed(session, current_link.dimension.current, ["columns"]) + for col in current_link.dimension.current.columns: + if ( + col.dimension + and f"{col.dimension.name}.{col.dimension_column}" == dimension + ): + print("matched", col.dimension.name, col.dimension_column) + return join_path + await refresh_if_needed( session, current_link.dimension.current, diff --git a/datajunction-server/datajunction_server/models/node.py b/datajunction-server/datajunction_server/models/node.py index f18c06d35..a5ba4b075 100644 --- a/datajunction-server/datajunction_server/models/node.py +++ b/datajunction-server/datajunction_server/models/node.py @@ -591,8 +591,8 @@ class ColumnOutput(BaseModel): type: str attributes: Optional[List[AttributeOutput]] dimension: Optional[NodeNameOutput] + dimension_column: Optional[str] partition: Optional[PartitionOutput] - # order: Optional[int] class Config: # pylint: disable=missing-class-docstring, too-few-public-methods """ From 313b9d586d8d03f0970b70c0d0a72983c866638d Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Mon, 9 Dec 2024 21:00:13 -0800 Subject: [PATCH 2/9] Fix --- .../datajunction_server/api/sql.py | 73 +++++++++---------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/datajunction-server/datajunction_server/api/sql.py b/datajunction-server/datajunction_server/api/sql.py index d9df4e9f6..e86cc0e73 100644 --- a/datajunction-server/datajunction_server/api/sql.py +++ b/datajunction-server/datajunction_server/api/sql.py @@ -402,44 +402,43 @@ async def get_sql_for_metrics( # pylint: disable=too-many-locals http_status_code=HTTPStatus.UNPROCESSABLE_ENTITY, ) - # if query_request := await QueryRequest.get_query_request( - # session, - # nodes=metrics, - # dimensions=dimensions, - # filters=filters, - # orderby=orderby, - # limit=limit, - # engine_name=engine_name, - # engine_version=engine_version, - # query_type=QueryBuildType.METRICS, - # ): - # # Update the node SQL in a background task to keep it up-to-date - # background_tasks.add_task( - # build_and_save_sql_for_metrics, - # session=session, - # metrics=metrics, - # dimensions=dimensions, - # filters=filters, - # orderby=orderby, - # limit=limit, - # engine_name=engine_name, - # engine_version=engine_version, - # access_control=access_control, - # ignore_errors=ignore_errors, - # use_materialized=use_materialized, - # ) - # engine = ( - # await get_engine(session, engine_name, engine_version) # type: ignore - # if engine_name - # else None - # ) - # return TranslatedSQL( - # sql=query_request.query, - # columns=query_request.columns, - # dialect=engine.dialect if engine else None, - # ) + if query_request := await QueryRequest.get_query_request( + session, + nodes=metrics, + dimensions=dimensions, + filters=filters, + orderby=orderby, + limit=limit, + engine_name=engine_name, + engine_version=engine_version, + query_type=QueryBuildType.METRICS, + ): + # Update the node SQL in a background task to keep it up-to-date + background_tasks.add_task( + build_and_save_sql_for_metrics, + session=session, + metrics=metrics, + dimensions=dimensions, + filters=filters, + orderby=orderby, + limit=limit, + engine_name=engine_name, + engine_version=engine_version, + access_control=access_control, + ignore_errors=ignore_errors, + use_materialized=use_materialized, + ) + engine = ( + await get_engine(session, engine_name, engine_version) # type: ignore + if engine_name + else None + ) + return TranslatedSQL( + sql=query_request.query, + columns=query_request.columns, + dialect=engine.dialect if engine else None, + ) - print("build", metrics) return await build_and_save_sql_for_metrics( session, metrics, From 1f1d0c86e4c3e34f137299c365cc161c915c41e1 Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Mon, 9 Dec 2024 21:03:50 -0800 Subject: [PATCH 3/9] Remove dimensions validation check for sql building --- .../database/queryrequest.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/datajunction-server/datajunction_server/database/queryrequest.py b/datajunction-server/datajunction_server/database/queryrequest.py index 745daee4a..92cbd68fb 100644 --- a/datajunction-server/datajunction_server/database/queryrequest.py +++ b/datajunction-server/datajunction_server/database/queryrequest.py @@ -308,25 +308,6 @@ async def to_versioned_query_request( # pylint: disable=too-many-locals message="At least one metric is required", http_status_code=HTTPStatus.UNPROCESSABLE_ENTITY, ) - node_columns = [] - if len(nodes_objs) == 1: - node_columns = [col.name for col in nodes_objs[0].current.columns] # type: ignore - available_dimensions = { - dim.name - for dim in ( - await get_dimensions(session, nodes_objs[0]) # type: ignore - if len(nodes_objs) == 1 - else await get_shared_dimensions(session, nodes_objs) # type: ignore - ) - }.union(set(node_columns)) - invalid_dimensions = sorted( - list(set(dimensions).difference(available_dimensions)), - ) - if dimensions and invalid_dimensions: - raise DJInvalidInputException( - f"{', '.join(invalid_dimensions)} are not available " - f"dimensions on {', '.join(nodes)}", - ) dimension_nodes = [ await Node.get_by_name(session, ".".join(dim.split(".")[:-1]), options=[]) From b9f2d2a523787a57c339bc4eb43d4d33bc768949 Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Mon, 9 Dec 2024 21:04:32 -0800 Subject: [PATCH 4/9] Remove dimensions validation check for sql building --- datajunction-server/datajunction_server/api/helpers.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/datajunction-server/datajunction_server/api/helpers.py b/datajunction-server/datajunction_server/api/helpers.py index 94fc9c207..19fd2f500 100644 --- a/datajunction-server/datajunction_server/api/helpers.py +++ b/datajunction-server/datajunction_server/api/helpers.py @@ -498,11 +498,6 @@ async def validate_cube( # pylint: disable=too-many-locals message=("Metrics and dimensions must be part of a common catalog"), ) - # await validate_shared_dimensions( - # session, - # metric_nodes, - # dimension_names, - # ) return metrics, metric_nodes, list(dimension_nodes.values()), dimensions, catalog From 8c93e958b01ae0898b638790b9e9167eb7b89275 Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Mon, 9 Dec 2024 21:04:58 -0800 Subject: [PATCH 5/9] Remove print --- datajunction-server/datajunction_server/construction/build_v2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/datajunction-server/datajunction_server/construction/build_v2.py b/datajunction-server/datajunction_server/construction/build_v2.py index 4e55c3f9b..b02b2932d 100644 --- a/datajunction-server/datajunction_server/construction/build_v2.py +++ b/datajunction-server/datajunction_server/construction/build_v2.py @@ -1283,7 +1283,6 @@ async def dimension_join_path( col.dimension and f"{col.dimension.name}.{col.dimension_column}" == dimension ): - print("matched", col.dimension.name, col.dimension_column) return join_path await refresh_if_needed( From 43a1b980b23c19552f89eafb3a636b1c5ea62baf Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Mon, 9 Dec 2024 23:13:05 -0800 Subject: [PATCH 6/9] Add test and fix issues with handling reference dim links --- .../datajunction_server/api/helpers.py | 1 - .../datajunction_server/api/nodes.py | 1 + .../construction/build_v2.py | 12 +++ .../database/queryrequest.py | 6 +- .../tests/api/dimension_links_test.py | 74 +++++++++++++++++++ datajunction-server/tests/examples.py | 10 +++ 6 files changed, 98 insertions(+), 6 deletions(-) diff --git a/datajunction-server/datajunction_server/api/helpers.py b/datajunction-server/datajunction_server/api/helpers.py index 19fd2f500..747659f14 100644 --- a/datajunction-server/datajunction_server/api/helpers.py +++ b/datajunction-server/datajunction_server/api/helpers.py @@ -22,7 +22,6 @@ build_metric_nodes, get_default_criteria, rename_columns, - validate_shared_dimensions, ) from datajunction_server.construction.dj_query import build_dj_query from datajunction_server.database.attributetype import AttributeType diff --git a/datajunction-server/datajunction_server/api/nodes.py b/datajunction-server/datajunction_server/api/nodes.py index 8cbc773a6..d9e9386d2 100644 --- a/datajunction-server/datajunction_server/api/nodes.py +++ b/datajunction-server/datajunction_server/api/nodes.py @@ -971,6 +971,7 @@ async def add_reference_dimension_link( ), ) await session.commit() + await session.refresh(target_column) return JSONResponse( status_code=201, content={ diff --git a/datajunction-server/datajunction_server/construction/build_v2.py b/datajunction-server/datajunction_server/construction/build_v2.py index b02b2932d..e209c14b8 100644 --- a/datajunction-server/datajunction_server/construction/build_v2.py +++ b/datajunction-server/datajunction_server/construction/build_v2.py @@ -1420,7 +1420,19 @@ def build_dimension_attribute( if dimension_attr.name in link.foreign_keys_reversed else None ) + reference_links = { + col.name: f"{col.dimension.name}.{col.dimension_column}" + for col in link.dimension.current.columns + if col.dimension + } for col in node_query.select.projection: + if reference_links.get(col.alias_or_name.name) == full_column_name: # type: ignore + return ast.Column( + name=ast.Name(col.alias_or_name.name), # type: ignore + alias=ast.Name(alias) if alias else None, + _table=node_query, + _type=col.type, # type: ignore + ) if col.alias_or_name.name == dimension_attr.column_name or ( # type: ignore foreign_key_column_name and col.alias_or_name.identifier() == foreign_key_column_name # type: ignore diff --git a/datajunction-server/datajunction_server/database/queryrequest.py b/datajunction-server/datajunction_server/database/queryrequest.py index 92cbd68fb..5d2b7d12f 100644 --- a/datajunction-server/datajunction_server/database/queryrequest.py +++ b/datajunction-server/datajunction_server/database/queryrequest.py @@ -23,11 +23,7 @@ from datajunction_server.database.node import Node, NodeRevision from datajunction_server.enum import StrEnum from datajunction_server.errors import DJInvalidInputException -from datajunction_server.sql.dag import ( - get_dimensions, - get_shared_dimensions, - get_upstream_nodes, -) +from datajunction_server.sql.dag import get_upstream_nodes from datajunction_server.sql.parsing import ast from datajunction_server.sql.parsing.backends.antlr4 import parse from datajunction_server.typing import UTCDatetime diff --git a/datajunction-server/tests/api/dimension_links_test.py b/datajunction-server/tests/api/dimension_links_test.py index bff6db519..ce2172305 100644 --- a/datajunction-server/tests/api/dimension_links_test.py +++ b/datajunction-server/tests/api/dimension_links_test.py @@ -101,6 +101,27 @@ async def _link_events_to_users_without_role() -> Response: return _link_events_to_users_without_role +@pytest.fixture +def reference_link_users_date( + dimensions_link_client: AsyncClient, # pylint: disable=redefined-outer-name +): + """ + Create a reference link between users and date + """ + + async def _reference_link_users_date() -> Response: + response = await dimensions_link_client.post( + "/nodes/default.users/columns/snapshot_date/link", + params={ + "dimension_node": "default.date", + "dimension_column": "dateint", + }, + ) + return response + + return _reference_link_users_date + + @pytest.fixture def link_events_to_users_with_role_direct( dimensions_link_client: AsyncClient, # pylint: disable=redefined-outer-name @@ -964,6 +985,59 @@ async def test_measures_sql_with_reference_dimension_links( assert response_data[0]["errors"] == [] +@pytest.mark.asyncio +async def test_measures_sql_with_ref_link_on_dim_node( + dimensions_link_client: AsyncClient, # pylint: disable=redefined-outer-name + link_events_to_users_without_role, # pylint: disable=redefined-outer-name + reference_link_users_date, # pylint: disable=redefined-outer-name +): + """ + Verify that measures SQL can be retrieved for dimension attributes that come from a + reference dimension link from one dim node to another dim node. + """ + await link_events_to_users_without_role() + await reference_link_users_date() + + response = await dimensions_link_client.get( + "/sql/measures/v2", + params={ + "metrics": ["default.elapsed_secs"], + "dimensions": [ + "default.date.dateint", + ], + }, + ) + response_data = response.json() + expected_sql = """ + WITH default_DOT_events AS ( + SELECT + default_DOT_events_table.user_id, + default_DOT_events_table.event_start_date, + default_DOT_events_table.event_end_date, + default_DOT_events_table.elapsed_secs, + default_DOT_events_table.user_registration_country + FROM examples.events AS default_DOT_events_table + ), + default_DOT_users AS ( + SELECT + default_DOT_users_table.user_id, + default_DOT_users_table.snapshot_date, + default_DOT_users_table.registration_country, + default_DOT_users_table.residence_country, + default_DOT_users_table.account_type + FROM examples.users AS default_DOT_users_table + ) + SELECT + default_DOT_events.elapsed_secs default_DOT_events_DOT_elapsed_secs, + default_DOT_users.snapshot_date default_DOT_date_DOT_dateint + FROM default_DOT_events + LEFT JOIN default_DOT_users + ON default_DOT_events.user_id = default_DOT_users.user_id + AND default_DOT_events.event_start_date = default_DOT_users.snapshot_date + """ + assert str(parse(response_data[0]["sql"])) == str(parse(expected_sql)) + + @pytest.mark.asyncio async def test_dimension_link_cross_join( dimensions_link_client: AsyncClient, # pylint: disable=redefined-outer-name diff --git a/datajunction-server/tests/examples.py b/datajunction-server/tests/examples.py index cac6caa5c..0fa709a06 100644 --- a/datajunction-server/tests/examples.py +++ b/datajunction-server/tests/examples.py @@ -2258,6 +2258,16 @@ "primary_key": ["country_code"], }, ), + ( + "/nodes/dimension/", + { + "description": "Date dimension", + "query": """SELECT 1 AS dateint""", + "mode": "published", + "name": "default.date", + "primary_key": ["dateint"], + }, + ), ( "/nodes/metric/", { From 9a0464261fe48b3db679de635cea4d82175736d1 Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Fri, 13 Dec 2024 08:13:05 -0800 Subject: [PATCH 7/9] Add reference link detection to dimensions dag --- .../datajunction_server/api/helpers.py | 6 +++++ .../construction/build_v2.py | 27 ++++++++++++++----- .../database/queryrequest.py | 25 ++++++++++++++++- .../datajunction_server/sql/dag.py | 6 ++--- 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/datajunction-server/datajunction_server/api/helpers.py b/datajunction-server/datajunction_server/api/helpers.py index 747659f14..55ce37eca 100644 --- a/datajunction-server/datajunction_server/api/helpers.py +++ b/datajunction-server/datajunction_server/api/helpers.py @@ -22,6 +22,7 @@ build_metric_nodes, get_default_criteria, rename_columns, + validate_shared_dimensions, ) from datajunction_server.construction.dj_query import build_dj_query from datajunction_server.database.attributetype import AttributeType @@ -497,6 +498,11 @@ async def validate_cube( # pylint: disable=too-many-locals message=("Metrics and dimensions must be part of a common catalog"), ) + await validate_shared_dimensions( + session, + metric_nodes, + dimension_names, + ) return metrics, metric_nodes, list(dimension_nodes.values()), dimensions, catalog diff --git a/datajunction-server/datajunction_server/construction/build_v2.py b/datajunction-server/datajunction_server/construction/build_v2.py index e209c14b8..b6e44295c 100644 --- a/datajunction-server/datajunction_server/construction/build_v2.py +++ b/datajunction-server/datajunction_server/construction/build_v2.py @@ -1279,12 +1279,27 @@ async def dimension_join_path( # Check the reference links on this dimension node await refresh_if_needed(session, current_link.dimension.current, ["columns"]) for col in current_link.dimension.current.columns: - if ( - col.dimension - and f"{col.dimension.name}.{col.dimension_column}" == dimension - ): - return join_path - + if col.dimension: + if f"{col.dimension.name}.{col.dimension_column}" == dimension: + return join_path + await refresh_if_needed(session, col.dimension, ["current"]) + await refresh_if_needed( + session, + col.dimension.current, + ["dimension_links"], + ) + for link in col.dimension.current.dimension_links: + if ( + f"{col.dimension.name}.{col.dimension_column}" + in link.foreign_keys + ): + if ( + link.foreign_keys[ + f"{col.dimension.name}.{col.dimension_column}" + ] + == dimension + ): + return join_path await refresh_if_needed( session, current_link.dimension.current, diff --git a/datajunction-server/datajunction_server/database/queryrequest.py b/datajunction-server/datajunction_server/database/queryrequest.py index 5d2b7d12f..745daee4a 100644 --- a/datajunction-server/datajunction_server/database/queryrequest.py +++ b/datajunction-server/datajunction_server/database/queryrequest.py @@ -23,7 +23,11 @@ from datajunction_server.database.node import Node, NodeRevision from datajunction_server.enum import StrEnum from datajunction_server.errors import DJInvalidInputException -from datajunction_server.sql.dag import get_upstream_nodes +from datajunction_server.sql.dag import ( + get_dimensions, + get_shared_dimensions, + get_upstream_nodes, +) from datajunction_server.sql.parsing import ast from datajunction_server.sql.parsing.backends.antlr4 import parse from datajunction_server.typing import UTCDatetime @@ -304,6 +308,25 @@ async def to_versioned_query_request( # pylint: disable=too-many-locals message="At least one metric is required", http_status_code=HTTPStatus.UNPROCESSABLE_ENTITY, ) + node_columns = [] + if len(nodes_objs) == 1: + node_columns = [col.name for col in nodes_objs[0].current.columns] # type: ignore + available_dimensions = { + dim.name + for dim in ( + await get_dimensions(session, nodes_objs[0]) # type: ignore + if len(nodes_objs) == 1 + else await get_shared_dimensions(session, nodes_objs) # type: ignore + ) + }.union(set(node_columns)) + invalid_dimensions = sorted( + list(set(dimensions).difference(available_dimensions)), + ) + if dimensions and invalid_dimensions: + raise DJInvalidInputException( + f"{', '.join(invalid_dimensions)} are not available " + f"dimensions on {', '.join(nodes)}", + ) dimension_nodes = [ await Node.get_by_name(session, ".".join(dim.split(".")[:-1]), options=[]) diff --git a/datajunction-server/datajunction_server/sql/dag.py b/datajunction-server/datajunction_server/sql/dag.py index 095b91613..a08f172f7 100644 --- a/datajunction-server/datajunction_server/sql/dag.py +++ b/datajunction-server/datajunction_server/sql/dag.py @@ -352,13 +352,13 @@ async def get_dimensions_dag( # pylint: disable=too-many-locals ) .join( graph_branches, - (current_rev.id == graph_branches.c.node_revision_id) - & (is_(graph_branches.c.dimension_column, None)), + (current_rev.id == graph_branches.c.node_revision_id), + # & (is_(graph_branches.c.dimension_column, None)), ) .join( next_node, (next_node.id == graph_branches.c.dimension_id) - & (is_(graph_branches.c.dimension_column, None)) + # & (is_(graph_branches.c.dimension_column, None)) & (is_(next_node.deactivated_at, None)), ) .join( From 4b5245dad890718054078f9710fab16900023bde Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Fri, 13 Dec 2024 08:17:07 -0800 Subject: [PATCH 8/9] Add comments --- .../datajunction_server/construction/build_v2.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/datajunction-server/datajunction_server/construction/build_v2.py b/datajunction-server/datajunction_server/construction/build_v2.py index b6e44295c..83dbde6ea 100644 --- a/datajunction-server/datajunction_server/construction/build_v2.py +++ b/datajunction-server/datajunction_server/construction/build_v2.py @@ -1280,8 +1280,10 @@ async def dimension_join_path( await refresh_if_needed(session, current_link.dimension.current, ["columns"]) for col in current_link.dimension.current.columns: if col.dimension: + # Check if it matches the reference link dimension attribute if f"{col.dimension.name}.{col.dimension_column}" == dimension: return join_path + # Check if it matches any of the reference link dimension's linked attributes await refresh_if_needed(session, col.dimension, ["current"]) await refresh_if_needed( session, @@ -1290,16 +1292,11 @@ async def dimension_join_path( ) for link in col.dimension.current.dimension_links: if ( - f"{col.dimension.name}.{col.dimension_column}" - in link.foreign_keys + link.foreign_keys.get(f"{col.dimension.name}.{col.dimension_column}") + == dimension ): - if ( - link.foreign_keys[ - f"{col.dimension.name}.{col.dimension_column}" - ] - == dimension - ): - return join_path + return join_path + await refresh_if_needed( session, current_link.dimension.current, From b1b6fb49a549a58ad94f6e2ed0d63550f8707db6 Mon Sep 17 00:00:00 2001 From: Yian Shang Date: Fri, 13 Dec 2024 08:24:26 -0800 Subject: [PATCH 9/9] Add comments lint --- .../datajunction_server/construction/build_v2.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/datajunction-server/datajunction_server/construction/build_v2.py b/datajunction-server/datajunction_server/construction/build_v2.py index 83dbde6ea..dc8a38fa6 100644 --- a/datajunction-server/datajunction_server/construction/build_v2.py +++ b/datajunction-server/datajunction_server/construction/build_v2.py @@ -1292,7 +1292,9 @@ async def dimension_join_path( ) for link in col.dimension.current.dimension_links: if ( - link.foreign_keys.get(f"{col.dimension.name}.{col.dimension_column}") + link.foreign_keys.get( + f"{col.dimension.name}.{col.dimension_column}", + ) == dimension ): return join_path