You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2026/06/07 16:16:34 UTC
(superset) 02/05: Pass configuration
This is an automated email from the ASF dual-hosted git repository.
betodealmeida pushed a commit to branch semantic-layer-db-engine-spec
in repository https://gitbox.apache.org/repos/asf/superset.git
commit 3fb7c26b662a5c195aa492bafeee6a608041fd6d
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Tue May 19 16:34:57 2026 -0400
Pass configuration
---
superset/db_engine_specs/semantic_api.py | 26 ++++++++++++
.../db_engine_specs/test_semantic_api.py | 46 ++++++++++++++++++++++
2 files changed, 72 insertions(+)
diff --git a/superset/db_engine_specs/semantic_api.py b/superset/db_engine_specs/semantic_api.py
index da53c923125..d9e95d584c4 100644
--- a/superset/db_engine_specs/semantic_api.py
+++ b/superset/db_engine_specs/semantic_api.py
@@ -24,9 +24,11 @@ from typing import Any, TYPE_CHECKING
from superset.db_engine_specs.base import MetricType
from superset.db_engine_specs.shillelagh import ShillelaghEngineSpec
+from superset.utils import json
if TYPE_CHECKING:
from sqlalchemy.engine.reflection import Inspector
+ from sqlalchemy.engine.url import URL
from superset.models.core import Database
from superset.sql.parse import Table
@@ -58,6 +60,30 @@ class SemanticAPIEngineSpec(ShillelaghEngineSpec):
"semanticapi://<host>[:port]/<view_name>?secure=<true|false>"
)
+ @classmethod
+ def adjust_engine_params(
+ cls,
+ uri: URL,
+ connect_args: dict[str, Any],
+ catalog: str | None = None,
+ schema: str | None = None,
+ ) -> tuple[URL, dict[str, Any]]:
+ """
+ Fold ``additional_configuration`` from the database's ``extra`` field
+ (placed by the user under ``engine_params.connect_args``) into the URL
+ query string, so the dialect can pick it up.
+ """
+ uri, connect_args = super().adjust_engine_params(
+ uri, connect_args, catalog, schema
+ )
+ if (config := connect_args.pop("additional_configuration", None)) is not None:
+ query = dict(uri.query)
+ query["additional_configuration"] = (
+ config if isinstance(config, str) else json.dumps(config)
+ )
+ uri = uri.set(query=query)
+ return uri, connect_args
+
@classmethod
def select_star(cls, *args: Any, **kwargs: Any) -> str:
"""
diff --git a/tests/unit_tests/db_engine_specs/test_semantic_api.py b/tests/unit_tests/db_engine_specs/test_semantic_api.py
index b965cc0d500..de80da2d459 100644
--- a/tests/unit_tests/db_engine_specs/test_semantic_api.py
+++ b/tests/unit_tests/db_engine_specs/test_semantic_api.py
@@ -20,6 +20,10 @@
from typing import Any
from unittest.mock import MagicMock
+from sqlalchemy.engine.url import make_url
+
+from superset.utils import json
+
def _columns() -> list[dict[str, Any]]:
return [
@@ -86,6 +90,48 @@ def test_get_columns_filters_metrics() -> None:
assert columns[0]["column_name"] == "region"
+def test_adjust_engine_params_folds_extra_into_url() -> None:
+ """
+ ``additional_configuration`` from ``connect_args`` ends up on the URL query.
+ """
+ from superset.db_engine_specs.semantic_api import SemanticAPIEngineSpec
+
+ uri, connect_args = SemanticAPIEngineSpec.adjust_engine_params(
+ make_url("sqlite://"),
+ {"additional_configuration": {"workspace": "acme"}, "other": 1},
+ )
+ assert "additional_configuration" not in connect_args
+ assert connect_args["other"] == 1
+ assert json.loads(uri.query["additional_configuration"]) == {"workspace": "acme"}
+
+
+def test_adjust_engine_params_string_passthrough() -> None:
+ """
+ A pre-serialised string config is forwarded verbatim.
+ """
+ from superset.db_engine_specs.semantic_api import SemanticAPIEngineSpec
+
+ uri, _ = SemanticAPIEngineSpec.adjust_engine_params(
+ make_url("sqlite://"),
+ {"additional_configuration": '{"workspace":"acme"}'},
+ )
+ assert uri.query["additional_configuration"] == '{"workspace":"acme"}'
+
+
+def test_adjust_engine_params_no_extra() -> None:
+ """
+ Without ``additional_configuration`` the URL is untouched.
+ """
+ from superset.db_engine_specs.semantic_api import SemanticAPIEngineSpec
+
+ uri, connect_args = SemanticAPIEngineSpec.adjust_engine_params(
+ make_url("sqlite://"),
+ {"other": 1},
+ )
+ assert uri.query == {}
+ assert connect_args == {"other": 1}
+
+
def test_get_metrics_extracts_computed() -> None:
"""
Computed columns become Superset metric definitions.