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 <[email protected]> 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,
