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.