[select-star] Adding optional schema to view (#6051)

This commit is contained in:
John Bodley 2018-10-08 10:32:40 -07:00 committed by GitHub
parent 9dcf8e101a
commit 1ee08fc216
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 9 deletions

View File

@ -32,7 +32,7 @@ from flask_babel import lazy_gettext as _
import pandas import pandas
from past.builtins import basestring from past.builtins import basestring
import sqlalchemy as sqla import sqlalchemy as sqla
from sqlalchemy import select from sqlalchemy import Column, select
from sqlalchemy.engine import create_engine from sqlalchemy.engine import create_engine
from sqlalchemy.engine.url import make_url from sqlalchemy.engine.url import make_url
from sqlalchemy.sql import quoted_name, text from sqlalchemy.sql import quoted_name, text
@ -852,6 +852,20 @@ class PrestoEngineSpec(BaseEngineSpec):
""").format(**locals()) """).format(**locals())
return sql return sql
@classmethod
def where_latest_partition(
cls, table_name, schema, database, qry, columns=None):
try:
col_name, value = cls.latest_partition(
table_name, schema, database, show_first=True)
except Exception:
# table is not partitioned
return False
for c in columns:
if c.get('name') == col_name:
return qry.where(Column(col_name) == value)
return False
@classmethod @classmethod
def _latest_partition_from_df(cls, df): def _latest_partition_from_df(cls, df):
recs = df.to_records(index=False) recs = df.to_records(index=False)
@ -1180,7 +1194,7 @@ class HiveEngineSpec(PrestoEngineSpec):
cls, table_name, schema, database, qry, columns=None): cls, table_name, schema, database, qry, columns=None):
try: try:
col_name, value = cls.latest_partition( col_name, value = cls.latest_partition(
table_name, schema, database) table_name, schema, database, show_first=True)
except Exception: except Exception:
# table is not partitioned # table is not partitioned
return False return False

View File

@ -1 +0,0 @@
{{ content |safe }}

View File

@ -2332,7 +2332,7 @@ class Superset(BaseSupersetView):
'columns': payload_columns, 'columns': payload_columns,
'selectStar': mydb.select_star( 'selectStar': mydb.select_star(
table_name, schema=schema, show_cols=True, indent=True, table_name, schema=schema, show_cols=True, indent=True,
cols=columns, latest_partition=False), cols=columns, latest_partition=True),
'primaryKey': primary_key, 'primaryKey': primary_key,
'foreignKeys': foreign_keys, 'foreignKeys': foreign_keys,
'indexes': keys, 'indexes': keys,
@ -2350,14 +2350,19 @@ class Superset(BaseSupersetView):
return json_success(json.dumps(payload)) return json_success(json.dumps(payload))
@has_access @has_access
@expose('/select_star/<database_id>/<table_name>/') @expose('/select_star/<database_id>/<table_name>')
@expose('/select_star/<database_id>/<table_name>/<schema>')
@log_this @log_this
def select_star(self, database_id, table_name): def select_star(self, database_id, table_name, schema=None):
mydb = db.session.query( mydb = db.session.query(
models.Database).filter_by(id=database_id).first() models.Database).filter_by(id=database_id).first()
return self.render_template( return json_success(
'superset/ajah.html', mydb.select_star(
content=mydb.select_star(table_name, show_cols=True), table_name,
schema,
latest_partition=True,
show_cols=True,
),
) )
@expose('/theme/') @expose('/theme/')

View File

@ -727,6 +727,11 @@ class CoreTests(SupersetTestCase):
.format(db_id=dbobj.id)) .format(db_id=dbobj.id))
assert data == ['this_schema_is_allowed_too'] assert data == ['this_schema_is_allowed_too']
def test_select_star(self):
self.login(username='admin')
resp = self.get_resp('/superset/select_star/1/birth_names')
self.assertIn('gender', resp)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()