You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by hu...@apache.org on 2021/05/14 17:07:23 UTC

[superset] 01/01: save types and update api

This is an automated email from the ASF dual-hosted git repository.

hugh pushed a commit to branch hugh/add-parameters-api
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 182eb3cf1d60adfd0e41814b1ceda0187b1c4dd2
Author: hughhhh <hu...@gmail.com>
AuthorDate: Fri May 14 13:04:06 2021 -0400

    save types and update api
---
 .../src/views/CRUD/data/database/types.ts              | 11 +++++++++++
 superset/databases/api.py                              |  1 +
 superset/models/core.py                                | 18 +++++++++++++++---
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/superset-frontend/src/views/CRUD/data/database/types.ts b/superset-frontend/src/views/CRUD/data/database/types.ts
index d0e6f51..04a5fd9 100644
--- a/superset-frontend/src/views/CRUD/data/database/types.ts
+++ b/superset-frontend/src/views/CRUD/data/database/types.ts
@@ -21,6 +21,16 @@ type DatabaseUser = {
   last_name: string;
 };
 
+type DatabaseParameters = {
+  database: string;
+  engine: string;
+  host: string;
+  password?: string;
+  port: number;
+  query: Object;
+  username: string;
+};
+
 export type DatabaseObject = {
   // Connection + general
   id?: number;
@@ -30,6 +40,7 @@ export type DatabaseObject = {
   created_by?: null | DatabaseUser;
   changed_on_delta_humanized?: string;
   changed_on?: string;
+  parameters?: DatabaseParameters;
 
   // Performance
   cache_timeout?: string;
diff --git a/superset/databases/api.py b/superset/databases/api.py
index 5b795a8..30ece99 100644
--- a/superset/databases/api.py
+++ b/superset/databases/api.py
@@ -107,6 +107,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
         "allow_ctas",
         "allow_cvas",
         "allow_dml",
+        "parameters",
         "force_ctas_schema",
         "allow_multi_schema_metadata_fetch",
         "impersonate_user",
diff --git a/superset/models/core.py b/superset/models/core.py
index 5424728..c9efd79 100755
--- a/superset/models/core.py
+++ b/superset/models/core.py
@@ -54,7 +54,7 @@ from sqlalchemy.schema import UniqueConstraint
 from sqlalchemy.sql import expression, Select
 
 from superset import app, db_engine_specs, is_feature_enabled
-from superset.db_engine_specs.base import TimeGrain
+from superset.db_engine_specs.base import BasicParametersMixin, TimeGrain
 from superset.extensions import cache_manager, encrypted_field_factory, security_manager
 from superset.models.helpers import AuditMixinNullable, ImportExportMixin
 from superset.models.tags import FavStarUpdater
@@ -212,6 +212,7 @@ class Database(
             "allows_cost_estimate": self.allows_cost_estimate,
             "allows_virtual_table_explore": self.allows_virtual_table_explore,
             "explore_database_id": self.explore_database_id,
+            "parameters": self.parameters,
         }
 
     @property
@@ -223,6 +224,17 @@ class Database(
         return make_url(self.sqlalchemy_uri_decrypted)
 
     @property
+    def parameters(self) -> Optional[Dict[str, Any]]:
+        # Build parameters if db_engine_spec is a subclass of BasicParametersMixin
+        parameters = {"engine": self.backend}
+
+        if issubclass(self.db_engine_spec, BasicParametersMixin):
+            uri = make_url(self.sqlalchemy_uri_decrypted)
+            return {**parameters, **self.db_engine_spec.get_parameters_from_uri(uri)}
+
+        return parameters
+
+    @property
     def backend(self) -> str:
         sqlalchemy_url = make_url(self.sqlalchemy_uri_decrypted)
         return sqlalchemy_url.get_backend_name()  # pylint: disable=no-member
@@ -568,10 +580,10 @@ class Database(
 
     @property
     def db_engine_spec(self) -> Type[db_engine_specs.BaseEngineSpec]:
-        return self.get_db_engine_spec_for_backend(self.backend)
+        engines = db_engine_specs.get_engine_specs()
+        return engines.get(self.backend, db_engine_specs.BaseEngineSpec)
 
     @classmethod
-    @utils.memoized
     def get_db_engine_spec_for_backend(
         cls, backend: str
     ) -> Type[db_engine_specs.BaseEngineSpec]: