From c302622c18ee70c373ff415943f08c92357a3b0c Mon Sep 17 00:00:00 2001 From: khamitovdr Date: Mon, 22 Dec 2025 21:01:45 +0300 Subject: [PATCH 1/5] patch compile_ignore_nulls --- .../dl_connector_trino/core/connector.py | 1 + .../dl_connector_trino/core/vendor_patches.py | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 lib/dl_connector_trino/dl_connector_trino/core/vendor_patches.py diff --git a/lib/dl_connector_trino/dl_connector_trino/core/connector.py b/lib/dl_connector_trino/dl_connector_trino/core/connector.py index aa4d9fbe6b..6c11620ca7 100644 --- a/lib/dl_connector_trino/dl_connector_trino/core/connector.py +++ b/lib/dl_connector_trino/dl_connector_trino/core/connector.py @@ -8,6 +8,7 @@ from dl_core.data_source_spec.sql import StandardSchemaSQLDataSourceSpec from dl_core.us_manager.storage_schemas.data_source_spec_base import SchemaSQLDataSourceSpecStorageSchema +from dl_connector_trino.core import vendor_patches # noqa: F401 # BI-6846 from dl_connector_trino.core.adapters import TrinoDefaultAdapter from dl_connector_trino.core.connection_executors import TrinoConnExecutor from dl_connector_trino.core.constants import ( diff --git a/lib/dl_connector_trino/dl_connector_trino/core/vendor_patches.py b/lib/dl_connector_trino/dl_connector_trino/core/vendor_patches.py new file mode 100644 index 0000000000..c60d40b871 --- /dev/null +++ b/lib/dl_connector_trino/dl_connector_trino/core/vendor_patches.py @@ -0,0 +1,21 @@ +from typing import Any + +from sqlalchemy.ext.compiler import compiles +from sqlalchemy.sql.compiler import SQLCompiler +from trino.sqlalchemy.compiler import TrinoSQLCompiler + + +@compiles(TrinoSQLCompiler.FirstValue) +@compiles(TrinoSQLCompiler.LastValue) +@compiles(TrinoSQLCompiler.NthValue) +@compiles(TrinoSQLCompiler.Lead) +@compiles(TrinoSQLCompiler.Lag) +def compile_ignore_nulls( + element: TrinoSQLCompiler.GenericIgnoreNulls, + compiler: SQLCompiler, + **kwargs: Any, +) -> str: + compiled = f"{element.name}({compiler.process(element.clauses, **kwargs)})" + if element.ignore_nulls: + compiled += " IGNORE NULLS" + return compiled From 244fcb5935a571a02d7062d7ca2cfff83e182d21 Mon Sep 17 00:00:00 2001 From: khamitovdr Date: Thu, 25 Dec 2025 13:45:34 +0500 Subject: [PATCH 2/5] add test --- .../connector/complex_queries.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/dl_api_lib_testing/dl_api_lib_testing/connector/complex_queries.py b/lib/dl_api_lib_testing/dl_api_lib_testing/connector/complex_queries.py index 6a6e60e3f0..b00df793ee 100644 --- a/lib/dl_api_lib_testing/dl_api_lib_testing/connector/complex_queries.py +++ b/lib/dl_api_lib_testing/dl_api_lib_testing/connector/complex_queries.py @@ -603,6 +603,30 @@ def test_window_functions( # RSUM = previous RSUM value + value of current arg assert pytest.approx(float(data_rows[i][9])) == float(data_rows[i - 1][9]) + float(data_rows[i][2]) + @for_features(feature_window_functions) + def test_correct_window_function_handler_registration( + self, + control_api: SyncHttpDatasetApiV1, + data_api: SyncHttpDataApiV2, + saved_dataset: Dataset, + ) -> None: + ds = add_formulas_to_dataset( + api_v1=control_api, + dataset=saved_dataset, + formulas={ + "BI-6846": "FIRST(ROUND(COUNT(1)))", + }, + ) + result_resp = data_api.get_result( + dataset=ds, + fields=[ds.find_field(title="BI-6846")], + fail_ok=True, + ) + assert result_resp.status_code == HTTPStatus.OK, result_resp.json + data_rows = get_data_rows(result_resp) + assert len(data_rows) == 1 + assert float(data_rows[0][0]) == 1 + class DefaultBasicNativeFunctionTestSuite( RegulatedTestCase, DataApiTestBase, DatasetTestBase, DbServiceFixtureTextClass From fcaa845fdbba5b70d1e0d1c57338005633286ea2 Mon Sep 17 00:00:00 2001 From: khamitovdr Date: Thu, 25 Dec 2025 14:06:43 +0500 Subject: [PATCH 3/5] refactor test --- .../connector/complex_queries.py | 28 +++---------------- 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/lib/dl_api_lib_testing/dl_api_lib_testing/connector/complex_queries.py b/lib/dl_api_lib_testing/dl_api_lib_testing/connector/complex_queries.py index b00df793ee..96644d2464 100644 --- a/lib/dl_api_lib_testing/dl_api_lib_testing/connector/complex_queries.py +++ b/lib/dl_api_lib_testing/dl_api_lib_testing/connector/complex_queries.py @@ -551,6 +551,7 @@ def test_window_functions( "Date Sales": "SUM([Group Sales] WITHIN [order_date])", "City Sales": "SUM([Group Sales] AMONG [order_date])", "Total RSUM": 'RSUM([Group Sales], "asc" TOTAL)', + "First Round Count": "FIRST(ROUND(COUNT(1)))", }, ) @@ -567,6 +568,7 @@ def test_window_functions( ds.find_field(title="Date Sales"), ds.find_field(title="City Sales"), ds.find_field(title="Total RSUM"), + ds.find_field(title="First Round Count"), ], order_by=[ ds.find_field(title="order_date"), @@ -585,7 +587,7 @@ def test_window_functions( assert {row[3] for row in data_rows}.issubset({str(i) for i in range(1, cnt + 1)}) # There are as many [Unique Rank of Sales] values as there are rows - assert {row[4] for row in data_rows} == ({str(i) for i in range(1, cnt + 1)}) + assert {row[4] for row in data_rows} == {str(i) for i in range(1, cnt + 1)} # [Rank of City Sales for Date] values are not greater than the number of [City] values assert len({row[5] for row in data_rows}) <= len({row[1] for row in data_rows}) @@ -603,29 +605,7 @@ def test_window_functions( # RSUM = previous RSUM value + value of current arg assert pytest.approx(float(data_rows[i][9])) == float(data_rows[i - 1][9]) + float(data_rows[i][2]) - @for_features(feature_window_functions) - def test_correct_window_function_handler_registration( - self, - control_api: SyncHttpDatasetApiV1, - data_api: SyncHttpDataApiV2, - saved_dataset: Dataset, - ) -> None: - ds = add_formulas_to_dataset( - api_v1=control_api, - dataset=saved_dataset, - formulas={ - "BI-6846": "FIRST(ROUND(COUNT(1)))", - }, - ) - result_resp = data_api.get_result( - dataset=ds, - fields=[ds.find_field(title="BI-6846")], - fail_ok=True, - ) - assert result_resp.status_code == HTTPStatus.OK, result_resp.json - data_rows = get_data_rows(result_resp) - assert len(data_rows) == 1 - assert float(data_rows[0][0]) == 1 + assert all(float(row[10]) == 1 for row in data_rows) class DefaultBasicNativeFunctionTestSuite( From 74dba359a0cb2b8b9239bd3594a16ebccad22b7e Mon Sep 17 00:00:00 2001 From: khamitovdr Date: Thu, 25 Dec 2025 14:58:07 +0500 Subject: [PATCH 4/5] fix trino version --- metapkg/poetry.lock | 3 ++- metapkg/pyproject.toml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/metapkg/poetry.lock b/metapkg/poetry.lock index 77343cd223..308cccc703 100644 --- a/metapkg/poetry.lock +++ b/metapkg/poetry.lock @@ -6979,6 +6979,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -9426,4 +9427,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "86cedfaef2e0514d48710078ebed3cae755e3b63a336e24ef3a57791e24f81ba" +content-hash = "b64d2bde7486ad6217fe030ab9281355b5f3ebc97f00ba3d6bed738132c717bd" diff --git a/metapkg/pyproject.toml b/metapkg/pyproject.toml index 4c02276db4..8c73ff7659 100644 --- a/metapkg/pyproject.toml +++ b/metapkg/pyproject.toml @@ -83,6 +83,7 @@ sqlalchemy = "==1.4.46, <2.0" sqlalchemy-bigquery = "==1.9.0" tabulate = "==0.9.0" tornado = "==6.4.2" +trino = {extras = ["sqlalchemy"], version = "==0.331.0"} typeguard = "==4.1.5" typing-extensions = "==4.15.0" ujson = "==1.35" From 21067f17ce234adb57f81e04233ad8eaef919751 Mon Sep 17 00:00:00 2001 From: khamitovdr Date: Thu, 25 Dec 2025 15:19:09 +0500 Subject: [PATCH 5/5] move patch to package root --- lib/dl_connector_trino/dl_connector_trino/__init__.py | 1 + lib/dl_connector_trino/dl_connector_trino/core/connector.py | 1 - .../dl_connector_trino/{core => }/vendor_patches.py | 2 ++ 3 files changed, 3 insertions(+), 1 deletion(-) rename lib/dl_connector_trino/dl_connector_trino/{core => }/vendor_patches.py (86%) diff --git a/lib/dl_connector_trino/dl_connector_trino/__init__.py b/lib/dl_connector_trino/dl_connector_trino/__init__.py index e69de29bb2..7339b6693d 100644 --- a/lib/dl_connector_trino/dl_connector_trino/__init__.py +++ b/lib/dl_connector_trino/dl_connector_trino/__init__.py @@ -0,0 +1 @@ +from dl_connector_trino import vendor_patches # noqa: F401 diff --git a/lib/dl_connector_trino/dl_connector_trino/core/connector.py b/lib/dl_connector_trino/dl_connector_trino/core/connector.py index 6c11620ca7..aa4d9fbe6b 100644 --- a/lib/dl_connector_trino/dl_connector_trino/core/connector.py +++ b/lib/dl_connector_trino/dl_connector_trino/core/connector.py @@ -8,7 +8,6 @@ from dl_core.data_source_spec.sql import StandardSchemaSQLDataSourceSpec from dl_core.us_manager.storage_schemas.data_source_spec_base import SchemaSQLDataSourceSpecStorageSchema -from dl_connector_trino.core import vendor_patches # noqa: F401 # BI-6846 from dl_connector_trino.core.adapters import TrinoDefaultAdapter from dl_connector_trino.core.connection_executors import TrinoConnExecutor from dl_connector_trino.core.constants import ( diff --git a/lib/dl_connector_trino/dl_connector_trino/core/vendor_patches.py b/lib/dl_connector_trino/dl_connector_trino/vendor_patches.py similarity index 86% rename from lib/dl_connector_trino/dl_connector_trino/core/vendor_patches.py rename to lib/dl_connector_trino/dl_connector_trino/vendor_patches.py index c60d40b871..8735b11f2e 100644 --- a/lib/dl_connector_trino/dl_connector_trino/core/vendor_patches.py +++ b/lib/dl_connector_trino/dl_connector_trino/vendor_patches.py @@ -5,6 +5,8 @@ from trino.sqlalchemy.compiler import TrinoSQLCompiler +# This is a temporary patch to fix https://github.com/trinodb/trino-python-client/pull/586 +# BI-6846 @compiles(TrinoSQLCompiler.FirstValue) @compiles(TrinoSQLCompiler.LastValue) @compiles(TrinoSQLCompiler.NthValue)