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 2019/11/19 01:30:46 UTC

[incubator-superset] branch VIZ-1194 created (now 2f4a647)

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

beto pushed a change to branch VIZ-1194
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git.


      at 2f4a647  Make select_star work with SQL Lab views

This branch includes the following new commits:

     new 2f4a647  Make select_star work with SQL Lab views

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-superset] 01/01: Make select_star work with SQL Lab views

Posted by be...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

beto pushed a commit to branch VIZ-1194
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit 2f4a647266f0484d9cfe02762cb9f3677fa554f8
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Mon Nov 18 17:30:33 2019 -0800

    Make select_star work with SQL Lab views
---
 superset/connectors/sqla/models.py |  6 +++++-
 superset/db_engine_specs/base.py   | 21 +++++++++++++--------
 superset/db_engine_specs/hive.py   |  2 ++
 superset/db_engine_specs/presto.py |  2 ++
 superset/models/core.py            |  2 ++
 5 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index c1ab44e..93b1f44 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -530,7 +530,11 @@ class SqlaTable(Model, BaseDatasource):
         # show_cols and latest_partition set to false to avoid
         # the expensive cost of inspecting the DB
         return self.database.select_star(
-            self.table_name, schema=self.schema, show_cols=False, latest_partition=False
+            self.table_name,
+            sql=self.sql,
+            schema=self.schema,
+            show_cols=False,
+            latest_partition=False,
         )
 
     def get_col(self, col_name: str) -> Optional[Column]:
diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py
index 3f17503..dd2842f 100644
--- a/superset/db_engine_specs/base.py
+++ b/superset/db_engine_specs/base.py
@@ -618,6 +618,7 @@ class BaseEngineSpec:  # pylint: disable=too-many-public-methods
         database,
         table_name: str,
         engine: Engine,
+        sql: Optional[str] = None,
         schema: Optional[str] = None,
         limit: int = 100,
         show_cols: bool = False,
@@ -630,6 +631,7 @@ class BaseEngineSpec:  # pylint: disable=too-many-public-methods
 
         :param database: Database instance
         :param table_name: Table name
+        :param sql: SQL defining a subselect
         :param engine: SqlALchemy Engine instance
         :param schema: Schema
         :param limit: limit to impose on query
@@ -639,20 +641,23 @@ class BaseEngineSpec:  # pylint: disable=too-many-public-methods
         :param cols: Columns to include in query
         :return: SQL query
         """
-        fields = "*"
-        cols = cols or []
-        if (show_cols or latest_partition) and not cols:
-            cols = database.get_columns(table_name, schema)
-
-        if show_cols:
-            fields = cls._get_fields(cols)
         quote = engine.dialect.identifier_preparer.quote
         if schema:
             full_table_name = quote(schema) + "." + quote(table_name)
         else:
             full_table_name = quote(table_name)
 
-        qry = select(fields).select_from(text(full_table_name))
+        if sql is not None:
+            subselect = f"(\n{sql}\n) AS {quote(table_name)}"
+            qry = select("*").select_from(text(subselect))
+        else:
+            fields = "*"
+            cols = cols or []
+            if (show_cols or latest_partition) and not cols:
+                cols = database.get_columns(table_name, schema)
+            if show_cols:
+                fields = cls._get_fields(cols)
+            qry = select(fields).select_from(text(full_table_name))
 
         if limit:
             qry = qry.limit(limit)
diff --git a/superset/db_engine_specs/hive.py b/superset/db_engine_specs/hive.py
index 650f625..dbbfa97 100644
--- a/superset/db_engine_specs/hive.py
+++ b/superset/db_engine_specs/hive.py
@@ -354,6 +354,7 @@ class HiveEngineSpec(PrestoEngineSpec):
         database,
         table_name: str,
         engine: Engine,
+        sql: Optional[str] = None,
         schema: str = None,
         limit: int = 100,
         show_cols: bool = False,
@@ -367,6 +368,7 @@ class HiveEngineSpec(PrestoEngineSpec):
             database,
             table_name,
             engine,
+            sql,
             schema,
             limit,
             show_cols,
diff --git a/superset/db_engine_specs/presto.py b/superset/db_engine_specs/presto.py
index 9f91969..661fe35 100644
--- a/superset/db_engine_specs/presto.py
+++ b/superset/db_engine_specs/presto.py
@@ -409,6 +409,7 @@ class PrestoEngineSpec(BaseEngineSpec):
         database,
         table_name: str,
         engine: Engine,
+        sql: Optional[str] = None,
         schema: str = None,
         limit: int = 100,
         show_cols: bool = False,
@@ -432,6 +433,7 @@ class PrestoEngineSpec(BaseEngineSpec):
             database,
             table_name,
             engine,
+            sql,
             schema,
             limit,
             show_cols,
diff --git a/superset/models/core.py b/superset/models/core.py
index ccc909a..d378248 100755
--- a/superset/models/core.py
+++ b/superset/models/core.py
@@ -1006,6 +1006,7 @@ class Database(Model, AuditMixinNullable, ImportMixin):
     def select_star(
         self,
         table_name: str,
+        sql: Optional[str] = None,
         schema: Optional[str] = None,
         limit: int = 100,
         show_cols: bool = False,
@@ -1020,6 +1021,7 @@ class Database(Model, AuditMixinNullable, ImportMixin):
         return self.db_engine_spec.select_star(
             self,
             table_name,
+            sql=sql,
             schema=schema,
             engine=eng,
             limit=limit,